赞
踩
在这篇文章中你会看到什么:
@Inject
是什么@Component
是什么@Inject
和 @Component
如何协同作战。在介绍他们之前我们来看一段我们在项目中看到的类似的代码:
public class ClassA{
ClassB classB = new ClassB();
ClassC classC = new ClassC("xxx",xxx);
.....
}
如你所见,当我们在目标类初始化其他类时,这些工作几乎都是重复性的操作,我们可不可以用一种方案来替代这种操作,这时我们所使用的 Dagger2
的成员 @Inject
和 @Component
就跳出来了,大声喊道:我可以~~~
@Inject
为了实现以上功能,我们需要完成以下步骤:
@Inject (Annotation)
来标注目标类中依赖类的实例对象@Inject (Annotation)
来标注所依赖的其他类的 构造函数
。目标类 ClassA
public class ClassA{
@Inject
ClassB classB;// 使用 @Inject 标注依赖类的实例对象
@Inject
ClassC classC;
}
依赖类 ClassB
public class ClassB{
@Inject // 使用 @Inject 标注依赖类的构造函数
public ClassB(){}
....
}
依赖类 ClassC
public class ClassC{
@Inject
public ClassC(XXX xxx, XXX xxx){
...
}
}
注意:在使用 @Inject
标注类的构造函数,只能标注一个构造函数,无法标注多个。
虽然 目标类 和 依赖类 都使用了@Inject
来标记,但是他们并没有产生实在意义上的联系,这时 @Component
就充当了媒婆的角色。
作用:将 Module 中产生的依赖对象自动注入到需要依赖实例的 Container中
从上面的描述中我们可以看到 Component 充当了 Module 和 Container 的媒介。
很明显 @Component
是一个注解,那么被 @Component
标记的类理所当然的被称为 注解类,并且该类必须是接口或抽象类。那么下面我们看一下这个媒婆是怎么开展工作的:
1.@Component
标注类的实例必须存在目标类中
2.Component
会查找目标类中用 @Inject
注解标注的属性
3. 查找到相应的属性后,会接着查找该属性对应的用 @Inject
标注的构造函数(这时候就发生联系了)
4. 剩下的工作就是初始化该属性的实例并把实例进行赋值
具体过程如下图:
@Inject
标注构造函数public class User { private String mName = "jack chen"; private int mAge = 40; @Inject public User() { } public String getName() { return mName; } public void setName(String mName) { this.mName = mName; } public int getAge() { return mAge; } public void setAge(int mAge) { this.mAge = mAge; } }
@Component
注解该类@Component
public interface UserComponent {
void inject(MainActivity mMainActivity);
}
@Inject
注解相关实例变量public class MainActivity extends AppCompatActivity { @Inject User mUser; private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 这一句代码是完成依赖注入的关键 DaggerUserComponent.builder().build().inject(this); Log.e(TAG,"name : " + mUser.getName() + " age :" + mUser.getAge()); mUser.setAge(50); mUser.setName("blur"); Log.e(TAG,"name2 : " + mUser.getName() + " age2 :" + mUser.getAge()); } }
name : jack chen age :40
name2 : blur age2 :50
到此为止,我们已经实现了基本的基于 Dagger2
的依赖注入。下面我们把过程再梳理一遍:
@Inject
注解标注目标类中依赖类的实例对象@Inject
注解标注依赖类的构造函数Component
(注入器)的 injectXXX
(Object)方法开始注入(injectXXX
方法名字是官方推荐的名字,以inject开始)Component
就像 目标类
和自己的 依赖类
的媒介,把目标类依赖的实例注入到目标类中,来初始化目标类中的依赖实例变量。
Dagger 详解
这就是Dagger2
Dagger2 入门实践
Android:dagger2让你爱不释手-终结篇
最简单的Dagger2入门教程
Android:dagger2让你爱不释手-基础依赖注入框架篇
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。