dagger2的使用

首先我们添加依赖

   compile"com.google.dagger:dagger:2.14.1"
   annotationProcessor"com.google.dagger:dagger-compiler:2.14.1"

前言

dagger2是一个依赖注入的框架,我们可以通过dagger2辅助我们注入一个类,而不是new一个,对于依赖注入相关的东西,不懂的可以自行百度,他的好处就是可以降低耦合度,由于我写的项目少,目前体会不到,还在学习中。

描述dagger2的图片

在这里插入图片描述这是一个比较简单的描述图,我们来大体看一下dagger2的工作过程,打个比喻,A容器的水转移到B容器,怎么转移,我们可以通过一个注射器,吸取A容器的水,然后将其注入到B容器。而图中的module对象就是A容器中的水,他是要注入的类的提供者,component类是注射器,他将module提供的类注射到需要被注入的地方,需要注意的是,component是自动生成的,我们只需要写好component接口,然后重新编译一下程序,就会自动生成这个类,这个类的命名规则是Dagger+之前定义的接口名

现在我们来大概说一下最基本的三个注解

@Inject注解

@Inject注解用于标注需要依赖注入的类或者类的构造函数,如果构造函数没有参数,可以直接注入,如果有参数需要@Module提供

@Module注解

用于标注Module对象,提供依赖注入的类,可以提供第三方类,或者提供需要依赖注入的类的构造函数的参数等

@Component注解

标注该接口是需要生成Component类的接口,rebuild之后,会自动生成,和@Provides配合使用,@Provides用于提供注入的变量,就像之前比喻中的水

举个例子

例1需要注入的类没有参数的情况

新建需要注入的类User

    public class User {
        String userName;
        @Inject  //Inject注解
        public User(){
            this.userName="defaultDagger";
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    }
	新建接口MainActivityUse

新建Component接口MainActivityUser

   @Component  //component注解
public interface MainActivityUser {
//mainActivity作为注入的容器
     void inject(MainActivity mainActivity);
}

MainActivity中

public class MainActivity extends AppCompatActivity {
@Inject  //注入
User user;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      DaggerMainActivityUser.builder().build().inject(this);
      Log.i("msg","没有构造函数的输出"+user.getUserName());
    }
}

我们rebuild一下,然后运行程序, 日志打印结果 I/msg: 没有构造函数的输出defaultDagger,可以看到,注入成功了

例2需要注入的类有参数的情况

如果把上述User类改成,其他不需要改动

public class User {
    String userName;
    @Inject
    public User(String userName){//增加了参数
        this.userName=userName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

将会出现错误

错误: java.lang.String cannot be provided without an @Inject constructor or from an @Provides-annotated method.
java.lang.String is injected at
com.example.administrator.dragger2andlifecycle.User.(userName)
com.example.administrator.dragger2andlifecycle.User is injected at
com.example.administrator.dragger2andlifecycle.MainActivity.user
com.example.administrator.dragger2andlifecycle.MainActivity is injected at
com.example.administrator.dragger2andlifecycle.MainActivityUser.inject(mainActivity)

因为没有提供userName来注入,所以报错 现在我们来创建一个Module来提供userName进行注入。
新建Module类MainActivityModule

@Module  //Module注解,标记他是一个module
public class MainActivityModule {
    @Provides   //Provides注解,提供注入的类
    public String provideUserName(){
        return "provideName";
    }
}

修改Component接口MainActivityUser

   @Component(modules = MainActivityModule.class)//用于标记提供的module
public interface MainActivityUser {
     void inject(MainActivity mainActivity);
}

rebuild一下,运行程序,日志打印结果:
I/msg: 有构造函数的输出provideName

以上就是最简单的应用了,下面我在说说其他的注解

移步到查看 https://blog.csdn.net/qq_43676395/article/details/89059544

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值