dagger2 依赖注入
前言:
当 mvp + dagger2 + rxjava 三者遇上,架构更加清晰,代码更加灵活,巧妙结合。
依赖注入:是为了解耦,达到高内聚低耦合的目的,保证代码的健壮性、灵活性和可维护性。
public class Computer{
private Cpu cpu;
public Computer(){
cpu= new Cpu();
}
}
Computer类持有了对Cpu实例的引用,称之为Computer类对Cpu类有一个依赖。
依赖注入则是指通过注入的方式实现类与类之间的依赖。
1、构造注入:通过构造函数传参,给依赖的成员变量赋值,因此实现注入。
public class Computer{
private Cpu cpu;
public Computer(Cpu cpu){
this.cpu= cpu;
}
}
2、接口注入:实现事先定义好的接口方法,通过方法传参的方式实现注入。
public interface Injection<T>{
void inject(T t);
}
public class Computer implements Injection<Cpu>{
private Cpu cpu;
public Computer(){
}
public void inject(Cpu cpu){
this.cpu= cpu;
}
}
3、注解注入:使用Java注解,在编译阶段生成代码实现注入或者是在运行阶段通过反射实现注入。
public class Computer{
@Inject
private Cpu cpu;
public Computer(){
}
}
Dagger2是通过Java注解在编译期来实现依赖注入的。
Dagger2的常用注解:
@Inject:
1、用来标记需要依赖的变量,须为它提供依赖;
2、是用来标记构造函数,Dagger2通过@Inject注解可以在需要这个类实例的时候来找到这个构造函数并把相关实例构造出来,以此来为被@Inject标记了的变量提供依赖;
@Module:
用于标注提供依赖的类。当构造函数带有参数,或者是第三方库类时,所须使用的。
@Provides:
用于标注Module所标注的类中的方法,该方法在需要提供依赖时被调用,把预先提供好的对象当做依赖给标注了@Inject的变量赋值;
@Component:
用于标注接口,是依赖需求方和依赖提供方之间的桥梁。被Component标注的接口在编译时会生成该接口的实现类(如果@Component标注的接口为CarComponent,则编译期生成的实现类为DaggerCarComponent),我们通过调用这个实现类的方法完成注入;
@Scope:
用于自定义注解,我能可以通过@Scope自定义的注解来限定注解作用域,实现局部的单例;
@Singleton:
其实就是一个通过@Scope定义的注解,我们一般通过它来实现全局单例。但实际上它并不能提前全局单例,是否能提供全局单例还要取决于对应的Component是否为一个全局对象。
案例一:
没有使用注入时:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
User user = new User();
((TextView) findViewById(R.id.tv_username)).setText("user name:" + user.name);
}
...
}
使用注入时:
设置 build.gradle , 并添加依赖库.
android-apt , 提供 dagger2使用编译生成类 的功能.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
apply plugin: 'com.neenbedankt.android-apt' // 注释处理
dagger2 , 提供 dagger2支持 的功能.
compile 'com.google.dagger:dagger:2.0.2' // dagger2
compile 'com.google.dagger:dagger-compiler:2.0.2' // dagger2
annotation , 提供 java注释解析 的功能.
provided 'javax.annotation:jsr250-api:1.0' // Java标注
配置完成后:
首先定义Module类来生成依赖对象。使用@Provides是用来标注具体提供依赖对象的方法。
@Module
public class DataModule { @Provides
UserModel provideUser() {
return new User();
}
}
定义component:注入器,加上modules = {DataModule.class},是用来告诉Dagger2提供依赖的是DataModule这个类:
@Component(modules = DataModule.class)
public interface ActivityComponent {
void inject(MainActivity activity);
}
最后使用方式:构建时,使用dataModule(new DataModule()),注入器DaggerActivityComponent把DataModule提供的依赖 注入到 MainActivity中,注入,使用
public class MainActivity extends ActionBarActivity {
private ActivityComponent mActivityComponent;
@Inject
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 构建
mActivityComponent = DaggerActivityComponent.builder().dataModule(new DataModule()).build();
// 注入
mActivityComponent.inject(this);
((TextView) findViewById(R.id.tv_username)).setText("user name:" + user.username);
}
...
}
附言:
当复仇者联盟遇上Dagger2、RxJava和Retrofit的巧妙结合
Android 依赖注入: Dagger 2 实例讲解(一)
Dragger 2遇到的坑 Dragger2详解 Dragger2学习最好的资料
dagger2 依赖注入的更多相关文章
- Android——初探Dagger2依赖注入
1,在做项目时,经常需要在一个对象里去创建另一个对象的示例,这种行为是产生耦合的常见形式,对于一个大型项目来说,过多的相互依赖会导致代码难以维护,很容易就会碰到修改一个小需求需要大面积的修改各种代码, ...
- 浅析Dagger2依赖注入实现过程
Dragger2是Android应用开发中一个非常优秀的依赖注入框架.本文主要通过结合Google给出的MVP开发案例todo-mvp-dagger(GitHub连接地址:https://github ...
- 用Dagger2在Android中实现依赖注入
依赖注入这个模式(模式已经用烂了,这里再烂一次)是用来给应用的各部分解耦的.使应用开发更加可扩展,更容易维护.通过本文你会学到如何使用Dagger2来处理依赖. 简介 如果以对象需要另外的一个对象才能 ...
- Android 使用dagger2进行依赖注入(基础篇)
0. 前言 Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用dagger2进行依赖注入.如果你不还不了解依赖注入,请看这一篇. 1. 简单的依赖 ...
- Android项目使用Dagger2进行依赖注入
原文链接:http://code.tutsplus.com/tutorials/dependency-injection-with-dagger-2-on-android–cms-23345 依赖注入 ...
- 依赖注入框架之dagger2
主页: https://github.com/google/dagger 历史 * Dagger1是由Square公司受到Guice(https://github.com/google/guice)启 ...
- [Android]使用Dagger 2进行依赖注入 - Producers(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6234811.html 使用Dagger 2进行依赖注入 - P ...
- [Android]Android MVP&依赖注入&单元测试
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...
- [Android]依赖注入框架google的dagger
分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...
随机推荐
- codeforces-1138 (div2)
想法题是硬伤,面对卡题和卡bug的情况应对能力太差 A.求两个前缀和以及两个后缀和,相邻最小值的最大值. #include<iostream> using namespace std; ; ...
- 【asp.net】asp.net遍历Request的信息
#需求: 在服务端获取从客户端发送过来的所有数据信息: #方案: 1.服务端代码 public void ProcessRequest(HttpContext context) { //打印所有参数信 ...
- spring定时任务详解(@Scheduled注解)
Spring配置文件xmlns加入 xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocati ...
- java BIO/NIO/AIO 学习
一.了解Unix网络编程5种I/O模型 1.1.阻塞式I/O模型 阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误 ...
- 使用Spring-Integration实现http消息转发
目标:接收来自华为云的服务器报警信息,并转发到钉钉的自定义机器人中 使用Spring-Integration不仅节省了很多配置,还增加了可用性. 更多关于Spring-Integration的介绍可参 ...
- JavaScript对象 Object类型基础
前言 JavaScript 对象是整个语言学习的一个难点.本文主要带大家入门学习Object知识 对象定义 javascript的基本数据类型包括undefined.null.boolean.stri ...
- 2017-2018-2 PDE 讨论班
等等. 第一次上课居然忘记怎么让笔记本电脑和投影仪相连了. 有两个接口. 一个在外面, 没用. 一个盖着了, 忘记翻开了.
- idea+maven+ssm搭建boot_crm项目遇到的问题
使用idea+maven+ssm搭建一个boot_crm项目,遇到的问题如下: 1.环境搭建好了,相关配置文件都配置好了,也部署到了tomcat,但是无法启动首页. 通过百度,google找到了,原因 ...
- 面试经验合集-Java后端<一>
面试一:CDKHXJSYJS 时间:2018-12-29 周六 地点:航天科技大厦32楼 一 技术题目 <回忆版> 1.上下转型 2.Java异常:分类.处理.设计 3.二叉排序树 ...
- axios发送post请求,如何提交表单数据?
axios发送post请求,提交表单数据的方式 默认情况下,axios将JavaScript对象序列化为JSON.要以application / x-www-form-urlencoded格式发送数据 ...