本篇是实战文章,从代码的角度分析这两种方式。本文参考自下列文章:

      http://www.jianshu.com/p/1d42d2e6f4a5

      http://www.jianshu.com/p/94d47da32656

  一般在项目中我们需要全局使用app或者其他,这个时候就需要有一个全局的Component作为桥梁,提供给使用方使用。一个Component可以依赖一个或多个Component,并拿到被依赖Component 暴露 出来的实例。

<一>依赖关系

全局提供App实例类、上下文Context

@Module
public class AppModule5 { private App5 app; public AppModule5(App5 app) {
this.app = app;
} @Provides
public App5 provideApp() {
return app;
} @Provides
Context provideApplicationContext() {
return app.getApplicationContext();
}
}

提供 全局提供App实例类、上下文Context桥梁,该Component会被其他Component依赖

@Component(modules = {AppModule5.class})
public interface AppComponent5 {
void inject(App5 app); //因为AppComponent会被dependencies,所以此处Module中提供的内容,我们需要在此处声明一下
App5 getApp();
Context getApplicationContext();
}

  由于AppComponent5会被其他Component依赖,所以此处需要显示地声明AppModule5中提供的东西,此处的方法名任意!!!

App被全局提供

public class App5 extends Application {

    private AppComponent5 mAppComponent5;

    @Override
public void onCreate() {
super.onCreate();
mAppComponent5 = DaggerAppComponent5.builder().appModule5(new AppModule5(this)).build();
mAppComponent5.inject(this);
} public AppComponent5 getAppComponent5(){
return mAppComponent5;
} }

  若Module的构造器需要参数,我们就需要在这里appModule5(new AppModule5()),若Module的构造器中不需要参数,此处可以省略!!!需要通过这种方式将参数传递进去。

提供被依赖类:

@Module
public class ActivityModule5 { @Provides
public DependencyPresenter getDependencyPresenter(App5 app){
return new DependencyPresenter(app);
}
}

桥梁:

@Component(dependencies = AppComponent5.class,modules = ActivityModule5.class)
public interface ActivityComponent {
void inject(TargetActivity5 activity5);
}

  使用了Component的dependencies属性,ActivityModule5提供被依赖类,AppComponent5提供被依赖类的参数(全局提供)。

被依赖类:此处没用@inject修饰构造器

public class DependencyPresenter {

    public DependencyPresenter(App5 app){
Log.d("Dagger.class","DependencyPresenter-----构造器------(app == null)?????:"+(app == null));
} public void printMethod(){
Log.d("Dagger.class","DependencyPresenter-----printMethod()-----");
} }

目标类

public class TargetActivity5 extends AppCompatActivity {

    @Inject
DependencyPresenter mDependencyPresenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); App5 app5 = (App5) this.getApplication(); DaggerActivityComponent.builder().appComponent5(app5.getAppComponent5()).build().inject(this); mDependencyPresenter.printMethod();
}
}

  由于ActivityComponent依赖AppComponent,所以需要在此处添加声明appComponent(app5.getAppComponent)。

  由此得到结论:需要在Component中显示的声明提供 被依赖类 的方法(方法名任意)

    1 同一个Component的两个Module之间,当ModuleA需要ModuleB提供参数,在Component中需要提供获取参数的方法

    2 ComponentA和它所依赖的ComponentB之间,若ComponentA需要ComponentB提供参数,在ComponentB中需要显示声明方法

<二>包含方式(从属方式)@SubComponent

  当我们的Component需要依赖全局的Component提供的实例或者参数的时候,我们上面的实现方式是选择Component的dependencies属性,此时需要在被依赖的Component中有显示的声明。这里介绍另一种方法,包含方式。相比于依赖方式,包含方式不需要在父Component中显示的提供方法,就可以拿到想要的东西。下面看一下代码:

使用@Subcomponent注解标注ActivityModule6,代表它是子Component

@Subcomponent(modules = ActivityModule6.class)
public interface ActivityComponent6 {
void inject(TargetActivity6 activity5);
}

父Component:

@Component(modules = {AppModule6.class})
public interface AppComponent6 {
void inject(App6 app); ActivityComponent6 getSubComponent();
}

  需要在父Component中声明自己的子Component,方法名任意。如果ActivityComponent6中的Module的构造器需要参数,则在此处传递进去,譬如:

    ActivityComponent6 getSubComponent(new ActivityModule6("参数"));

