Spring依赖注入浅析
1. 概念理解
- 依赖注入
- 谁注入谁? 依赖对象注入IoC容器。
- 控制反转
- 谁控制谁?控制什么? 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实战》 第二章
Spring依赖注入浅析的更多相关文章
- Spring依赖注入(IOC)那些事
小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...
- Spring依赖注入三种方式详解
在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...
- Spring依赖注入:注解注入总结
更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...
- Spring 依赖注入,在Main方法中取得Spring控制的实例
Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...
- Spring依赖注入 --- 简单使用说明
Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...
- Spring依赖注入 --- 模拟实现
Spring依赖注入 --- 模拟实现 面向接口编程,又称面向抽象编程, 数据库如果发生更改,对应的数据访问层也应该改变多写几个实现,需要用谁的时候在service里new谁就可以了面向抽象编程的好处 ...
- Java Web系列:Spring依赖注入基础
一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...
- Spring依赖注入的三种方式
看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...
- spring依赖注入源码分析和mongodb自带连接本地mongodb服务逻辑分析
spring依赖注入本质是一个Map结构,key是beanId,value是bean对应的Object. autowired是怎么将定义的接口与对应的bean类建立联系? <bean name= ...
随机推荐
- HttpServlet cannot be resolved to a type 解决办法
刚开始学习Servlet,在Eclipse中新建了一个Servlet,不过页面上报错: Httpservlet cannot be resolved to a type,显然是Eclipse找不到相应 ...
- git commit规范化实践
最近从svn转到git进行代码版本控制,今天了解了git commit规范化的一些知识后,写此文章记录下配置过程. 环境 编辑器使用的是vscode,项目框架是vue3.0 规范化工具 规范化git ...
- 7月新的开始 - LayUI的基本使用 - Tab选项卡切换显示对应数据
LayUI tab选项卡+page展示 要求:实现tab选项卡改变的同时展示数据也跟着改变 实现条件: 1. 选项卡 [官网 – 文档/示例 – 页面元素 – 选项卡] 2.数据表格 [官网 – 文档 ...
- ssm框架下的文件上传和文件下载
最近在做一个ssm的项目,遇到了添加附件和下载的功能,在网上查了很多资料,发现很多都不好用,经过摸索,发现了一套简便的方法,和大家分享一下. 1.在自己已经构建好的maven web项目中 pom. ...
- MyBatis Generator Example.Criteria 查询条件复制
背景: 我们在开发中使用MyBatis Generator生成的 XxxExample查询时,咋添加 or 查询时候,可能两个 Example.Criteria 对象的条件存在交集,即多个查询条件是相 ...
- solidity的delete操作汇总
简介 Solidity中的特殊操作符delete用于释放空间,为鼓励主动对空间的回收,释放空间将会返还一些gas. delete操作符可以用于任何变量,将其设置成默认值0. 删除枚举类型时,会将其值重 ...
- 【iOS】打印方法名
为了便于追踪程序运行过程,可以在日志打印方法名,示例代码如下: NSLog(@"%@", NSStringFromSelector(_cmd)); 结果如图所示: 此外,在多个中, ...
- codeforces 355A Vasya and Digital Root
题意就是找出一个长度为k的整数,使得它的root为d,k的可能取值为1-1000. 第一眼看到这个题,无从下手,想到那么长的数,暴力肯定超时.其实不然,题目要求只要输出任何一个满足条件的即可,因为任何 ...
- 技巧:结合Zabbix与SNMP监控嵌入式设备
在如何利用Zabbix监控网络设备三篇文章的前两篇中,我们介绍了如何通过Zabbix代理监控网络设备.但有些设备无法安装Zabbix代理,需要采用其他方法监控.需要考虑无法安装软件的嵌入式设备或应用程 ...
- Hadoop学习(7)-hive的安装和命令行使用和java操作
Hive的用处,就是把hdfs里的文件建立映射转化成数据库的表 但hive里的sql语句都是转化成了mapruduce来对hdfs里的数据进行处理 ,并不是真正的在数据库里进行了操作. 而那些表的定义 ...