为什么要使用dagger2:首先的答案应该是解耦,可是它怎么就解耦了呢?再往直白了说:就是少几个new。

如果这个时候问:为什么解耦或者为什么需要少几个new,我只能说换频道吧,对不起,我说不明白。

我写的个人认为有助于理解Dagger2的上一篇博客,思路不是很清晰,也不是太好懂。

按照上面的想法,其实我们可以用一个静态+接口的方式来实现,先说一些数据的结构:

蓝色的是食物一组,Grass和Meat都继承Food接口,红色是动物一组Sheep和Tiger都继承Animal接口;

Animal代码:

public interface Animal {String printName();//给动物定义一个统一的方法
}

Tigger代码:

public class Tiger implements Animal{private  String name = "老虎";@Overridepublic String printName() {return name;}
}

Sheep代码:

public class Sheep implements Animal{private String name = "羊";@Overridepublic String printName() {return name;}
}

Food接口:

public interface Food {String printType();
}

Grass代码:

public class Grass implements Food{private String type = "草";@Overridepublic String printType() {return type;}
}

Meat代码:

public class Meat implements Food{private String type = "肉";@Overridepublic String printType() {return type;}
}

为以上的数据写一个静态方法的提供类:DataProvide.class代码

public class DataProvide {public static Animal getAnimal(){return new Sheep();}public static Food getFood(){return new Meat();}
}

这样,我们可以的Activity就可以这样写了:

public class Behaviour2Activity extends AppCompatActivity{//这里不再需要new,需要改的时候去DataProvide处理就好了Animal animal = DataProvide.getAnimal();Food food = DataProvide.getFood();Button btnShow;TextView txtRelation;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_behaviour2);setTitle("普通方式");btnShow = (Button) findViewById(R.id.btn_show);txtRelation = (TextView) findViewById(R.id.txt_relation);btnShow.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {txtRelation.setText("动物:"+animal.printName()+"      食物:" + food.printType());}});}
}

到这里,我们可以算是勉强做到了不在去new一个个对象,在一个统一的地方进行类似配置的处理,但是这样有个很大的缺点:如果有大量的实例。。。而且还有不同的实例。。。。

==========================================请问你是谁?==================================

==========================================我是分割线!==================================

==========================================好巧,我也是==================================

接下来是Dagger2的写法:

首先是@module类

@Module //@module声明这个类是携带实体的组件,一个“容器”
public class BehaviourModule {@Named("A") //相同返回值类型时的区别符号@Provides  //@provides声明以下的类型将被提供出去public Animal getAnimal(){return new Tiger();}@Provides //同上public Food getFood(){return new Meat();}
}
@Module
public class ArgModule {private String str;public ArgModule(String str){this.str = str;}@Named("B")@Providespublic Animal getArgAnimal(){return new Animal() {@Overridepublic String printName() {return str;}};}
}

接下来是@Component接口:

@Component(modules={BehaviourModule.class, ArgModule.class}) //添加组件,使用Module内各@provides
public interface BehaviourComponent {void inject(Behaviour1Activity activity);//伴随的声明周期
}

相应的活动类代码:

public class Behaviour1Activity extends AppCompatActivity{@Named("A")// 使用同样标记“A”的对象@Inject //可以理解为该标记从DaggerBehaviourComponent中拿数据Animal animal;@Inject //因为只有一个,不需要@Named标记Food food;Button btnShow;TextView txtRelation;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_behaviour1);setTitle("Dagger2方式");DaggerBehaviourComponent.builder().argModule(new ArgModule("猫")).build().inject(this);btnShow = (Button) findViewById(R.id.btn_show);txtRelation = (TextView) findViewById(R.id.txt_relation);btnShow.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {txtRelation.setText("动物:"+animal.printName()+"      食物:" + food.printType());}});}}

好了,到这里两组的代码都实现了一样的简单功能,他们都没有需要new在活动中生成实例,就简单来说,它们的差距是很小的;如果假使按这两种方式,项目的规模往大走,那么dagger2的优势就会出来:哥是逻辑相关的,而静态加接口或越来越复杂(这个复杂更多的是量上,不一定是逻辑上),还有,他们两者的开销也是不一样的,Dagger2只有在生命周期开始的时候才会出现,周期结束时也消亡;而像静态加接口一样将实例一直存起来等待调用。

点击下载上面的Demo

一些关于dagger2的理解(二)相关推荐

  1. 初学docker理解二

