文章目录

  • 前言
  • dagger2的引用
  • 简单实用
  • 注解
  • 实际应用
    • 创建物品
    • 打包
    • 快递员
    • 快递接受者
    • 单例

前言

想着把学习的东西记录下来,能更好的巩固;
第一次写csdn,相信会越来越好;

dagger2的引用

(在build.gradle(Moudle)配置)

dependencies {implementation 'com.google.dagger:dagger:2.21'implementation 'com.google.dagger:dagger-android:2.35.1'annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
}

简单实用

注解

  1. @Inject:如果在类上添加此依赖注入,Dagger 就会构造一个这个类的实例并满足他们的依赖。
    通过这个inject注解可以将依赖需求方对象送到Component类中,Component类就会根据依赖需求方对象中声明的依赖关系来注入依赖需求方对象中所需要的对象,注意:inject方法的参数不能用父类来接收,@Inject注解的字段不能是private和protected的。

  2. @Module:编写Module类时要在该类上声明@Module以表明该类是Module类,这样Dagger2才能识别,Modules 类里面的方法专门提供依赖,如返回你需要依赖的对象实例。

  3. @Provide:在 modules 中我们定义的方法就用@Provide注解,作用是声明Module类中哪些方法是用来提供依赖对象的,当Component类需要依赖对象时,他就会根据返回值的类型来在有@Provides注解的方法中选择调用哪个方法。

  4. @Singleton:实现单例

  5. @Component:Components 从根本上来说就是一个注入器,也可以说是@Inject 和@Module 的桥梁,来连接@Inject 和@Module这两个部分。但@Component注解的作用可不是单单用来声明Component类,@Component注解有modules和dependencies两个属性,这两个属性的类型都是Class数组,modules的作用就是声明该Component含有哪几个Module;而dependencies属性则是声明Component类的依赖关系,这个我们之后详细讲解。

实际应用

想象快递员送快递的过程

创建物品

(快递员送的物品,我这里的Student就是物品)

/*** 物品*/
public class Student {Student() {}
}

打包

(创建物品后要进行打包处理)

/*** 包裹*/
@Module
public class StudentModule {@Provides // 暴露我们的物品public Student getStudent() {return new Student();}
}

快递员

(交给快递员来送-依赖)

/*** 快递员*/
@Component(modules = StudentModule.class)
public interface StudentComponent {// 收货地址 用户的地址 注入进来 MainActivityvoid injectMainActivity (MainActivity mainActivity);
}

当然快递员也可以拿多个包裹(这里又加入一个Book包裹)

/*** 快递员**/
@Component(modules = {StudentModule.class, BookModule.class})
// 快递员是不是可以 有多个包裹
public interface StudentComponent {// 收货地址 用户的地址 注入进来 MainActivityvoid injectMainActivity (MainActivity mainActivity);
}

快递接受者

(注入)

public class MainActivity extends AppCompatActivity {private String TAG = "RGY";@InjectStudent student;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);DaggerStudentComponent.create().injectMainActivity(this);//注入Log.d(TAG, "student.hashCode()->" + student.hashCode());}
}

打印结果为:student.hashCode()->78447935

现在我们改一下,多加一个引入

public class MainActivity extends AppCompatActivity {private String TAG = "RGY";@InjectStudent student;//private 会报错@InjectStudent student1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);DaggerStudentComponent.create().injectMainActivity(this);Log.d(TAG, "student.hashCode()->"+student.hashCode() );Log.d(TAG, "student1.hashCode()->"+student.hashCode() );}
}

打印结果:
student.hashCode()->78447935 student1.hashCode()->50241036

会发现hashCode值不同,也就是它不是单例,接下来把它改为单例

单例

只需要在包裹和快递员上加上@Singleton

/*** 包裹*/
@Module
public class StudentModule {@Singleton@Provides // 暴露我们的物品public Student getStudent() {return new Student();}
}
/*** 快递员**/
@Singleton
@Component(modules = {StudentModule.class, BookModule.class})// 快递员是不是可以 有多个包裹
public interface StudentComponent {// 收货地址 用户的地址 注入进来 MainActivityvoid injectMainActivity (MainActivity mainActivity);
}

然后运行打印结果为:

student.hashCode()->85101918
student1.hashCode()->85101918

是不是已经一样了,但是在不同的activity中还是会出现非单例现象

打印结果为:(student2是另一个activity的student引用)

student.hashCode()->194965557
student1.hashCode()->194965557
student2.hashCode()->199463780

解决方法:
在application中注册

public class MyApplication extends Application {private StudentComponent StudentComponent;@Overridepublic void onCreate() {super.onCreate();// 方式二 使用注解处理器生成代码的细节,来完成的StudentComponent= DaggerStudentComponent.builder().studentModule(new StudentModule()).bookModule(new BookModule()).build();}public StudentComponent getStudentComponent(){return StudentComponent;}
}

然后在activity中引用application中的方法,达到统一

