博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dagger android 学习(一):dagger基础使用
阅读量:7185 次
发布时间:2019-06-29

本文共 3242 字,大约阅读时间需要 10 分钟。

本系列博客主要用于自己学习积累,顺便帮助新手入门,如有问题,多多包涵。更详细的一些使用可以看看其他更加详细的博客。

添加依赖

implementation 'com.google.dagger:dagger:2.21'annotationProcessor 'com.google.dagger:dagger-compiler:2.21'复制代码

基本注解介绍

@Inject

用来标记构造函数,以及标记实例,这样使用被标记的对象的时候,会自动调用所标记的构造函数来创建对象。

@Module

用于标记提供对象的类,这个类负责提供一些我们需要的对象,比如SharedPreferences是通过构造函数无法直接提供的,这时候就可以通过一个有@Module的类,这个类负责提供内容

@Provides

Module标记了提供对象的类,而Provides则标记了这个类里面提供对象的方法,例如:

@Modulepublic class ABParamModule {    A a;    B b;    public ABParamModule(A a, B b) {        this.a = a;        this.b = b;    }    @Provides    public A provideA2() {        return a;    }    @Provides    public B provideB2() {        return b;    }    @Provides    public C provideC() {        return new C(a,b);    }}复制代码

@Component

Component用于标记接口,这个接口把提供依赖的类,和使用依赖的类串联起来

@Scope、@Singleton

用于标记类,在同时被标记的类的范围里,对象创建回是单例的

基本使用方式

Bean类:

public class A {    @Inject    public A(){    }    public void someThingA(){        Log.e("DAGGER", "someThingA");    }}public class B {    @Inject    public B(){    }    public void someThingB(){        Log.e("DAGGER", "someThingB");    }}public class C {    private A a;    private B b;    @Inject    public C(A a, B b) {        this.a = a;        this.b = b;    }    public void doSomethingC(){        a.someThingA();        b.someThingB();    }}@Singletonpublic class UserInfo {    @Inject    public UserInfo(){    }    private String userName;    private String age;    private int id;    public int getId() {        return id;    }    public String getAge() {        return age;    }    public String getUserName() {        return userName;    }    public void setAge(String age) {        this.age = age;    }    public void setId(int id) {        this.id = id;    }    public void setUserName(String userName) {        this.userName = userName;    }}复制代码

Module类:

@Modulepublic class ABParamModule {    A a;    B b;    public ABParamModule(A a, B b) {        this.a = a;        this.b = b;    }    @Provides    public A provideA2() {        return a;    }    @Provides    public B provideB2() {        return b;    }    @Provides    public C provideC() {        return new C(a,b);    }}复制代码

Component类:

@Singleton@Componentpublic interface MyAppComponent {    void inject(MainActivity activity);}复制代码

Activity使用:

public class MainActivity extends AppCompatActivity {    @Inject    A a;    @Inject    C c;    @Inject    UserInfo userInfo;    @Inject    UserInfo userInfo2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        DaggerMyAppComponent.builder().build().inject(this);        a.someThingA();        c.doSomethingC();        userInfo.setAge("111");        Log.e("DAGGER", userInfo.toString());        Log.e("DAGGER", userInfo2.toString());    }}复制代码

打印结果: 因为UserInfo被Singleton标记了,所以这是一个单例。这样最简单的一个dagger2使用就完成了。

9-04-19 17:37:42.986 23362-23362/? E/DAGGER: someThingA2019-04-19 17:37:42.986 23362-23362/? E/DAGGER: someThingA2019-04-19 17:37:42.986 23362-23362/? E/DAGGER: someThingB2019-04-19 17:37:42.986 23362-23362/? E/DAGGER: com.xiaoqi.daggerandroid.UserInfo@9c4fd372019-04-19 17:37:42.986 23362-23362/? E/DAGGER: com.xiaoqi.daggerandroid.UserInfo@9c4fd37复制代码

demo地址:查看项目中的

转载地址:http://jjfkm.baihongyu.com/

你可能感兴趣的文章
oracle 跨库访问
查看>>
Stanford parser学习:LexicalizedParser类分析
查看>>
【mysql】在mysql中更新字段的部分值,更新某个字符串字段的部分内容
查看>>
android WebView onJsAler onJsC…
查看>>
Java之谜 —— 来自Neal Gafter的演讲
查看>>
js压缩反压缩
查看>>
jdbc.properties 包含多种数据库驱动链接的版本。
查看>>
mac 安装mysql
查看>>
Event Managers
查看>>
14-python-函数
查看>>
Android HandlerThread详解
查看>>
兼职开发悟出的点点滴滴
查看>>
ConCurrentHashMap(基于jdk1.8源码)(转载来源https://segmentfault.com/a/1190000014380257)...
查看>>
总结一些知识点(附链接) 四
查看>>
笔试题①
查看>>
js 对象
查看>>
JavaScript 闭包
查看>>
Redis进阶学习笔记
查看>>
汉诺塔问题
查看>>
thinkphp路径替换
查看>>