Dagger2 (一) 入坑篇
为什么是Dagger2
为了更好的了解Dagger2,请先阅读RoboGuice篇了解依赖注入。
官方文档称,依赖注入这种技术已经在存在多年了,为什么Dagger2要造轮子?
Dagger2是第一个全部使用自动生成代码的框架。
框架生成的代码就像我们自己手写的,可以轻易进行调试和测试,并且很容易了解其原理。
一.接入
Dagger2使用了生成代码的方式,这里需要apt的插件。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-beta6'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
而Dagger2的主要包中,方法则特别少,主要是编译时提供。
dependencies {
compile 'com.google.dagger:dagger:2.0.2'
provided 'com.google.dagger:dagger-compiler:2.0.2'
provided 'org.glassfish:javax.annotation:10.0-b28'
}
由此,接入框架便成功了。
二.视图注入
相对于RoboGuice来讲,Dagger2是不支持视图注入的,所以如果选用Dagger2进行对象注入框架的话,可以考虑Dagger2+ButterKnife的配合使用,Dagger2和ButterKnife都没有使用反射机制并且专注于对象或视图的注入。
三.对象注入
Dagger2的对象注入同RoboGuice略有不同,但也是和其他注入框架类似,还是使用之前的例子,下面是一个用来储存用户信息的model。注意Dagger2不会默认使用默认构造方法创建以来,必须手动指定。
public class UserInfo {
private String userId;
private String token;
@Inject
UserInfo(){
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public boolean isLogin(){
return !TextUtils.isEmpty(token);
}
}
当我直接使用Inject这个UserInfo的对象的时候,框架会为我们默认使用构造方法进行初始化。
public class MainActivity extends AppCompatActivity {
@Inject
UserInfo userInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userInfo.setToken("testToken");
userInfo.setUserId("123456");
}
}
四.Module与Component
Dagger2相比于RoboGuice更为灵活,其中Module的定义与RoboGuice相同,主要指提供依赖的模块,而Component则是一个新出现的词。
Component英文原意为组件,但在这里面就是一个注入器,相当于RoboGuice中的RoboInject,是提供依赖及使用依赖之间的桥梁,而Dagger2更为灵活的是,我们可以自定义这个注入器。
废话不多说,上代码。
首先我们定义一个Module,与RoboGuice不同的是,我们只需要加入注解即可,不需要继承自Dagger2的Module类。
这里我们提供了Application和Context的依赖。
@Module
public class ApplicationModule {
private Application application;
public ApplicationModule(Application application) {
this.application = application;
}
@Singleton
@Provides
public Application application() {
return application;
}
@Singleton
@Provides
public Context context() {
return application;
}
}
接下来定义另一个Module,GsonModule。
还是熟悉的标有需要serializeNulls的Gson对象。
@Module
public class GsonModule {
@Provides
public Gson provideGson() {
return new GsonBuilder().
serializeNulls().
create();
}
}
接下来我们定义一个注入器,ApplicationComponent。
定义方法也很简单,注解标有Component,并且可以指定注入器可以注入的模块。
其中inject方法稍后讲解。
@Component(modules = {ApplicationModule.class, GsonModule.class})
public interface ApplicationComponent {
void inject(MainActivity activity);
}
好了,写到这,可以放心大胆的编译一下项目了,这时Dagger2会自动生成一些代码,生成的代码是Component前加上Dagger的类,上面的例子生成的就是DaggerApplicationComponent。
如何使用注入呢?我们用以下方法初始化这个注入器ApplicationComponent。
public class DaggerApplication extends Application {
private static ApplicationComponent component;
@Override
public void onCreate() {
super.onCreate();
component = DaggerApplicationComponent.builder().
applicationModule(new ApplicationModule(this)).
gsonModule(new GsonModule()).
build();
}
public static ApplicationComponent Component() {
return component;
}
}
这里只相当于注入器的初始化,并没有真正的注入对象,下面我们在MainActivity中注入对象。
public class MainActivity extends AppCompatActivity {
@Inject
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
component().inject(this);
Log.e(TAG, "onCreate: " + context.getPackageName());
}
public ApplicationComponent component() {
return DaggerApplication.Component();
}
}
运行一下,可以看到打印出了日志,至此,我们第一个较为复杂的注入就完成了。这里注入的其实是Application的Context,并不是Activity的Context,为什么呢,以为我们在Application的Module中定义了Context的Provider。
03-20 22:51:25.046 32476-32476/github.pedroneer.dagger2 E/MainActivity: onCreate: github.pedroneer.dagger2
Dagger2 (一) 入坑篇的更多相关文章
- RoboGuice 3.0 (一)入坑篇
RoboGuice是什么? 一个Android上的依赖注入框架. 依赖注入是什么? 从字面理解,这个框架做了两件事情,第一是去除依赖,第二是注入依赖.简单理解就是,将对象的初始化委托给一个容器控制器, ...
- mybatis(1):入坑篇
依赖 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artif ...
- vuex 入坑篇
Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 这个状态自管理应用包含 ...
- web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】
http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- Vue入坑第一篇
写在前面的话:文章是个人学习过程中的总结,为方便以后回头在学习.文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. 一.前言 本篇作为vue入门的一 ...
- RxJava+RxAndroid+MVP入坑实践(基础篇)
转载请注明出处:http://www.blog.csdn.net/zhyxuexijava/article/details/51597230.com 前段时间看了MVP架构和RxJava,最近也在重构 ...
- webpack入坑之旅(六)配合vue-router实现SPA
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(五)加载vue单文件组件
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
随机推荐
- 谈谈基于OAuth 2.0的第三方认证 [中篇]
虽然我们在<上篇>分别讨论了4种预定义的Authorization Grant类型以及它们各自的适用场景的获取Access Token的方式,我想很多之前没有接触过OAuth 2.0的读者 ...
- 使用Windows Service Wrapper快速创建一个Windows Service
前言 今天介绍一个小工具的使用.我们都知道Windows Service是一种特殊的应用程序,它的好处是可以一直在后台运行,相对来说,比较适合一些需要一直运行同时不需要过多用户干预的应用程序,这一类我 ...
- 把《c++ primer》读薄(4-1 c和c++数组)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. c和c++的数组和指针都属于低级的复合数据类型,比如c++的数组,类似vector容器,指针类似迭代器.低级的数据类型优势是速度 ...
- Oracle Database Server 'TNS Listener'远程数据投毒漏洞(CVE-2012-1675)解决
环境:Windows 2008 R2 + Oracle 10.2.0.3 应用最新bundle patch后,扫描依然报出漏洞 Oracle Database Server 'TNS Listener ...
- 一种C#生成符合Java规则的二进制文件方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.一个项目中的真实问题 实际项目中,本想通过C#制作小工具生成SHP ...
- 跟我学PHP-第一篇:如何安装Zend Studio 以及汉化和基本准备工作
昨天从早上一直弄到晚上10点,可累死我了,网上的资料都是掺次不齐,所以我写一篇系统点的文章来告诉大家怎么做. 1.如果你想进行一套PHP系统的开发,肯定是要有“尚方宝剑”的,这个尚方宝剑就是PHP工具 ...
- 学习php中的正则表达式,PHP正则表达式基础
语法格式:位于定界符"/"之间. 较为常用的元字符包括: “+”, “*”,以及 “?”. 其中, “+”元字符规定其前导字符必须在目标对象中连续出现一次或多次, “*”元字符规定 ...
- Nancy之结合TinyFox调试备忘
最近把一个小项目的数据库换成MongoDB,同时用了MongoRepository 这个开源组件来对数据进行操作. 通过NuGet安装之后,它会自动在web.config文件生成一个连接字符串.但是却 ...
- Android手机总是提示:存储空间不足,解决方法
手机才有16G空间,用一段时间后,总是提示内存不足,各种清理软件都没卵用. 有一个方法立即见效: 1.进入Recovery 2.格式化 SDCard 博客园首席神棍 野生菌野菜干批发 大舍大得 小舍小 ...
- EF配置模型
配置方法 EF里面的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面,还有 ...