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. Apache Tomcat 绿色版安装Service(服务)

    1.配置CATALINA_HOME的环境变量:  变量名:CATALINA_HOME  值:tomcat安装或解压的根目录如:c:\Apache tomcat6.0 2.开始->运行->c ...

  2. Python基础之用户交互、流程控制、循环语句

    python的简洁性真的令人叹为观止,没有JAVA那种输入还要导个包,不学不知道,一学吓一跳啊! 我在学这些基础的时候,会把python和java.c做对比,这样更好的理解记忆! 用户交互(输入) i ...

  3. 小白开学Asp.Net Core 《十》

    小白开学Asp.Net Core <十> — — Session.Cookie.Cache(老生常谈) 一.背景 在常谈Session和Cookie之前我们先来简单的了解下Http(可以说 ...

  4. 数据类型之Integer与int

    数据类型之Integer与int Java入门  基本数据类型 众所周知,Java是面向对象的语言,一切皆对象.但是为了兼容人类根深蒂固的数据处理习惯,加快常规数据的处理速度,提供了9种基本数据类型, ...

  5. codeforces 322 B Ciel and Flowers

    题目链接 有红绿蓝三种颜色的画,每种拿三朵可以组成一束花,或者各拿一朵组成花束,告诉你每种花的数目,求出可能组成最多的花束. 如果你的代码过不了,考虑一下 8 8 9这种组合.  因为数据量很大,我的 ...

  6. 基于python的Elasticsearch索引的建立和数据的上传

    这是我的第一篇博客,还请大家多多指点 Thanks ♪(・ω・)ノ         今天我想讲一讲关于Elasticsearch的索引建立,当然提前是你已经安装部署好Elasticsearch. ok ...

  7. spark shuffle写操作之SortShuffleWriter

    提出问题 1. spark shuffle的预聚合操作是如何做的,其中底层的数据结构是什么?在数据写入到内存中有预聚合,在读溢出文件合并到最终的文件时是否也有预聚合操作? 2. shuffle数据的排 ...

  8. containerd与kubernetes集成

    kubernetes集群三步安装 概念介绍 cri (Container runtime interface) cri is a containerd plugin implementation of ...

  9. 【译】尝试使用Nullable Reference Types

    随着.NET Core 3.0 Preview 7的发布,C#8.0已被认为是“功能完整”的.这意味着它们的最大亮点Nullable Reference Types,在行为方面也被锁定在.NET Co ...

  10. alluxio2.0特性-预览

    项目地址 https://github.com/Alluxio/alluxio/tree/branch-2.0-preview 2.0版本-构思和设计 支持超大规模数据工作负载 Alluxio作为计算 ...