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= ...
随机推荐
- 小白学python-day02-二进制、计算机单位、编程语言分类介绍、
今天是第二天,以下是学习内容总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...
- PHP--仿微信, 通过登陆者用户名显示好友列表,显示头像和昵称
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【数据结构】B树、B+树详解
B树 前言 首先,为什么要总结B树.B+树的知识呢?最近在学习数据库索引调优相关知识,数据库系统普遍采用B-/+Tree作为索引结构(例如mysql的InnoDB引擎使用的B+树),理解不透彻B树,则 ...
- java并发笔记之synchronized 偏向锁 轻量级锁 重量级锁证明
警告⚠️:本文耗时很长,先做好心理准备 本篇将从hotspot源码(64 bits)入手,通过分析java对象头引申出锁的状态:本文采用大量实例及分析,请耐心看完,谢谢 先来看一下hotspot的 ...
- WPF 动态添加按钮以及样式字典的引用(Style introduction)
我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的对象就可以了. 下面是Ui,其中定义了一个WrapPanel来存放CheckBox,还 ...
- 搭建PowerDNS+LAP+NFS+MySQL主从半节点同步实现LAMP架构
实验环境:(共7台机器) PowerDNS: 192.168.99.110 两台LAP: 192.168.99.120 和 192.168.99.130 NFS服务器:192.168.99.14 ...
- CSS3☞transform变换
transform CSStransform属性允许你旋转,缩放,倾斜或平移给定元素.这是通过修改CSS视觉格式化模型的坐标空间来实现的. DEMO /* Keyword values */ tran ...
- 【Intellij】导出 jar 包
需要在 Intellij 导出 jar 包,一时不知道该怎么做,后来总算找到了方法,步骤如下: 1. File → Project Structure... → Artifacts → + → jar ...
- Eclipse "R cannot be resolved"问题
前两天 Eclipse 又遇到了这个问题.网上找了不少,不过最终还是没能解决我的问题,无奈重装了 Eclipse…… 搜索中找到了下面这几篇文章,常见的解决方法都在这里,还是不错的,分享一下: htt ...
- 一文带你彻底理解 JavaScript 原型对象
一.什么是原型 原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承. 1.1 函数的原型对象 在JavaScript中,我们创建一个函数A(就是声明一个函数), 那 ...