目标类:使用方式上也有区别

public class TargetActivity6 extends AppCompatActivity {

    @Inject
DependencyPresenter6 mDependencyPresenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); App6 app6 = (App6) this.getApplication();
app6.getAppComponent6().getSubComponent().inject(this);
mDependencyPresenter.printMethod();
}
}

  其他类均没有变化。依赖方式、包含方式介绍到此为止~更多的内容请参看上面的链接!!!

dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent的更多相关文章

  1. Spring系列之依赖注入的方式

    一.依赖注入方式 对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象 ...

  2. Spring系列之aAOP AOP是什么?+xml方式实现aop+注解方式实现aop

    Spring系列之aop aop是什么?+xml方式实现aop+注解方式实现aop 什么是AOP? AOP为Aspect Oriented Programming 的缩写,意识为面向切面的编程,是通过 ...

  3. 【Xamarin 挖墙脚系列:IOS 开发界面的3种方式】

    原文:[Xamarin 挖墙脚系列:IOS 开发界面的3种方式] xcode6进行三种基本的界面布局的方法,分别是手写UI,xib和storyboard.手写UI是最早进行UI界面布局的方法,优点是灵 ...

  4. 依赖注入之unity(winform方式)

    依赖注入之unity(winform方式) 要讲unity就必须先了解DI和IOC及DIP,如下链接提供DI和IOC的基础:https://www.cnblogs.com/zlp520/p/12015 ...

  5. 万恶技术系列笔记-jupyter工作路径和源文件打开方式

    万恶技术系列笔记-jupyter工作路径和源文件打开方式   脚本文件,ipynb的正确打开姿势: ipynb不能直接打开,需要复制到工作路径.例如 10_monkeys_model_1.ipynb ...

  6. Java Array数组 遍历 四种方式(包含 Lambda 表达式遍历)

    示例代码如下: package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date ...

  7. Java List集合 遍历 四种方式(包含 Lambda 表达式遍历)

    示例代码如下: package com.miracle.luna.lambda; import java.util.ArrayList; import java.util.List; /** * @A ...

  8. Java Map集合 遍历 五种方式(包含 Lambda 表达式遍历)

    示例代码如下: package com.miracle.luna.lambda; import java.util.HashMap; import java.util.Iterator; import ...

  9. Gradle学习系列之七——依赖管理

    在本系列的上篇文章中,我们讲到了如何使用java Plugin,在本篇文章中,我们将讲到Gradle的依赖管理. 请通过以下方式下载本系列文章的Github示例代码: git clone https: ...

随机推荐

  1. PHP数据类型之间的强制转换

    1.实型数据强制转换为整型数据 $float1=2.7; $int1=(int)$float1; echo var_dump($int1),"<br>"; 输出: in ...

  2. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  3. 120项改进:开源超级爬虫Hawk 2.0 重磅发布!

    沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...

  4. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  5. Velocity笔记--使用Velocity获取动态Web项目名的问题

    以前使用jsp开发的时候,可以通过request很轻松的获取到根项目名,现在换到使用velocity渲染视图,因为已经不依赖servlet,request等一些类的环境,而Web项目的根项目名又不是写 ...

  6. C++随笔:.NET CoreCLR之GC探索(2)

    首先谢谢 @dudu 和 @张善友 这2位大神能订阅我,本来在写这个系列以前,我一直对写一些核心而且底层的知识持怀疑态度,我为什么持怀疑态度呢?因为一般写高层语言的人99%都不会碰底层,其实说句实话, ...

  7. CSS知识总结(七)

    CSS常用样式 5.背景样式 1)背景颜色 background-color : transparent | color 常用值:①英文单词,②十六进制,③RGB或RGBA 另外,还有一种是 渐变色彩 ...

  8. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  9. exp/imp 与 expdp/impdp 区别

    在平常备库和数据库迁移的时候,当遇到大的数据库的时候在用exp的时候往往是需要好几个小时,耗费大量时间.oracle10g以后可以用expdp来导出数据库花费的时间要远小于exp花费的时间,而且文件也 ...

  10. Android Bitmap 和 ByteArray的互相转换

    Android Bitmap 和 ByteArray的互相转换 移动平台图像处理,需要将图像传给native处理,如何传递?将bitmap转换成一个 byte[] 方便传递也方便cpp代码直接处理图像 ...