依赖注入框架Dagger2—2.各注解用法

0.前言

接上一篇入门文章,这篇主要是各属性实战。

1.Dagger2各属性了解

  • 必要属性
    @inject//注入,@Component,@Moudle,@Provider
    为什么说这个几个是必要属性,因为只要想用dagger2这几个属性是绕不开的。
  • 高级属性
    @Named ,@Qualifier ,@Scope ,@Singleton;
    这四个属性实际上可以分文俩组,@Named底层实现是@Qualifier,@Singleton底层实现是@Scope

2.Dagger2各属性使用及分析

2.1.@Inject

注解构造函数:
通过标记构造函数,告诉Dagger 2可以创建该类的实例(Dagger2通过Inject标记可以在需要这个类实例的时候来找到这个构造函数并把相关实例new出来)从而提供依赖关系。
若注解了构造函数,没有 注解依赖变量,将不创建实例。
注解依赖变量:
通过标记依赖变量,Dagger2提供依赖关系,注入变量。
若注解了依赖变量,而没注解构造函数,将获得一个null对象。

2.2.@Moudle

通过注解类,为Dagger提供依赖关系。

@Module
public class TestModule {
   
    @Provides
    public Test provideTest() {
   
        return new Test();
    }
}

2.3.@Provider

@Provides依然是为了提供依赖关系,是对@Inject的补充,弥补了@inject对于第三方框架和接口类的盲区。
@Provides方法本身可能也拥有自身的依赖关系。
@Provides方法本身是不能独立存在的,它必须依附于一个Module。

2.4.@Component

通过注解接口类,作为提供依赖和所需依赖之间的桥梁(链接Moudle 和 Containter),在编译时生成相关实例,将相关依赖注入完成使命。

@Component(modules={
   Test.class,Test1.class})
public interface TestComponent{
   
    void inject(Class class);
}

依赖规则
若@Injdec和@Module都提供了依赖对象
1.查找Module中是否存在创建该类的方法
2.若存在,初始化参数,完成实例创建
3.不存在用@Inject创建实例

2.5.@Singleton

这个注解的意思就是单例。在Dagger2的使用中,需要有局部单例全局单例的意识,那么什么是局部单例,可以理解为在一个Activity内n个类型相同的变量地址相同,但超出了这个Activity到了另一个类里边定义这类型的变量地址便不同了,就像是人这个物种,在屋子1里边全是男人,但是在屋子2里边就全是女人了;全局单例就好理解了,同一类型的变量在整个app内的任何地方,地址都是一样的。

不管是局部或者全局的单例,他们其实基本定义都一样,唯一的差别就是Component的作用域,若Component的作用域是全局的,那么对应@Singleton或者@Scope的对应moudle就是全局的,反之亦然,这么说有点抽象,看如下代码:

package com.zjandroid.nani.constant;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

@Module
public class UrlConstant {
   

    @Singleton
    @Provides
    public UrlConstant instance(){
   
        return new UrlConstant();
    }

}

这是项目内网络地址管理的字符串常量类,我把它作为一个Moudle,并在它的实例化方法上使用了 @Singleton注解,接着我又定义了2个Component(作用域为局部)

package com.zjandroid.nani.dagger.component;

import com.zjandroid.nani.constant.UrlConstant;
import com.zjandroid.nani.view.activity.SplashActivity;
import javax.inject.Singleton;

import dagger.Component;

@Singleton
@Component (modules={
   UrlConstant.class})
public interface SplashComponent {
   
    void inject(SplashActivity splashActivity);
}
package com.zjandroid.nani.dagger.component
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值