一 前言
学习一个工具,首先需要去知道这个工具怎么用然后再去理解这个工具的源码以及原理。
那么dagger2现在有两种注入方法:
1. public class Car{
@inject
public Car(){ //在用这个构造方法的时候就不需要moudule和Compnent,这个构造方法里面如果有参数那么这个参数就需要provides出来
}
}
public class MyActivity extends Activity{
@inject
Car car
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
2. public class Car{}
@Moudule
public calss CarMoudule{
@provides
public Car providesCar(){
return new Car();
}
}
@Compnent(moudules = CarMoudule.class) //这个里面可以添加dependencies属性用来依赖Application里面的compnent
public interface CarCompnent {
void inject(MyActivity activity);
}
public class MyActivity extends Activity{
@inject
Car car
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
上面的这两种方法就是利用dagger2的两种;最常用的方法,一种是通过构造方法去jnject,这种是在build里面去实例化的。
而另一种是通过moudule和compnent联合注入的。
二 Dagger2我的理解
1.在dagger2正常的模式里面有@jnject moudule compnent这个moudule相当于药,而这个compnnet相当于装药的针管,那么这个inject相当于
将这个药(实例化对象)注入体内(类内),这样一个流程就完成了一个通过inject实例化的对象。
2.(这个是给我自己记录的)现在一般简单的对象的创建是可以用第一种创建对象的方式,如果这个对象的创建需要比较复杂的逻辑,或者这样创建对象使得代码不容易理解,这样创建对象的方式就需要用到第二种方式。这样能使代码的可读性更强一点。
3.dagger2的第一种创建对象的方式是在build里面创建的,第二种dagger2是通过自己在moudule里面new出来的。
三 Dagger2 scop相关的问题
1. dependencies这个scop的作用是说明现在这个compnent是集成dependencies对用的compnent的,那么这个compnent对一个的moudule
里面提供的对象可以在全局使用。但是需要全局使用的这个方法必须在Compnent里面暴露出来,比如:
@Singleton
@Component(modules = {AppModule.class, ClientModule.class, FileUploadModule.class})
public interface AppComponent {
Applicationapplication();
IRetrofitManagerretrofitManager();
OkHttpClientokHttpClient();
Retrofitretrofit();
Gsongson();
void inject(Application application);
}
上面代码里面的各个属性是可以用全局使用的。(还是那句话这个还是需要在compnent里面暴露出来的)。
2.关于@Singleton这个的作用是单例的(这个单例不是java意义上的单例,这是说明在这个compnent里面是单例的,如果再出现一个compnent去关联相同的一个moudule那么创建出来的对象将不是那个唯一)
3. 类如actvityscop或者Fagmentscop这两个scop是自己定义的,因为在用 dependencies的时候,这两个scop必须是不同的scop,那么就需要自己定义一个scop,如下:
@Scope
@Documented
@Retention(RUNTIME)
public @interface ActivityScop{
}
这个是这个作用域的固定的写法。记住就ok了。
4.对于@Name等相关的scop自己去查一下资料就ok了。
四 Dagger2实例化的地方
DaggerLifeComponent
.builder()
.carMoudle(new CarMoudle())
.appCompenent(((App)getApplication()).getAppCompnent())
.build()
.inject(this);
这个部分是Dagger2开始的过程,DaggerLifeComponent这个是在build里面生成的,这个是在component和moudule关联的时候在build
里面生成的。最重要的记录的是.carMoudle(new CarMoudle())这个将本地的moudule和dependencies 的appCompenent都启动,这个样这个
Dagger2才是正式的启动了。
五 结束语
这个是我第一篇博客,可能需要修改修改再修改,但是这个是我手工敲的,并且是将我现在的想的都记录的下来,以后在去补充这个dagger2
的源码部分,请大家如果感觉有用就看看,如果感觉没用请转战,谢谢大家,如果嗯那个帮到你们我万分荣幸。
网友评论