        setContentView(R.layout.activity_main);//DaggerStudentComponent.create().injectMainActivity(this);//用MyApplication里面的来进行注入((MyApplication)getApplication()).getStudentComponent().injectMainActivity(this);Log.d(TAG, "student.hashCode()->"+student.hashCode() );Log.d(TAG, "student1.hashCode()->"+student1.hashCode() );Log.d(TAG, "book.hashCode()->"+book.hashCode() );//跳转进入另一个ActivityfindViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startActivity(new Intent(MainActivity.this, MainActivity2.class));}});}
}

打印结果为:

student.hashCode()->194965557
student1.hashCode()->194965557
student2.hashCode()->194965557

这就完成了全局单例

Dagger2简单使用相关推荐

  1. Dagger2集成之环境配置及简单验证

    1.1 配置Dagger2依赖关系 目前android应用的代码管理大多采用Gradle来做,但是在集成Dagger2的过程中,Gradle的版本与Dagger2的依赖方式存在一定的相关性,在网上一些 ...

  2. Dagger2的简单使用

    Dagger2可以更好的帮助我们解耦   不用担心对象或者属性在被生命周期持有导致的未释放 为什么要用Dagger2  举个例子 一般正常调用一个对象的方法是这样 public class A {pu ...

  3. Android -- 带你从源码角度领悟Dagger2入门到放弃(三)

    1, 前面两篇文章我们知道了怎么使用常用的四种标签,现在我们结合我们自己的项目中去简单的使用 在我们搭建项目的时候,一般会创建自己的Application,在里面进行一些初始化如一些第三方的Green ...

  4. Android:dagger2让你爱不释手-基础依赖注入框架篇

    前言 dagger2的大名我想大家都已经很熟了,它是解决Android或java中依赖注入的一个类库(DI类库).当我看到一些开源的项目在使用dagger2时,我也有种匆匆欲动的感觉,因此就立马想一探 ...

  5. Dagger2从入门到熟练

    Dagger2是什么? 是一个依赖注入框架,butterknife也是一个依赖注入框架.不过butterknife,最多叫奶油刀,Dagger2被叫做利器啊,他的主要作用,就是对象的管理,无需显示调用 ...

  6. 深入浅出依赖注入框架Dagger2

    目录 目录 依赖注入 依赖注入实现的三种方式 1. 构造注入 2. 属性注入 3. 接口注入 Dagger2 Dagger2的引入 不带Module的Inject方式(Inject+Component ...

  7. 开发日记-20190512 关键词 Dagger2原理

    我记得我之前在日记里说过要写一篇关于dagger的文章,今天,恰好,网络炸了,有点时间来玩玩这些有意思的事情,表示,终于有机会将这些以前没有填上的大坑填上,自己的内心真的好开心,毕竟拖延症是很多人的习 ...

  8. Dagger2 知识梳理(1) Dagger2 依赖注入的两种方式

    一.资料推荐 最近这几天一直在看有关Dagger2有关的文章,感觉就是这东西真难用.真难懂,数次想要放弃,还好有网上大神的教程帮助,模模糊糊总算能把基本的几个概念跑通了. 这里首先推荐 牛晓伟 的下面 ...

  9. Android注解使用之Dagger2实现项目依赖关系解耦

    Dagger2 一句话:一款快速的注解框架,应用于Android.Java,由 Google 开发和维护,是 Square 的 Dagger 项目的分支. gitHub:https://github. ...

  10. 依赖注入Dagger2详解

    为什么使用依赖注入 首先我们需要知道,人们在很长的一段时间里都是利用控制反转原则规定:应用程序的流程取决于在程序运行时对象图的建立.通过抽象定义的对象交互可以实现这样的动态流程.而使用依赖注入技术或者 ...

最新文章

  1. CCF推荐系统项目代码解读!
  2. jsp的session介绍 (转)
  3. Objective-C开发编码规范
  4. python日志内容存储到文件里_Python中如何实现将logging日志保存到文件中
  5. 另一种同步软件Unison的使用方法
  6. blog项目中遇到的问题及解决
  7. C#在dataGridView中遍历,寻找相同的数据并定位
  8. Intel 5400平台 芯片组
  9. python 拟牛顿法 求非线性方程_9-非线性优化
  10. 走在网页游戏开发的路上——页游资源管理
  11. Dijkstra(堆优)模板
  12. 标准差(Standard Deviation) 和 标准误差(Standard Error)
  13. 2022 年牛客多校第五场补题记录
  14. 手机视频投屏到电视或投影仪
  15. 2020年,这个算法团队都干了啥?
  16. OLYMP‘ARTS 2023奥艺大会中国推介会在北京盛大举行
  17. 拿到FaceBook注册用户的手机号有多简单?看这篇文章就够了。
  18. 成都软通动力的的OFFER
  19. 云之讯java短信验证码真小白教程
  20. linux的wine启动软件报错:err:font:add_replace_font not found suitable family L“MS Shell Dlg“

热门文章

  1. 终结者2免费教程_如何在模拟器上玩(匹配的还是手机服)_适用最新客户端
  2. Java里的数组冒泡排序代码
  3. linux hack tool
  4. 最优秀的微信小程序UI组件库
  5. 57 spi电平转换的坑
  6. STC15单片机-RS-485通信
  7. 多体动力学ANCF方法简单介绍
  8. 数据分析与数据处理实例(某银行数据)
  9. Linux——常用工具
  10. 安卓改机技术揭秘(一) 工具篇