Dagger2 备忘录

来源:互联网 发布:网络gb是什么意思啊 编辑:程序博客网 时间:2024/06/17 07:31

@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{}@Moduleclass 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.使用@Subcomponentpublic 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.csdn.net/duo2005duo/article/details/50696166

0 0