Dagger的Scope注解代表的是作用域,通过实现自定义@Scope注解,标记当前生成对象的使用范围,标识一个类型的注射器只实例化一次,在同一个作用域内,只会生成一个实例,

然后在此作用域内共用一个实例。这样看起来很像单例模式,我们可以查看@Singleton其实就是@Scope的一个默认实现而已。当然,你得是同一个Component对象来生成

Dagger为我们提供了Scope的一种实现Singleton。单例???no!!!no!!!no!!!不是这么简单的。先看一下它的代码:

@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}

  在Dagger中我们可以自定义注解,譬如我们可以照着上面的模版自定义一个PreScope。

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PreScope {
}

  我们自定义的这个PreScope注解也有和Singleton同样的作用(单例)。下面看一下它的使用!!!

@Module
public class AppModule7 { private App7 app; public AppModule7(App7 app) {
this.app = app;
} @Provides
@Singleton
public App7 provideApp() {
return app;
} @Provides
@Singleton
Context provideApplicationContext() {
return app.getApplicationContext();
} } @Singleton
@Component(modules = {AppModule7.class})
public interface AppComponent7 {
void inject(App7 app); //因为AppComponent会被dependencies,所以此处Module中提供的内容,我们需要在此处声明一下
App7 getApp();
Context getApplicationContext();
}
@Module
public class ActivityModule7 { @Provides
@PreScope
public DependencyPresenter7 getDependencyPresenter(App7 app){
return new DependencyPresenter7(app);
}
} @PreScope
@Component(modules = ActivityModule7.class,dependencies = AppComponent7.class)
public interface ActivityComponent7 {
void inject(TargetActivity71 activity71);
void inject(TargetActivity72 activity72);
} public class App7 extends Application { private AppComponent7 mAppComponent7;
private ActivityComponent7 mActivityComponent7; @Override
public void onCreate() {
super.onCreate();
mAppComponent7 = DaggerAppComponent7.builder().appModule7(new AppModule7(this)).build();
mAppComponent7.inject(this);
mActivityComponent7 = DaggerActivityComponent7.builder().appComponent7(mAppComponent7).build();
} public AppComponent7 getAppComponent7(){
return mAppComponent7;
}
public ActivityComponent7 getActivityComponent7(){
return mActivityComponent7;
} } public class DependencyPresenter7 {
public DependencyPresenter7(App7 app){
Log.d("Dagger.class","DependencyPresenter7-----构造器被调用--------");
} public void printMethod(){
Log.d("Dagger.class","DependencyPresenter7-----printMethod()-----");
} } public abstract class BaseActivity712 extends Activity { private ActivityComponent7 mActivityComponent7; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
App7 app712 = (App7) getApplication();
mActivityComponent7 = app712.getActivityComponent7();
inject(mActivityComponent7);
} public abstract void inject(ActivityComponent7 activityComponent7);
} public class TargetActivity71 extends BaseActivity712 { @Inject
DependencyPresenter7 mDependencyPresenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Log.d("Dagger.class","TargetActivity71---mDependencyPresenter地址值-------"+mDependencyPresenter.toString());
} @Override
public void inject(ActivityComponent7 activityComponent7) {
activityComponent7.inject(this);
} public void jump(View v){
startActivity(new Intent(this,TargetActivity72.class));
}
} public class TargetActivity72 extends BaseActivity712 { @Inject
DependencyPresenter7 mDependencyPresenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Log.d("Dagger.class","TargetActivity72---mDependencyPresenter地址值-------"+mDependencyPresenter.toString());
} @Override
public void inject(ActivityComponent7 activityComponent7) {
activityComponent7.inject(this);
}
}

  上面的代码我们使用了Dagger默认实现的@Singleton和自定义的@PreScope注解一起实现单例。我们之所以不只用dagger提供的Singleton而且还用自定义的,是因为我们使用的域不一样,当不同的Component有依赖依赖或包含关系的时候就不能用同样的Scope,就需要我们自定义。

