定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.

Android Dragger2快速入门浅析的更多相关文章

  1. Android开发快速入门(环境配置、Android Studio安装)

    Android是一种激动人心的开源移动平台,它像手机一样无处不在,得到了Google以及其他一些开放手机联盟成员(如三星.HTC.中国移动.Verizon和AT&T等)的支持,因而不能不加以学 ...

  2. Android游戏快速入门(一):基础储备

    智能手机时代已经到来了,手机的性能正在以你我惊讶的速度提升.那么手机游戏也在迅速发展,从简单的平面单机游戏不断的向复杂的3D网络游戏发展.所以,手机游戏的市场肯定也在不断扩张.那么,作为程序猿,我们也 ...

  3. Hello, Android 快速入门

    Hello, Android Android 开发与 Xamarin 简介 在这两节指南中,我们将 (使用 Xamarin Studio或 Visual Studio)建立我们的第一个 Xamarin ...

  4. Realm for Android快速入门教程

    介绍 如果你关注安卓开发的最新趋势,你可能已经听说过Realm.Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库. 相比SQLite,Realm更快并且具有很多现代数据库 ...

  5. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手

    原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...

  6. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  7. c语言快速入门3

    如果你想快速入门计算机,可以参考我的上一篇帖子,先了解一些必备的软知识,然后再来进行语言的快速入门 计算机入门基础知识 c语言快速入门1 c语言快速入门2 3.4.1 字符和字符串 字符:'' 单个  ...

  8. Swift语言快速入门

    Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著   ISBN 978-7-121-24328-8 201 ...

  9. html5快速入门(一)—— html简介

    前言: 1.HTML5的发展非常迅速,可以说已经是前端开发人员的标配,在电商类型的APP中更是运用广泛,这个系列的文章是本人自己整理,尽量将开发中不常用到的剔除,将经常使用的拿出来,使需要的朋友能够真 ...

随机推荐

  1. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 1、两层神经网络的单样本向量化表示与多样本向量化表示

    如上图所示的两层神经网络, 单样本向量化:                                                                                ...

  2. 兼容IE9以下和非IE浏览器的原生js事件绑定函数

    事件绑定函数的demo如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "htt ...

  3. 什么是编程语言,什么是Python解释器

    转自白月黑羽python在线教程:http://www.python3.vip/doc/blog/python/2018071401/ 0基础学Python之1:什么是编程语言,什么是Python解释 ...

  4. Vue笔记:使用 Yarn 管理依赖包

    上年10月份, Facebook 发布了新的 node.js 包管理器 Yarn 用以替代 npm ,它比npm更快.更高效. Yarn VS npm 1.yarn.lock 文件 在 npm 中同样 ...

  5. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  6. spring boot整合双持久层框架jpa、mybatis

    公司之前用的是spring boot + jpa,但由于jpa无法完美的解决某些动态查询问题,就使用的jdbcTemplate 动态封装SQL,由于代码相对复杂,可读性差,现准备再引入mybatis. ...

  7. SpringMVC官方文档阅读

    默认的DispatcherServlet配置 在spring-webmvc-4.3.16.RELEASE.jar/org/springframework/web/servlet/路径下的Dispatc ...

  8. vector向量容器(常用的使用方法总结)

    关于STL中vector容器的学习,编译运行后边看代码,边看执行结果效果更佳,还是想说看别人的代码一百遍,不如自己动手写一遍. vector向量容器不但能像数组一样对元素进行随机访问,还能随时在尾部插 ...

  9. 对类型“DevExpress.Xpf.Grid.GridControl”的构造函数执行符合指定的绑定约束的调用时引发了异常。

    用VS2012 修改别人的WPF代码时碰到这个问题,百度下有人遇到相同问题,不过版本不同,先试下再说. 解决方法:安装Netframework4.5的补丁 地址:http://support.micr ...

  10. 并发编程 —— 自己写一个异步回调 API

    1. 前言 在并发编程中,异步回调的效率不言而喻,在业务开发中,如果由阻塞的任务需要执行,必然要使用异步线程.并且,如果我们想在异步执行之后,根据他的结果执行一些动作. JDK 8 之前的 Futur ...