@Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
@Provides: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的 @Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。
@Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没必要让每个对象都去了解如何管理他们的实例。
1.编写Module : 类需要用@Module注解来标示,用@Provides注解的函数需要以provide开头,这里是根据返回值类型来标识的,方法名并不重要,只需要保证以provide开头即可。
2.编写Component:用@Component注解来标识,同时声明了modules,然后提供了一个方法,叫做inject,用来在Activity中注入。
3.AndroidStudio -> Build -> Make Project:生成一个DaggerActivityComponent,配置Builder。
4.Inject 相关依赖
通过@Singleton实现缓存:
1.在Module对应的Provides方法标明@Singleton
2.同时在Component类标明@Singleton
自定义Scope:
@Scope
@Documented
@Retention(RUNTIME)
public @interface PerApp{}
@Scope
@Documented
@Retention(RUNTIME)
public @interface PerActivity{}
@Scope
@Documented
@Retention(RUNTIME)
public @interface PerApp{}
@Module
class MachineModule{
@PerApp//1.添加@PerApp标明该方法产生只产生一个实例
@Provides
Machine provideFruitJuiceMachine(){
return new FruitJuiceMachine();
}
}
@PerApp//2.添加@PerApp标明该Component中有Module使用了@PerApp
@Component(modules=MachineModule.class)
class JuiceComponent{
void inject(Container container)
}
//3.单例的有效范围随着其依附的Component,为了使得@PerApp的作用范围是整个Application,你需要添加以下代码
public class CustomApp extends Application{
private static JuiceComponent mComponent;// 注意是静态
public void onCreate(){
mComponent=DaggerJuiceComponent.create();
}
public static JuiceComponent getComponent(){ //供给调用
return mComponent;
}
}
依赖的Component间不能使用相同的Scope。
Subcomponent:
//父Component:
@PerApp
@Component(modules=××××)
public AppComponent{
SubComponent subcomponent(); //1.只需要在父Component添加返回子Component的方法即可
}
//子Component:
@PerAcitivity //2.注意子Component的Scope范围小于父Component
@Subcomponent(modules=××××) //3.使用@Subcomponent
public SubComponent{
void inject(SomeActivity activity);
}
//使用
public class SomeActivity extends Activity{
public void onCreate(Bundle savedInstanceState){
...
App.getComponent().subCpmponent().inject(this);//4.调用subComponent方法创建出子Component
}
}
Lazy用于延迟加载,Provide用于强制重新加载:
public class Container{
@Inject Lazy<Fruit> lazyFruit; //注入Lazy元素
@Inject Provider<Fruit> providerFruit; //注入Provider元素
public void init(){
DaggerComponent.create().inject(this);
Fruit f1=lazyFruit.get(); //在这时才创建f1,以后每次调用get会得到同一个f1对象
Fruit f2=providerFruit.get(); //在这时创建f2,以后每次调用get会再强制调用Module的Provides方法一次,根据Provides方法具体实现的不同,可能返回跟f2是同一个对象,也可能不是。
}
}
Thanks to http://blog.youkuaiyun.com/duo2005duo/article/details/50696166