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
- Dagger2 备忘录
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- Dagger2
- 了解和深入行业/APP分类
- Linux CentOS 7 & Apache Tomcat 7 安装与配置
- 集合foreach循环和三种迭代的删除
- 题解:分子量(VUa1586)
- Codeforces 723F st-Spanning Tree【贪心Kruskal】
- Dagger2 备忘录
- mybatis开启spring事务
- FLEX中如何获取当前页面的URL的问题
- improve your python code(13)
- 86-时间获取客户端
- 《Linux学习笔记——整理自马哥Linux运维》_待完成
- 使用JAVA控制AD域进行基本的操作详解
- Domino与AD账户同步(二)
- c++上机作业6