Android Dragger2快速入门浅析

定Dagger2的基本介绍:
dagger2是一个依赖注入框架,在编译期间自动生成代码,负责依赖对象的创建。

使用Dagger2的好处:
为了进一步解耦和方便测试,我们会使用依赖注入的方式构建对象 (不使用 new 来创建依赖对象)。在mvp中,presenter层会持有view和model层的依赖,依赖注入主要用于解耦,通过依赖注入创建对象,不再使用new来创建对象。

Dagger的常用注解:
@Inject
1.构造器注入(有多个构造器,只能标注其中一个)

2.属性注入(被注入的属性不能用private修饰)

3.方法注入(依赖需要this对象的时刻可以提供安全的this对象)

@Component
Dagger2是通过component来完成依赖注入的,一般定义component通常使用接口定义,用@Component注解。
两种定义方法:
void inject(目标类obj)

Dagger2会从目标类开始查找@Inject注解,自动生成依赖注入的代码,调用inject可完成依赖的注入。

Object getObj();

这种方式一般为其他Component提供依赖。

@Module
@module标记在类的上面
在@Component中指定Module(@Component = obj.class)
具体来说:此注解里面全是方法,用于对外提供对象,自己定义方法,方法上使用@Provides。自定义一个类,以Module结尾,用@Module注解。
@Provodes
@Provodes标记在方法的上面
@Qualifier和@Named
@Qualifier是限定符,而@Named则是基于String的限定符

当我有两个相同的依赖(都继承某一个父类或者都是先某一个接口)可以提供给高层时,那么程序就不知道我们到底要提供哪一个依赖,因为它找到了两个。
这时候我们就可以通过限定符为两个依赖分别打上标记,指定提供某个依赖。

@Qualifier不是直接注解在属性上的,而是用来自定义注解的。

不论是@Qualifier还是@Named必须成对出现,否则报错。

@PerActivity
限定对象的生命周期和Activity一样。一般应用于自定义的Component上。

@Singleton
标记为单例模式,如果在自定义Module中使用了此注解,在自定义的Component上也要使用该注解。

一个简单的DaggerDemo

我用的android studio的版本是3.13版本。
build.app(Module:app)的配置:

compileOnly 'org.glassfish:javax.annotation:10.0-b28'
implementation 'com.google.dagger:dagger:2.12'
annotationProcessor 'com.google.dagger:dagger-compiler:2.12'

首先创建一个实体类User:

public class User {
    public String name;
    public User(){
 
    }
    public User(String name){
        this.name = name;
    }
}

然后创建android MVP模式中的presenter:DaggerPresenter

public class DaggerPresenter {
    DaggerActivity activity;
    User user;
 
    public DaggerPresenter(DaggerActivity activity,User user){
        this.user = user;
        this.activity = activity;
    }
    public void showUserName(){
        activity.showUserName(user.name);
    }
}

创建ActivityModule类

@Module
public class ActivityModule  {
    private DaggerActivity activity;
    public ActivityModule(DaggerActivity activity){
        this.activity = activity;
    }
    @Provides
    public DaggerActivity provideActivity(){
        return  activity;
    }
    @Provides
    public User provideUser(){
        return  new User("user from ActivityModule");
    }
    @Provides
    public DaggerPresenter provideDaggerPresenter(DaggerActivity activity,User user){
        return new DaggerPresenter(activity,user);
    }
}

最后创建DaggerActivity

public class DaggerActivity extends AppCompatActivity {
    private static final String TAG ="DaggerActivity";
    TextView text;
    @Inject
    DaggerPresenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView)findViewById(R.id.text);
        inject();
        presenter.showUserName();
    }
    private void inject(){
        DaggerActivityComponent.builder().activityModule(new ActivityModule(this)).build().inject(this);
    }
    public void showUserName(String name){
        text.setText(name);
    }
}

然后布局文件就是一个TextView,运行成功后界面会显示user from ActivityModule.