首先我们添加依赖
compile"com.google.dagger:dagger:2.14.1"
annotationProcessor"com.google.dagger:dagger-compiler:2.14.1"
前言
dagger2是一个依赖注入的框架,我们可以通过dagger2辅助我们注入一个类,而不是new一个,对于依赖注入相关的东西,不懂的可以自行百度,他的好处就是可以降低耦合度,由于我写的项目少,目前体会不到,还在学习中。
描述dagger2的图片
这是一个比较简单的描述图,我们来大体看一下dagger2的工作过程,打个比喻,A容器的水转移到B容器,怎么转移,我们可以通过一个注射器,吸取A容器的水,然后将其注入到B容器。而图中的module对象就是A容器中的水,他是要注入的类的提供者,component类是注射器,他将module提供的类注射到需要被注入的地方,需要注意的是,component是自动生成的,我们只需要写好component接口,然后重新编译一下程序,就会自动生成这个类,这个类的命名规则是Dagger+之前定义的接口名
现在我们来大概说一下最基本的三个注解
@Inject注解
@Inject注解用于标注需要依赖注入的类或者类的构造函数,如果构造函数没有参数,可以直接注入,如果有参数需要@Module提供
@Module注解
用于标注Module对象,提供依赖注入的类,可以提供第三方类,或者提供需要依赖注入的类的构造函数的参数等
@Component注解
标注该接口是需要生成Component类的接口,rebuild之后,会自动生成,和@Provides配合使用,@Provides用于提供注入的变量,就像之前比喻中的水
举个例子
例1需要注入的类没有参数的情况
新建需要注入的类User
public class User {
String userName;
@Inject //Inject注解
public User(){
this.userName="defaultDagger";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
新建接口MainActivityUse
新建Component接口MainActivityUser
@Component //component注解
public interface MainActivityUser {
//mainActivity作为注入的容器
void inject(MainActivity mainActivity);
}
MainActivity中
public class MainActivity extends AppCompatActivity {
@Inject //注入
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityUser.builder().build().inject(this);
Log.i("msg","没有构造函数的输出"+user.getUserName());
}
}
我们rebuild一下,然后运行程序, 日志打印结果 I/msg: 没有构造函数的输出defaultDagger,可以看到,注入成功了
例2需要注入的类有参数的情况
如果把上述User类改成,其他不需要改动
public class User {
String userName;
@Inject
public User(String userName){//增加了参数
this.userName=userName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
将会出现错误
错误: java.lang.String cannot be provided without an @Inject constructor or from an @Provides-annotated method.
java.lang.String is injected at
com.example.administrator.dragger2andlifecycle.User.(userName)
com.example.administrator.dragger2andlifecycle.User is injected at
com.example.administrator.dragger2andlifecycle.MainActivity.user
com.example.administrator.dragger2andlifecycle.MainActivity is injected at
com.example.administrator.dragger2andlifecycle.MainActivityUser.inject(mainActivity)
因为没有提供userName来注入,所以报错 现在我们来创建一个Module来提供userName进行注入。
新建Module类MainActivityModule
@Module //Module注解,标记他是一个module
public class MainActivityModule {
@Provides //Provides注解,提供注入的类
public String provideUserName(){
return "provideName";
}
}
修改Component接口MainActivityUser
@Component(modules = MainActivityModule.class)//用于标记提供的module
public interface MainActivityUser {
void inject(MainActivity mainActivity);
}
rebuild一下,运行程序,日志打印结果:
I/msg: 有构造函数的输出provideName
以上就是最简单的应用了,下面我在说说其他的注解
移步到查看 https://blog.csdn.net/qq_43676395/article/details/89059544