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 ...
随机推荐
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- Syscan360会议胸牌破解揭秘
Syscan360会议胸牌破解揭秘 背景 有幸参加今年11月份的上海Syscan360安全会议,会议期间有一个亮点就是360的独角兽团队设计了一款电子badge(胸牌)供参加人员进行破解尝试,类似于美 ...
- TypeScript Vs2013 下提示Can not compile modules unless '--module' flag is provided
VS在开发TypeScript程序时候,如果import了模块有的时候会有如下提示: 这种情况下,只需要对当前TypeScript项目生成设置为AMD规范即可!
- PHP与API讲解(一)
了解API: 在使用与创建自己的API之前我们需要先了解什么是API! API代表应用程序编程接口,而接口指的是一个特定的服务.一个应用程序或者其他程序的公共模块. 理解SOA(面向服务的架构):SO ...
- 关于Android避免按钮重复点击事件
最近测试人员测试我们的APP的时候,喜欢快速点击某个按钮,出现一个页面出现多次,测试人员能不能禁止这样.我自己点击了几下,确实存在这个问题,也感觉用户体验不太好.于是乎后来我搜了下加一个方法放在我们U ...
- ASP.NET中画图形验证码
context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...
- Atitit.技术管理者要不要自己做开发??
Atitit.技术管理者要不要自己做开发?? 1. 为什么很多管理者不能自己亲自做了1 1.1. 沟通成本多了1 1.2. .组织分散. 1 1.3. 会议多 .协调多 1 1.4. 问题的根源在于我 ...
- IM 去中心化概念模型与架构设计
今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的. 站在这个角度而言,实际上并非所有的业务都能做去中 ...
- ASP.NET Aries DataGrid 配置表头说明文档
DataGrid 配置表头 字段 中文 说明 Field 字段 注意:mg_ 开头的字段为层级表头 Title 列称 OrderNum 序号 显示的顺序(冻结和非冻结列是两个组的序号) Width 列 ...
- 认识ASP.NET 5项目结构和项目文件xproj
ASP.NET 5 在项目结构上做了很大的改变,我们以前熟悉的目录结构与项目文件内容都不太一样了,本篇文章带大家了解 ASP.NET 5 到底跟以前有哪些不一样的地方. 我们先用 Visual Stu ...