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 ...
随机推荐
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- Castle Core 4.0.0 alpha001发布
时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...
- 关于全局ID,雪花(snowflake)算法的说明
上次简单的说一下:http://www.cnblogs.com/dunitian/p/6041745.html#uid C#版本的国外朋友已经封装了,大家可以去看看:https://github.co ...
- Win.ini和注册表的读取写入
最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...
- pt-online-schema-change中update触发器的bug
pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...
- AJAX实现登录界面
使用php跳转界面和AJAX都可实现登录界面的跳转的登录失败对的提醒.但是,php跳转的方式 需要额外加载其他界面,用户体验差.AJAX可实现当前页面只刷新需要的数据,不对当前网页进行 重新加载或者是 ...
- [原] KVM虚拟机网络闪断分析
背景 公司云平台的机器时常会发生网络闪断,通常在10s-100s之间. 异常情况 VM出现问题时,表现出来的情况是外部监控系统无法访问,猜测可能是由于系统假死,OVS链路问题等等.但是在出现网络问题的 ...
- Entity Framework的启动速度优化
最近开发的服务放到IIS上寄宿之后,遇到一些现象,比如刚部署之后,第一次启动很慢:程序放置一会儿,再次请求也会比较慢.比如第一个问题,可以解释为初次请求某一个服务的时候,需要把程序集加载到内存中可能比 ...
- 【从零开始学BPM,Day1】工作流管理平台架构学习
[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第一天课程] Step 1 软件下载:H3 BPM10.0全开 ...
- nginx代理https站点(亲测)
nginx代理https站点(亲测) 首先,我相信大家已经搞定了nginx正常代理http站点的方法,下面重点介绍代理https站点的配置方法,以及注意事项,因为目前大部分站点有转换https的需要所 ...