文章目录
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