Spring依赖注入浅析
2020-02-02 01:52
1286 查看
1. 概念理解
- 依赖注入谁注入谁? 依赖对象注入IoC容器。
- 谁控制谁?控制什么? IoC容器控制对象,控制依赖对象的创建与注入。
2. 传统方式构建对象间依赖关系
public class DvdPlayMissionImpossible { private MissionImpossibleCd missionImpossibleCd; public DvdPlayMissionImpossible(){ this.missionImpossibleCd = new MissionImpossibleCd(); // 紧耦合 } public void play(){ System.out.println("一台只能看" + missionImpossibleCd.getCompactDiskName() + "的DVD"); } } public class DvdPlayFurious { private FuriousCd furiousCd; public DvdPlayFurious(){ this.furiousCd = new FuriousCd(); // 紧耦合 } public void play(){ System.out.println("一台只能看" + furiousCD.getCompactDiskName() + "的DVD"); } } public class MissionImpossibleCd { public String getCompactDiskName(){ return "碟中谍"; } } public class FuriousCd { public String getCompactDiskName(){ return "速度与激情"; } } // Traditional Way. @Test public void dvdPlayerMissionImpossibleTest(){ DvdPlayMissionImpossible dvdPlayMissionImpossible = new DvdPlayMissionImpossible(); DvdPlayFurious dvdPlayFurious = new DvdPlayFurious(); dvdPlayMissionImpossible.play(); // 一台只能看碟中谍的DVD dvdPlayFurious.play(); // 一台只能看速度与激情的DVD }
3. DI方式构建对象间依赖关系
- 所有CD都拥有电影名称,因此抽象成一个CompactDisk接口。
public interface CompactDisk { String getCDName(); } @Component public class MissionImpossible implements CompactDisk { @Override public String getCDName() { return "碟中谍"; } } @Component public class Furious implements CompactDisk{ @Override public String getCDName() { return "速度与激情"; } }
- 所有DVD播放器都拥有播放的功能,因此抽象成一个MediaPlayer接口。
public interface MediaPlayer { void play(); } @Component public class DvdPlayer implements MediaPlayer { @Autowired @Qualifier("missionImpossible") private CompactDisk cd; @Override public void play() { System.out.println("一台可以看" + cd.getCDName() + "的DVD"); } } @Component public class VCDPlayer implements MediaPlayer { @Autowired @Qualifier("furious") private CompactDisk cd; @Override public void play() { System.out.println("一台可以看" + cd.getCDName() + "的VCD"); } }
- 单元测试
@Autowired DvdPlayer dvdPlayer; @Autowired VCDPlayer vcdPlayer; // DI Way. @Test public void dvdAndVcdPlayerTest(){ dvdPlayer.play(); // 一台可以看碟中谍的DVD vcdPlayer.play(); // 一台可以看速度与激情的VCD }
4. DI优势
- 对象之间解耦,毕竟一台只能看一部电影的播放器,我想没人愿意买吧。
- 同一个对象,IoC容器只需要创建一次。
- IoC容器会帮你自动匹配对象之间复杂的依赖关系。
5. 参考资料
- https://www.iteye.com/blog/jinnianshilongnian-1413846
- https://www.zhihu.com/question/23277575/answer/169698662
- 《Spring实战》 第二章
转载于:https://www.cnblogs.com/YaoFrankie/p/11432938.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- spring学习---依赖注入的几种方法
- 传智播客Spring2.5视频教程_编码剖析Spring依赖注入的原理 4
- Spring原理机制资源汇总(控制反转(IoC)与依赖注入(DI)主题)
- IOC,依赖倒置 (理解) Spring依赖注入的实现技术是:动态代理
- Spring的依赖注入的方式
- spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差异
- Spring基础—— 泛型依赖注入
- Spring依赖注入对于Date类型数据的处理
- Spring 学习笔记(4)—— Bean 的基本配置、依赖注入(DI)、注入参数引用其他Bean
- 深入探索spring技术内幕(三): 剖析spring IoC工作原理和配置依赖注入
- spring四种依赖注入方式
- Spring基于构造函数和设值函数的依赖注入
- spring依赖注入枚举类型
- 依赖、依赖倒转原则、IoC/依赖注入、以及在Spring中的实现
- (4) 编码剖析Spring装配基本属性的原理【附加:注入依赖对象的两种方式】
- java模拟spring实现依赖注入
- spring依赖注入的方式
- Spring 3.x企业应用开发实战(9-1)----依赖注入
- Spring依赖注入
- Spring依赖注入方式