入坑Dagger2——两种注入方式(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

导语:Dagger2 是基于 Java 注解来实现依赖注入的,那么在正式使用之前我们需要先了解下 Dagger2 中的注解。Dagger2 使用过程中我们通常接触到的注解主要包括:@Inject, @Module, @Provides, @Component, @Qulifier, @Scope, @Singleten


提示:以下是本篇文章正文内容,下面案例可供参考

一、为什么需要Dagger2?

一般来说:如果两个类之间要进行依赖注入,基本一是考虑构造器的方式注入,二是set方式注入

/**
 * 车引擎
 */
public class Engine {
    
    public void inject(){
        
    }
}

构造器的方式注入

/**
 * 车
 */
public class Car {

    Engine engine;
    //第一种方式注入:构造器(以参数的方式传入)
    public Car(Engine engine) {
        this.engine = engine;
    }
}

set方式注入

/**
 * 车
 */
public class Car {

    Engine engine;
    //第二种方式注入:set方法(以参数的方式传入)
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}

以上两种方式都是手动进行注入的,使用场景比较单一,不能适应多种情况,比如构造器要传入参数的时候,这就要修改其构造器,而Dagger2框架正好就是为依赖注入而生的框架,能有效解决这方面的问题,IOC是实现Dagger2框架的核心>

  • IOC框架的实现
    -----动态:基于反射的方式实现,Spring IOC(在运行时动态的进行依赖关系的建立)
    ------静态:程序在编译时期已经建立好依赖关系的类(Dagger2

二、使用步骤

第一种方式注入:Inject

步骤1:在构造方法上使用Inject注解,就是告知Dagger可以通过构造方法来创建并获取User实例(自己定义的实例对象)

/**
 * Inject注解的简单使用
 */
public class User {

    //步骤1:在构造方法上使用Inject注解,就是告知Dagger可以通过构造方法来创建并获取User实例
    @Inject
    public User(){

    }
}

步骤2:创建一个接口,并使用Component,然后创建一个方法把 依赖需求方(MainActivity

//@Component用于标记一个接口作为组件接口。组件接口是Dagger2用来连接依赖提供者(Modules)和依赖需求方(需要注入的对象)的桥梁。
@Component
public interface ApplicationComponent {
    //步骤2:创建一个接口,并使用Component,然后创建一个方法把 依赖需求方(MainActivity) 和 依赖提供方(这里指的是User,还没用到Modules) 连接起来
    void inject(MainActivity mainActivity);
}

重要:
//步骤3:在依赖需求方使用同样的注解Inject
//步骤4:依赖注入(这一步之前,ReBuild一下)

public class MainActivity extends AppCompatActivity {

    private static final String TAG="MainActivity";

    //步骤3:在依赖需求方使用同样的注解Inject
    @Inject
    User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //步骤4:依赖注入(这一步之前,ReBuild一下)
        DaggerApplicationComponent.create().inject(this);
        Log.d(TAG, "User的实例对象: "+user);
    }
}

重要讲解:DaggerApplicationComponent的生成规则:Dagger是因为其框架,ApplicationComponent是因为其接口命名方式,create指的是创建,而inject是接口中定义的方法
在这里插入图片描述

测试结果:
在这里插入图片描述

第二种方式注入:Module

步骤1:创建module类,并通过Provides注解获取 第三方框架 的实例

/**
 * 步骤1:创建module类,并通过Provides注解获取 第三方框架  的实例
 */
//Module注解主要是为了将该类变成Dagger2框架中的模块,解决第三方框架提供实例的问题
@Module
public class NetModule {

    //第二种方式注入:告知Dagger2可以提供该Provides注解获取到注入对象的实例
    @Provides
    public Retrofit providesRetrofit(){
        return new Retrofit.Builder()
                .baseUrl("http://baidu.com")
                .build();
    }
}

步骤2:在Component接口组件中,加入modules = NetModule.class,连接依赖提供者(Modules)和依赖需求方(需要注入的对象MainActivity

//@Component用于标记一个接口作为组件接口。组件接口是Dagger2用来连接依赖提供者(Modules)和依赖需求方(需要注入的对象)的桥梁。
//步骤2:在Component接口组件中,加入modules = NetModule.class,连接依赖提供者(Modules)和依赖需求方(需要注入的对象MainActivity)
@Component(modules = NetModule.class)
public interface ApplicationComponent {
  
    void inject(MainActivity mainActivity);
}

//步骤3:在依赖需求方使用同样的注解Inject
//步骤4:依赖注入(这一步之前,ReBuild一下)

public class MainActivity extends AppCompatActivity {

    private static final String TAG="MainActivity";

    //步骤3:在依赖需求方使用同样的注解Inject
    @Inject
    Retrofit retrofit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //步骤4:依赖注入(这一步之前,ReBuild一下)
        DaggerApplicationComponent.create().inject(this);
        Log.d(TAG, "Retrofit的实例对象: "+retrofit);
    }
}

测试结果:
在这里插入图片描述

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值