下面是我在学习过程中总结的结论:

    1  必须使用同一个Component对象来生成,也就是DaggerActivityComponent7.builder().build()只能执行一次。

    2  Component和它的Module要使用相同的Scope。同一个Module中需要使用同样的Scope,否则相应的Component不知道使用什么Scope

    3  有依赖关系或者包含关系的Component不能使用同样的Scope。

  上面的三条结论就是在学习使用Singleton的时候总结出的,大家在学习的时候,最好自己也验证一下。

dagger2系列之Scope的更多相关文章

  1. Dagger2系列之使用方法

    本系列只讲使用方法和使用中遇到的问题,如果还对dagger2还不了解的童鞋儿可以参考文章: http://www.jianshu.com/p/cd2c1c9f68d4 http://www.jians ...

  2. Dagger2 中的 Scope

    Dagger2 中虽然概念挺多的,但是大部分花时间都能理清.包括看人家的分析,Debug 代码下去也能懂.但是对于 scope 的用法以及实现原理还是有点难理解的.主要的问题也像简书上的文章所说: 自 ...

  3. dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent

    本篇是实战文章,从代码的角度分析这两种方式.本文参考自下列文章: http://www.jianshu.com/p/1d42d2e6f4a5 http://www.jianshu.com/p/94d4 ...

  4. dagger2系列之生成类实例

    上一节的最后,我讲到一次注入生成类实例的生成步骤.先来回顾一下: 1  Module中存在创建方法,则看此创建方法有没有参数 如果有参数,这些参数也是由Component提供的,返回步骤1逐一生成参数 ...

  5. Dagger2在Android开发中的应用

    世界是普遍联系的,任何事物和个体都直接或间接相互依赖,在时空长河中共同发展.在面向对象的世界中,更是如此,类与类之间的依赖,关联关系,模块(亦或是分层架构中的层)之间的耦合关系,都是我们在软件开发实践 ...

  6. Android学习资源网站大全

    https://github.com/zhujun2730/Android-Learning-Resources 整理了一些 Android 的博客链接.学习资源网站.站在巨人的肩膀上,会看得更远.整 ...

  7. 解锁Dagger2使用姿势(二) 之带你理解@Scope

    关于Dagger2使用的基础如果你还不了解,可以参考我的上一篇文章解锁Dagger2使用姿势(一),这有助于你理解本篇文章. OK,我们在上篇文章介绍另外Dagger2使用过程中四个基本的注解,分别是 ...

  8. 补习系列(3)-springboot中的几种scope

    目标 了解HTTP 请求/响应头及常见的属性: 了解如何使用SpringBoot处理头信息 : 了解如何使用SpringBoot处理Cookie : 学会如何对 Session 进行读写: 了解如何在 ...

  9. 深入理解JavaScript系列(14):作用域链(Scope Chain)

    前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量.函数声明和函数的形参)作为属性存储在变量对象中. 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出 ...

随机推荐

  1. 平台之大势何人能挡? 带着你的Net飞奔吧!

    镇楼图: 跨平台系列: Linux基础 1.Linux基础学习 By dnt http://www.cnblogs.com/dunitian/p/4822807.html 环境配置 1.Hyper-v ...

  2. TODO:搭建Laravel VueJS SemanticUI

    TODO:搭建Laravel VueJS SemanticUI Laravel是一套简洁.优雅的PHP开发框架(PHP Web Framework).可以让你从面条一样杂乱的代码中解脱出来:它可以帮你 ...

  3. Js 变量声明提升和函数声明提升

    Js代码分为两个阶段:编译阶段和执行阶段 Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容 包括变量声明(var a)和函数声明(function a(){ ...

  4. 我为NET狂官方面试题-数据库篇

    求结果:select "1"? 查找包含"objs"的表?查找包含"o"的数据库? 求今天距离2002年有多少年,多少天? 请用一句SQL获 ...

  5. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  6. PowerDesigner-VBSrcipt-自动设置主键,外键名等(SQL Server)

    在PowerDesigner中的设计SQL Server 数据表时,要求通过vbScript脚本实现下面的功能: 主键:pk_TableName 外键:fk_TableName_ForeignKeyC ...

  7. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  8. 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载

    title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...

  9. 开始学nodejs——net模块

    net模块的组成部分 详见 http://nodejs.cn/api/net.html 下面整理出了整个net模块的知识结构,和各个事件.方法.属性的用法 net.Server类 net.Socket ...

  10. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...