Dagger2 是 Google 开源的一款依赖注入框架。它的前身是 square 的 Dagger 1,Dagger 2 在 Android 中有着较为广泛的应用。
Dagger 2 基于 Java 注解,采用 annotationProcessor(注解处理器) 在项目编译时动态生成依赖注入需要的 Java 代码,然后我们在合适的位置手动完成最终的依赖注入
第一步 依赖项 :
implementation 'com.google.dagger:dagger:2.4'
annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
第二步 初步使用:
首先 从最简单方式 @Inject 注解开始
public class CameraN {
private static final String TAG = "CameraN";
public Camera mCamera;
public String name;
@Inject
public CameraN(){
this.mCamera = null;
name= "别去厕所偷吃了";
Log.e(TAG, "CameraN: 初始化 了 CameraN()" );
}
public Camera getmCamera() {
return mCamera;
}
}
@Component()
public interface Compenent {
必须让Component知道需要往哪个类中注入
void init(CameraXActivity cameraXActivity);
}
@Inject
CameraN cameraN;
@Override
protected int layoutId() {
return R.layout.activity_camera_x;
}
@Override
protected void initView() {
DaggerCompenent.create().init(this);
Log.e(TAG, "initView: "+cameraN.name );
}
log.e --> E/CameraXActivity: initView: 别去厕所偷吃了
定义我们所需要的 信息类 @Inject 注解注入 CameraN 的构造函数。
@Inject : 标识可注入的构造函数、方法和字段。可以应用于静态*以及实例成员。
可注射成员可以具有任何访问*修饰符(private、package private、protected、public)。构造函数首先被*注入,然后是字段,然后是方法。超类中的字段和方法*是在子类中的那些字段和方法之前注入的。没有指定同一类中的字段之间和方法之间的*注入顺序。
@Component :注释一个接口或抽象类,要从一组{@linkplain#模块}中为其生成一个完全形成的、注入依赖项的*实现。生成的类*的类型名称以{@code@Component}注释,并以{@code Dagger}开头。例如,{@code@Component接口MyComponent{…}}将生成一个名为*{@code DaggerMyComponent}的实现。
会在 build 文件夹 生成编译类 DaggerCompenent.class 供我们在DaggerCompenent.create().init(this); 注册
Log.e(TAG, "initView: "+cameraN.name ); 便可以调用 对象方法。
到了这里 初步使用 便结束了。
进一步 使用 直接上代码 (自己悟)
增加
@Module 包裹对象
@Singleton 创建一次
@Component(modules = {目标类 })
@Provides 提供调用
//包裹 内的物品 CameraNModle.class,CameraNModle2.class 等等
@Component(modules = {CameraNModle.class})
public interface Compenent {
void init(CameraXActivity cameraXActivity);
}
@Module //包裹
@Singleton //
public class CameraNModle {
@Provides
public CameraN getCameraUser(){
return new CameraN();
}
}