Dagger是用来做依赖注入的,是一个完全静态的,在编译时进行依赖注入的框架,解决了基于反射带来的开发和性能上的问题,
使用场景:在一个对象里去创建另一个对象的实例,这种行为是产生耦合的常见形式,过多的相互依赖会导致
代码难以维护,很容易碰到修改一个地方其他很多地方也都得修改
在需要依赖的勒种不要通过new来创建依赖而是通过方法提供的参数注入进来,
这样我们需要依赖的类和提供依赖的类就实现了方法分隔开了,
dagger2是一个依赖注入的框架,在编译期间自动生成代码,负责依赖对象的创建,
用dagger2提供依赖有什么好处:为了进一步解耦和方便测试,我们会使用依赖注入的方式构建对象,
不用new来创建对象。在mvp中,presenter层会持有view和model层的依赖,
依赖注入主要用于解耦,通过依赖注入创建对象,不在使用new来创建对象。
依赖注入的目的是,给你提供一个依赖对象
@Inject
ApiService apiService;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//主要两个问题:
//1)自定义Module需要传递上下文怎么办
//2)自定义module中的方法中需要参数对象怎么处理
//Dagger会自动创建这个类,以Dagger开头+UserComponent,编译时注入,按ctrl+F9编译即可
//DaggerUserComponnent.create().inject(this);
//userMagager.register();
//Dagger的关系非常简单,MainActivity中需要对象,那么就在Module中提供对象,而他们之间的桥梁就是componnent
//自定义类Module的构造方法中需要传入一个上下文对象,那么在MainActivity中就需要传递进去
//使用下面的这种方式进行参数传递:this就是上下文
/**
* 模块化开发:自定义module之间相互include compent之间相互依赖
* 通过@Named @Qualifier:区别不同对象的实例
* 同一类可能要创建两个对象,处理不同的业务逻辑
* 通过类型进行注入,根据@Inject标记的变量类型ApiSercice,在Module中寻找返回值
* 为ApiService的方法进行调用,但是如果Module中由多个方法,他们的返回值都为ApiService,那么就需要使用@Named注解用于区别
*/
DaggerUserComponent.builder().userModule( new UserModule(this)).build().inject(this);
// DaggerUserComponent.builder().
// DaggerUserComponent.create().inject(this);
apiService.register();
/**
* Created by admin on 2018/3/16.
* 自定义类用于提供依赖
* 自定义module中的方法要以provide开头
* 通过构造方法传递Context
* 如果自定义module需要传参数,需要在Activity使用build进行
*
* 如果自定义类module中的方法需要一个对象参数,怎么处理,需要一个方法去提供这个对象,
* 1)在类的构造方法上添加@Inject注解
* 2)自己写一个方法去提供参数对象
*/
@Module
public class UserModule {
//在Module中传递上下文对象
private Context mContext;
public UserModule(Context context){
this.mContext = context;
}
@Provides
ApiService provideApiService(){
return new ApiService();
}
@Provides
UserStore provideUserStore(){
return new UserStore();
}
//如果自定义Module中的方法需要对象参数,怎么处理
//1)通过Module中的方法进行提供比如provideUserStoe()
//2)通过类的构造函数进行提供对象,注释掉上面的provideUserStore()方法
//3)代码执行顺序:创建参数对象的方法先执行比如构造
@Provides
UserManager1 provideUserManager(UserStore userStore){
return new UserManager1(userStore);
}
}
import dagger.Component;
/**
* Created by admin on 2018/3/16.
* 连机器,桥梁
*/
@Component(modules = {UserModule.class,HttpModule.class})
public interface UserComponent {
//当前只能写MainActivity不能写Activity要不然会出现空指针
void inject(MainActivity activity);
}