dagger2系列之生成类实例
上一节的最后,我讲到一次注入生成类实例的生成步骤。先来回顾一下:
1 Module中存在创建方法,则看此创建方法有没有参数
如果有参数,这些参数也是由Component提供的,返回步骤1逐一生成参数类实例,最后再生成最终类实例--ok
如果无参数,则直接由这个方法生成最终类实例
2 Module中没有创建方法,则从构造函数里面找那个用@Inject注解的构造函数
如果该构造函数有参数,则也是返回到步骤1逐一生成参数类实例,最后调用该构造函数生成类实例
如果该构造函数无参数,则直接调用该构造函数生成类实例
本节就是验证这些步骤是否可行!!!无参数在上一节中已经介绍过了,所以此处验证都是带参数的
<一>Module中存在创建方法,有参数
按照上面的步骤,它会先看Component提供的Module有没有提供这个参数,没有的话找这个参数实体类的构造函数生成实例(@inject)。
1 被依赖类和参数的实体类都是由Module创建
NeedProvide3实例
public class NeedProvide3 { public NeedProvide3(Bean3 bean){
} public void printMethod(){
Log.d("Dagger.class","NeedProvide3----printMethod()");
} }
注意这里的构造器没有用@inject注解修饰,因为这个类的实例要由Module提供。
参数Bean3
public class Bean3 {
public Bean3(){
Log.d("Dagger.class","-------bean3");
}
}
注意这里的构造器没有用@inject注解修饰,因为这个类的实例要由Module提供。
提供NeedProvide3实例
@Module
public class ProvideModule31 { @Provides
public NeedProvide3 provideNeedProvide(Bean3 bean){
return new NeedProvide3(bean);
} }
提供参数Bean3
@Module
public class ProvideModule32 { @Provides
public Bean3 provideBean(){
return new Bean3();
} }
桥梁Component
@Component(modules={ProvideModule31.class, ProvideModule32.class})
public interface NeedComponent3 {
void inject(TargetActivity3 activity);
Bean3 getBean();//方法名字随意
}
这里需要提供一个方法,当寻找参数的时候会用到,不写会报错!!!
目标类
public class TargetActivity3 extends AppCompatActivity { @Inject
NeedProvide3 mNeedProvide3; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); DaggerNeedComponent3.builder().build().inject(this);
Log.d("Dagger.class","qian----");
mNeedProvide3.printMethod();
Log.d("Dagger.class","--------hou"); }
}
运行看下打印结果:
2 被依赖类的参数由Module提供,参数由@inject方式创建
这里只有两个类需要改动,这里只贴出这两个类的代码:
参数类:用@inject注解修饰
public class Bean3 {
@Inject
public Bean3(){
Log.d("Dagger.class","-------bean3");
}
}
桥梁Component:删掉了提供Bean3的Module,让Bean3实例由@inject注解创建
@Component(modules={ProvideModule31.class})
public interface NeedComponent3 {
void inject(TargetActivity3 activity);
}
运行的打印结果和上面的是一样的,说明这两种方法都可以的!!!
<二>Module中不创建方法,有参数
1 Module中提供参数,被依赖类通过构造器的@inject方式创建
被依赖类:通过@inject方式创建实例
public class NeedProvide4 {
@Inject
public NeedProvide4(Bean4 bean){
} public void printMethod(){
Log.d("Dagger.class","NeedProvide4----printMethod()");
}
}
参数Bean4:无@inject注解
public class Bean4 {
public Bean4(){
Log.d("Dagger.class","-------bean");
}
}
提供参数:
@Module
public class ProvideModule4 { @Provides
public Bean4 provideBean(){
return new Bean4();
} }
桥梁Component
@Component(modules = ProvideModule4.class)
public interface NeedComponent4 {
void inject(TargetActivity4 activity);
}
运行打印的结果为:
2 被依赖类和参数的实体类都由@inject方式创建
桥梁Component
@Component
public interface NeedComponent4 {
void inject(TargetActivity4 activity);
}
被依赖类和参数都需要在构造器上使用@inject注解修饰。此处就不贴代码了,运行之后的打印结果和上面的一样。
本篇主要验证开头所讲的步骤中涉及到的那几种方法是否行的通。最后总结如下:
1 参数和被依赖类的实例化有两种方法,Module和@inject方式。
2 当创建依赖类需要参数的时候,参数的实例化有两种方法
1>Module提供:
如果依赖类和参数都是Module提供(不由同一个Module提供),那么需要在Component中声明一个方法显示提供,方法名字任意。
2>@inject方式:
dagger2系列之生成类实例的更多相关文章
- Java JUC之Atomic系列12大类实例讲解和原理分解
Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21 0个评论 作者:xieyuooo 收藏 我要投稿 在java6以后我们不但接触到了Loc ...
- JUC之Atomic系列12大类实例讲解和原理分解
在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的AB ...
- Dagger2系列之使用方法
本系列只讲使用方法和使用中遇到的问题,如果还对dagger2还不了解的童鞋儿可以参考文章: http://www.jianshu.com/p/cd2c1c9f68d4 http://www.jians ...
- XAML实例教程系列 - XAML传递参数到值转换类实例 八
Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - XAML传递参数到值转换类实例 2012-06-28 05:25 by jv9, 508 阅读, 0 评论, 收藏, 编辑 继上 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ( ...
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...
- Struts2 源码分析——Result类实例
本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容 ...
- 转:c++类实例在内存中的分配
转自:http://blog.csdn.net/alexwei2009/article/details/6157926 c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由 ...
- XML之自动生成类,添加,修改,删除类的属性
1. class ClassHelperDemo { public static void Main() { #region 演示一:动态生成类. //生成一个类t. Type t = ClassHe ...
随机推荐
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- nodejs之get/post请求的几种方式
最近一段时间在学习前端向服务器发送数据和请求数据,下面总结了一下向服务器发送请求用get和post的几种不同请求方式: 1.用form表单的方法:(1)get方法 前端代码: <form act ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter
中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现.所谓 ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
- [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)
前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...
- 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验
准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...
- 页面布局class常见命名规范
头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:left rig ...
- ES6之变量常量字符串数值
ECMAScript 6 是 JavaScript 语言的最新一代标准,当前标准已于 2015 年 6 月正式发布,故又称 ECMAScript 2015. ES6对数据类型进行了一些扩展 在js中使 ...
- js 基础篇(点击事件轮播图的实现)
轮播图在以后的应用中还是比较常见的,不需要多少行代码就能实现.但是在只掌握了js基础知识的情况下,怎么来用较少的而且逻辑又简单的方法来实现呢?下面来分析下几种不同的做法: 1.利用位移的方法来实现 首 ...
- GSD_WeiXin(高仿微信)应用源码
高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...