dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
本篇是实战文章,从代码的角度分析这两种方式。本文参考自下列文章:
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的更多相关文章
- Spring系列之依赖注入的方式
一.依赖注入方式 对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象 ...
- Spring系列之aAOP AOP是什么?+xml方式实现aop+注解方式实现aop
Spring系列之aop aop是什么?+xml方式实现aop+注解方式实现aop 什么是AOP? AOP为Aspect Oriented Programming 的缩写,意识为面向切面的编程,是通过 ...
- 【Xamarin 挖墙脚系列:IOS 开发界面的3种方式】
原文:[Xamarin 挖墙脚系列:IOS 开发界面的3种方式] xcode6进行三种基本的界面布局的方法,分别是手写UI,xib和storyboard.手写UI是最早进行UI界面布局的方法,优点是灵 ...
- 依赖注入之unity(winform方式)
依赖注入之unity(winform方式) 要讲unity就必须先了解DI和IOC及DIP,如下链接提供DI和IOC的基础:https://www.cnblogs.com/zlp520/p/12015 ...
- 万恶技术系列笔记-jupyter工作路径和源文件打开方式
万恶技术系列笔记-jupyter工作路径和源文件打开方式 脚本文件,ipynb的正确打开姿势: ipynb不能直接打开,需要复制到工作路径.例如 10_monkeys_model_1.ipynb ...
- Java Array数组 遍历 四种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date ...
- Java List集合 遍历 四种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.ArrayList; import java.util.List; /** * @A ...
- Java Map集合 遍历 五种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.HashMap; import java.util.Iterator; import ...
- Gradle学习系列之七——依赖管理
在本系列的上篇文章中,我们讲到了如何使用java Plugin,在本篇文章中,我们将讲到Gradle的依赖管理. 请通过以下方式下载本系列文章的Github示例代码: git clone https: ...
随机推荐
- RecyclerView使用大全
RecylerView介绍 RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recyler ...
- 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye
一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...
- Jquery 搭配 css 使用,简单有效
前几篇博客中讲了Jquery的基础和点击实际,下面来说一下和css搭配着来怎么做 还是和往常一样,举个例子 好几个方块,然后设置颜色 <!DOCTYPE html PUBLIC "-/ ...
- Hive安装配置指北(含Hive Metastore详解)
个人主页: http://www.linbingdong.com 本文介绍Hive安装配置的整个过程,包括MySQL.Hive及Metastore的安装配置,并分析了Metastore三种配置方式的区 ...
- 非关系型数据库(NoSql)
最近了解了一点非关系型数据库,刚刚接触,觉得这是一个很好的方向,对于大数据 方面的处理,非关系型数据库能起到至关重要的地位.这里我主要是整理了一些前辈的经验,仅供参考. 关系型数据库的特点 1.关系型 ...
- ABP领域层
1.实体Entites 1.1 概念 实体是DDD(领域驱动设计)的核心概念之一. 实体是具有唯一标识的ID且存储在数据库总.实体通常被映射成数据库中的一个表. 在ABP中,实体继承自Entity类. ...
- http status code
属于转载 http status code:200:成功,服务器已成功处理了请求,通常这表示服务器提供了请求的网页 404:未找到,服务器未找到 201-206都表示服务器成功处理了请求的状态代码,说 ...
- 深入理解css3中nth-child和 nth-of-type的区别
在css3中有两个新的选择器可以选择父元素下对应的子元素,一个是:nth-child 另一个是:nth-of-type. 但是它们到底有什么区别呢? 其实区别很简单::nth-of-type为什么要叫 ...
- 【干货分享】流程DEMO-事务呈批表
流程名: 事务呈批表 业务描述: 办公采购.会议费用等事务的申请.流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金 ...
- 在redis中使用lua脚本让你的灵活性提高5个逼格
在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...