标题之所以是Dagger2是因为我没看Dagger^_^,具体Dagger2与Dagger有什么区别请百度这里不再赘述。
使用Dagger2前准备工作
1.配置apt插件
apt插件是用于自动生成代码的,因为Dagger2放弃了反射的方式,而是选择在编译项目时根据注解自动生成相应代码,以提高app性能。
即:在编译项目过程中,apt插件根据注解自动生成实际运行的代码。
1.配置apt插件(在build.gradle(Project:xxx)中添加如下代码)
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
2.添加依赖(在build.gradle(Module:app)中添加如下代码)
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
2.添加Dagger2相关库
添加依赖(在build.gradle(Module:app)中添加如下代码)
dependencies {
...
compile 'com.google.dagger:dagger:2.4'
apt 'com.google.dagger:dagger-compiler:2.4'
//java注解
compile 'org.glassfish:javax.annotation:10.0-b28'
...
}
这样准备工作就做完了,下面就一生产假酒的demo,来理解究竟什么是“依赖注入”。
Demo
1.demo的整体结构
Wine
public class Wine {
private int num = 0 ;
Wine(){
}
Wine(int num){
this.num = num ;
}
public String getWineInfo(){
return "添加"+ num + "份酒" ;
}
}
Water
public class Water {
private int num ;
Water(){
}
Water(int num){
this.num = num ;
}
public String getWater(){
return"添加"+ num + "份水";
}
}
FakeWine
public class FakeWine {
private final Water water;
private final Wine wine ;
@Inject
FakeWine(Wine wine,Water water){
this.wine = wine;
this.water = water ;
}
public String getFakeWineInfo(){
return wine.getWineInfo() + "," + water.getWater() ;
}
}
既然有需要注入的地方,就要为他提供用于被注入的内容,Dagger2中被注入的内容称之为module,如下:
WaterModule
@Module
public class WaterModule {
@Provides
Water provideWater(){
return new Water(7) ;
}
}
WineModule
@Module
public class WineModule {
@Provides
Wine provideWine(){
return new Wine(3) ;
}
}
现在需要注解的点和提供用于注解的内容都有了,但是还不能确定生产什么样的酒(兑水比例不同,就有多个WaterModule 或 WineModule),
所以需要我们将需要将@Inject 和 @Module关联起来,代码如下:
CreateFakeWine
public class CreateFakeWine {
@Component(modules = {WineModule.class,WaterModule.class})
interface GetFakeWine{
FakeWine make() ;
}
public static void main(String args[]){
System.out.println(DaggerCreateFakeWine_GetFakeWine.builder().build().make().getFakeWineInfo());
}
}
总结
上面的代码仅是最简单的“依赖注入”的示范,并未对Dagger2进行深入讲解,好处是能快速理解什么是“依赖注入”;其他Dagger2规范,有空再贴。
“依赖注入”究竟是怎么实现的,你可以看apt生成的代码,有没有“工厂模式”的既视感^_^。所及对Dagger2你可以这样认为:
它是利用注解自动生成“工厂模式”的一个框架,这样就轻松多了。有理解错误的地方希望请留言斧正。