dagger2系列之依赖方式

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

      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中需要显示声明方法

时间: 2024-10-12 20:23:00

dagger2系列之依赖方式的相关文章

前端Mahsup异步依赖方式不能做业务数据依赖

很久之前流行mashup方式做内容集成,之前为了IP定位的方便,引用了第三方的IP定位JS,然后根据其内容与服务器同步地址数据并写入Cookie,可是这种方式一旦,第三方的库反应缓慢时,就会出现大问题,导致整站对地理数据Cookie的依赖变得很脆弱.现在把这种前端数据异步依赖方式改为后端调用第三方的公开IP地址数据库.

Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

定义: 将一个类(Adaptee)的接口转换成客户(Client)希望的另外一个接口(Target). 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):使得一个东西适合另一个东西的东西.百度中定义为:接口转换器.通过包装一个需要适配的对象,把源接口转换成目标接口. 为什么要适配:需要的东西已做好,但是不能用,短时间又不能改造,想办法适配它. 作用: 使得原本由于接口不兼容而

Android Studio3.x新的依赖方式(implementation、api、compileOnly)

https://blog.csdn.net/yuzhiqiang_1993/article/details/78366985?locationNum=6&fps=1 Android Studio3.0正式版已经出来了,相比2.x的版本,编译速度提高了不少. 当我们使用AS3.0新建项目时会发现,默认的依赖由之前的compile更改为implementation了. 下面我们来看看他们之前的差异: 首先是2.x版本的依赖方式: 再来看看3.0的: 可以看到在Android studio3.0中,c

Gradle的依赖方式&mdash;&mdash;Lombok在Gradle中的正确配置姿势

写过java的都知道,lombok几乎在项目中处于不可或缺的一部分,但是lombok在Gradle的项目中配置并非人人都知道. 很多人在项目依赖中直接这样写 1 compile "org.projectlombok:lombok:1.18.4" 但这样的处理在Gradle 5.0以上被命令禁止了,在4.x的高级版本中编译时也会有对应的告警 12345 The following annotation processors were detected on the compile cla

【Android 进阶】Dagger2 系列:入门案例一

介绍 A fast dependency injector for Android and Java. 一个在 Android 和 Java 平台上使用的快速的依赖注入框架. 类似 java 开发中的 spring 框架,但使用难度比 spring 大一点点. 依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性. 几个必须知道的概念: 什么是依赖: 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖. 什么是依赖注入: 依赖注入就

Dagger2系列之使用方法

本系列只讲使用方法和使用中遇到的问题,如果还对dagger2还不了解的童鞋儿可以参考文章: http://www.jianshu.com/p/cd2c1c9f68d4 http://www.jianshu.com/p/94d47da32656 使用Dagger2的前提需要添加一些依赖: 1 在Project的 build.gradle文件添加以下内容 buildscript { repositories { jcenter() } dependencies { classpath 'com.an

Android注解使用之Dagger2实现项目依赖关系解耦

前言: 最近牵头发起公司app的重构工作,如何通过重构让项目的耦合降低.开发效率提高,一直是我努力的方向,今天来学习一下一个注解框架Dagger2,然后看看如何使用它来降低项目的耦合. Dagger2 一句话:一款快速的注解框架,应用于Android.Java,由 Google 开发和维护,是 Square 的 Dagger 项目的分支. gitHub:https://github.com/google/dagger Dagger2采用依赖注入方式,依赖注入是一种面向对象的编程模式,它的出现是为

dagger2系列之生成类实例(自己)

上一节的最后,我讲到一次注入生成类实例的生成步骤.先来回顾一下: 1  Module中存在创建方法,则看此创建方法有没有参数 如果有参数,这些参数也是由Component提供的,返回步骤1逐一生成参数类实例,最后再生成最终类实例--ok 如果无参数,则直接由这个方法生成最终类实例 2    Module中没有创建方法,则从构造函数里面找那个用@Inject注解的构造函数 如果该构造函数有参数,则也是返回到步骤1逐一生成参数类实例,最后调用该构造函数生成类实例 如果该构造函数无参数,则直接调用该构

拥抱.NET Core系列:依赖注入(1)

依赖注入时编程手段中解耦和封装的一个非常重要的手段,我本人已经到了没有DI无法编写项目的程度了,在.NET Framework中微软并没有在FCL中引入DI,虽然推出了"Unity".而在.NET Core中DI几乎是所有组件的标配可见DI有多么的重要,本节主要简单介绍下微软在.NET Core中加入的DI组件. 前言 DIP.IoC.DI 说起DI不得不提IoC这个模式,很多人会把DI和IoC混为一谈,但其实这两者是概念和实现的关系. 依赖倒置原则(DIP):软件设计原则,要依赖于抽