概述
在Dagger 2官方文档中,有这么一句话“A fast dependency injector for Android and Java.”,翻译过来的意思就是:适用于Android和Java的快速依赖注入。
这里主要是了解Dagger 2,对依赖注入不多叙述。不理解依赖注入的,可以参考以下博客:
集成
主要分为2种情况
- Gradle插件在2.3以下
- Gradle插件在2.3以上
gradle2.3以下
1:在根gradle中
dependencies { ... // 其他classpath classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //添加apt命令 }
2:只需要在App的build.gradle下
apply plugin: 'com.neenbedankt.android-apt'//应用apt插件 ... dependencies { ...所需要的依赖 apt 'com.google.dagger:dagger-compiler:2.4' compile 'com.google.dagger:dagger:2.4' compile 'org.glassfish:javax.annotation:10.0-b28' }
gradle2.3以上,只需要在App的build.gradle下,添加依赖
implementation 'com.google.dagger:dagger:2.9' annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
如果gradle2.3以上用apt集成就会报这个错
Error:android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor' configuration instead.
@Inject
在Dagger 2中,使用javax.inject.Inject注解来标识需要依赖注入的构造函数和字段,以满足Dagger构造应用应用程序类的实例并满足其依赖性。
@Inject有两项职责:
- 注解构造函数:通过标记构造函数,告诉Dagger 2可以创建该类的实例(Dagger2通过Inject标记可以在需要这个类实例的时候来找到这个构造函数并把相关实例new出来)从而提供依赖关系。
- 注解依赖变量:通过标记依赖变量,Dagger2提供依赖关系,注入变量
简单玩一玩
public class StudentEntity { public String name; public int age; //注意这里使用了Inject注解 @Inject public StudentEntity() { this.name = "13"; this.age = 12; } }
public class MainActivity extends AppCompatActivity { @Inject StudentEntity studentEntity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); log(studentEntity.name); } public void log(String value){ Log.d("wyz", value); } }
执行发现报空指针异常,很郁闷
原来需要指定一个连接器,创建接口,注意一定要Component注解MainActivityComponent
import dagger.Component; //用这个标注标识是一个连接器 @Component() public interface MainActivityComponent { //这个连接器要注入的对象。这个inject标注的意思是,我后面的参数对象里面有标注为@Inject的属性,这个标注的属性是需要这个连接器注入进来的。 void inject(MainActivity activity);
然后Build下项目,会自动生成一个DaggerMainActivityComponent类,就是在原来定义的连接器接口前面多了一个Dagger
修改MainActivity
public class MainActivity extends AppCompatActivity { @Inject StudentEntity studentEntity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); log(""+studentEntity); DaggerMainActivityComponent.builder().build().inject(this);//注意这里 log(studentEntity.name); } public void log(String value){ Log.d("wyz", value); } }
运行,查看输出
04-18 15:04:56.455 28737-28737/com.example.wenyingzhi.myapplication D/wyz: null 04-18 15:04:56.455 28737-28737/com.example.wenyingzhi.myapplication D/wyz: 13
可以得出,在调用连接的inject方法后对象,才会真正的被创建
集成实用完成,继续升入研究