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依赖注入浅析的更多相关文章

  1. Spring依赖注入(IOC)那些事

    小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...

  2. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  3. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  4. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

  5. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

  6. Spring依赖注入 --- 模拟实现

    Spring依赖注入 --- 模拟实现 面向接口编程,又称面向抽象编程, 数据库如果发生更改,对应的数据访问层也应该改变多写几个实现,需要用谁的时候在service里new谁就可以了面向抽象编程的好处 ...

  7. Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  8. Spring依赖注入的三种方式

    看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...

  9. spring依赖注入源码分析和mongodb自带连接本地mongodb服务逻辑分析

    spring依赖注入本质是一个Map结构,key是beanId,value是bean对应的Object. autowired是怎么将定义的接口与对应的bean类建立联系? <bean name= ...

随机推荐

  1. SQL SERVER中生僻字问题存储与查询问题

    以下仅记录碰到的几个问题 1.首先字段设置为varchar的时候存储后无法进行正常的显示 显示为? 此状态下匹配查询或者Like模糊查询都没问题 2.将字段设置为nvarchar,在进行插入或者跟新时 ...

  2. Spring Cloud 之 Config与动态路由.

    一.简介  Spring Cloud Confg 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为分布式配置中心,它是一个独立的微服务 ...

  3. MongoDB与Redis的简单使用

    mongodb 概念解析 SQL术语/概念 MongoDB术语/概念 解释说明 database database 数据库 table collection 数据库表/集合 row document ...

  4. Python基础总结之第九天开始【python之OS模块对目录的操作、以及操作文件】(新手可相互督促)

    年薪20万的梦想...         python对文件.目录能做什么?或者说我们需要python替我们做什么?最经常的操作就是对文件的:打开.关闭.读取.写入.修改.保存等等对目录的操作,无非就是 ...

  5. Go中的文件读写

    在 Go 语言中,文件使用指向 os.File 类型的指针来表示的,也叫做文件句柄 .我们来看一下os包的使用方式. 1.读取文件 os包提供了两种打开文件的方法: Open(name string) ...

  6. Scala函数式编程(三)

    Scala既是一门面向对象(OOP)语言,又是一门函数式编程(FP)语言.作为一门支持函数式编程的语言,Scala鼓励面向表达式编程(EOP)模型.简单来说,EOP中每个语句都有返回值.这一模式很明显 ...

  7. 面系那个对象开发原则.高内聚.低耦合+Python安装详细教程+print输出带颜色的方法

    面系那个对象开发原则.高内聚.低耦合 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计, ...

  8. c# 读取 txt 文件中数据(int)

    今天在学图的算法做测试是,需要读取文本文件中的点坐标,本来很简单的事情,折腾了半天,记录一下找到的一种简单粗暴的解决方法,以便以后查看. 第一种方法 : StringReader string lin ...

  9. Unity进阶之ET网络游戏开发框架 04-资源打包

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  10. 写论文的第五天 hive安装

    Hive的安装和使用 我们的版本约定: JAVA_HOME=/usr/local /jdk1.8.0_191 HADOOP_HOME=/usr/local/hadoop HIVE_HOME=/usr/ ...