    docker理解二 <此文仅仅个人对于docker的理解,不涉及任何其他的东西> 随着对docker理解的深入脑海里总是会浮现几个问题: 1. docker到底是什么 docker现实中究 ...

  2. 【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)

    [经典算法实现 44]理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法) 一.二维FFTFFTFFT快速傅里叶变换 公式推导 二.二维FFTFFTFFT 及 IFFTIF ...

  3. 矩阵与行列式的区别 行列式简单理解(二三阶)

    目录 矩阵与行列式的区别 行列式简单理解(二三阶) 矩阵与行列式的区别 如下: 1. 矩阵是一个表格,行数和列数可以不一样:而行列式是一个数,且行数必须等于列数.只有方阵才可以定义它的行列式,而对于长 ...

  4. 深入理解二维码生成尺寸

    深入理解二维码生成尺寸 详细了解二维码的原理,CSDN这两篇博客不错: 转自MachineChen的博客:http://blog.csdn.net/u012611878/article/details ...

  5. 一些关于dagger2的理解

    首先,真实的原理我不准,但是我还是提供我的理解. 阅读这篇文章希望读者能满足一个假设:不管懂不懂,看过一些其他关于dagger2的文章(因为没图.没代码,不便于直观理解). 在别人的文章里,会说&qu ...

  6. matlab极坐标下的二维傅里叶变换_形象理解二维傅里叶变换

    公众号关注 "DL-CVer" 设为 "星标",DLCV消息即可送达! 来自 | 知乎  作者 | 阿姆斯特朗 链接 | https://zhuanlan.zh ...

  7. Dagger2利器系列二:懒/重加载+Component 的组织关系

    目录 一:懒/重加载 1.1 Dagger2 中的懒加载 1.2 Provider 强制重新加载 二:Component 的组织依赖关系 2.1 前言 2.2 Component 的组织关系 2.2. ...

  8. 英语思维导图大全 阅读理解(二十一)

    阅读理解 一.新鲜一感 二. 阅读理解全部内容 一.新鲜一感 一箭西去寒射影,持剑东来斩寒山 二. 阅读理解全部内容 如果订阅后,就可以在最后一篇文章中,找到这个百度网盘链接地址,获取英语思维导图大全 ...

  9. 形象理解二维傅里叶变换

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来自 | 知乎  作者 | 阿姆斯特朗 链接 | https:// ...

最新文章

  1. 2022-2028年中国氧化铟锡薄膜行业市场深度分析及前瞻研究报告
  2. 【Azure Services Platform Step by Step-第1篇】INTRODUCING THE AZURE SERVICES PLATFORM
  3. linux的rhce考试题,【干货】RHCE考题和详细答案详攻略(一)
  4. 交换机老化测试和性能测试方法收集
  5. android组件用法说明,Android第三方控件PhotoView使用方法详解
  6. ES6之路第十三篇:Iterator和for...of循环
  7. vue 高德地图 不同区域显示不同颜色_高德百度哪家强?苹果Carplay第三方分屏功能评测...
  8. 专心写即时通讯软件争取CSDN认证专家
  9. 联想小新模式切换不了_精彩,不止一屏!联想多款消费新品亮相秋季发布会
  10. 数字签名和加密的基本原理及其区别?
  11. redis之django-redis
  12. 蓝懿iOS培训日志11 递归
  13. 深入理解死亡之Ping ---《openstack 网络安全》
  14. 安防监控专用工业交换机与普通交换机的区别
  15. 常用的RGB颜色值参考表
  16. 微软搜索战略全盘革新 计划数月内发布“Kiev”
  17. 统一社会信用代码的编码格式以及js正则校验
  18. opencv 训练样本
  19. SpiffWorkflow定制工作流
  20. 成功率100%的通达信指标公式,你敢相信吗?

热门文章

  1. 【调剂】河南理工大学2023年硕士研究生调剂信息公布
  2. 【项目集成工具】Jenkins
  3. 无人深空豪华版V1.75 免安装中文版下载_破解版_修改器_9.38G
  4. iphone5s 白苹果 刷机步骤
  5. 辗转相除法与更相减损术(求最大公约数)
  6. JS代码在线优化工具
  7. 台式机更换固态硬盘(二)
  8. ASP.NET MVC5 入门篇之WEB开发的知识结构
  9. burn the candle at both ends是什么意思?
  10. HTML用乘法函数,excel乘法函数-这两个乘积函数技巧,办公时特别实用,但擅长的人不多...