一个demo理解什么是Dagger2

前端之家收集整理的这篇文章主要介绍了一个demo理解什么是Dagger2前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. 标题之所以是Dagger2是因为我没看Dagger^_^,具体Dagger2Dagger有什么区别请百度这里不再赘述。

使用Dagger2前准备工作

1.配置apt插件

  1. apt插件是用于自动生成代码的,因为Dagger2放弃了反射的方式,而是选择在编译项目时根据注解自动生成相应代码,以提高app性能
  2. 即:在编译项目过程中,apt插件根据注解自动生成实际运行的代码

1.配置apt插件(在build.gradle(Project:xxx)中添加如下代码)

  1. dependencies {
  2. classpath 'com.android.tools.build:gradle:2.1.0'
  3. // 添加apt插件
  4. classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  5. }

2.添加依赖(在build.gradle(Module:app)中添加如下代码)

  1. apply plugin: 'com.android.application'
  2. //添加如下代码,应用apt插件
  3. apply plugin: 'com.neenbedankt.android-apt'

2.添加Dagger2相关库

  1. 添加依赖(在build.gradle(Module:app)中添加如下代码)
  1. dependencies {
  2. ...
  3. compile 'com.google.dagger:dagger:2.4'
  4. apt 'com.google.dagger:dagger-compiler:2.4'
  5. //java注解
  6. compile 'org.glassfish:javax.annotation:10.0-b28'
  7. ...
  8. }
  1. 这样准备工作就做完了,下面就一生产假酒的demo,来理解究竟什么是“依赖注入”。

Demo

1.demo的整体结构

2.代码

  1. Wine
  1. // 生成假酒也是需要酒的,这里决定真酒所占的比重
  2. public class Wine {
  3. private int num = 0 ;
  4. Wine(){
  5. // 一点真酒都没有
  6. }
  7. Wine(int num){
  8. this.num = num ;
  9. }
  10. public String getWineInfo(){
  11. return "添加"+ num + "份酒" ;
  12. }
  13. }
  1. Water
  1. // 这个就是假酒中水的比例了
  2. public class Water {
  3. private int num ;
  4. Water(){
  5. // 没添水,良心企业
  6. }
  7. Water(int num){
  8. this.num = num ;
  9. }
  10. public String getWater(){
  11. return"添加"+ num + "份水";
  12. }
  13. }
  1. FakeWine
  1. // 假酒类,这里就是假酒喽
  2. public class FakeWine {
  3.  
  4. private final Water water;
  5. private final Wine wine ;
  6.  
  7. // @Inject 用于表明这里需要注入。注意:这里的Wine 和 Water 都是靠注入获得的,并没有直接实例化。
  8. @Inject
  9. FakeWine(Wine wine,Water water){
  10. this.wine = wine;
  11. this.water = water ;
  12. }
  13.  
  14. public String getFakeWineInfo(){
  15. return wine.getWineInfo() + "," + water.getWater() ;
  16. }
  17.  
  18. }
  1. 既然有需要注入的地方,就要为他提供用于被注入的内容Dagger2中被注入的内容称之为module,如下:

  1. WaterModule
  1. // @Module表明这个类可用与提供注入内容
  2. @Module
  3. public class WaterModule {
  4.  
  5. // @Provides 表示具体提供的内容,这里是Water ,Water 的实例化也是在这里,这样FakeWine 就不用关心Water 的具体实现了。
  6. @Provides
  7. Water provideWater(){
  8. // 这里的方法名没有严格要求
  9. return new Water(7) ;
  10. }
  11. }
  1. WineModule
  1. // 同上
  2. @Module
  3. public class WineModule {
  4.  
  5. @Provides
  6. Wine provideWine(){
  7. return new Wine(3) ;
  8. }
  9. }
  1. 现在需要注解的点和提供用于注解的内容都有了,但是还不能确定生产什么样的酒(兑水比例不同,就有多个WaterModule WineModule),
  2. 所以需要我们将需要将@Inject @Module关联起来,代码如下:

  1. CreateFakeWine
  1. // 生成假酒的具体类
  2. public class CreateFakeWine {
  3. // @Component 用于将module和inject关联起来
  4. @Component(modules = {WineModule.class,WaterModule.class})
  5. interface GetFakeWine{
  6. FakeWine make() ;
  7. }
  8.  
  9. // 这样假酒就生成出来了,具体兑多少水和真酒,在module中修改,无需修改其他地方
  10. public static void main(String args[]){
  11. System.out.println(DaggerCreateFakeWine_GetFakeWine.builder().build().make().getFakeWineInfo());
  12. }
  13. }

总结

  1. 上面的代码仅是最简单的“依赖注入”的示范,并未对Dagger2进行深入讲解,好处是能快速理解什么是“依赖注入”;其他Dagger2规范,有空再贴。
  2. “依赖注入”究竟是怎么实现的,你可以看apt生成代码,有没有“工厂模式”的既视感^_^。所及对Dagger2你可以这样认为:
  3. 它是利用注解自动生成“工厂模式”的一个框架,这样就轻松多了。有理解错误的地方希望请留言斧正。

猜你在找的设计模式相关文章