深入浅出Spring(二)
IoC概念
控制反转(Inversion of Control)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 它还有一个名字叫做依赖注入(Dependency Injection)。IoC不是什么技术,它是一种设计模式。
实例演示
为了更好的说明IoC,我为大家举一个简单的例子,如有这样一个描述:某公司新成立了一个项目组,项目组有若干成员和一个项目组长,项目组成立后第一次开会上,作为项目组长的小李按照惯例首先做了简短的自我介绍。
根据上述的描述,如果我们写出如下代码和类图:
public class Li { public void introduce() { System.out.println("大家好,我是小李"); } } public class Team { public void firstMeeting() { Li li = new Li(); li.introduce(); } }
具体类图如下:

上述的代码,应该说基本完成了相关的需求,但是仔细考虑之后就会发现,上述的代码是根据具体的场景描述进行的,并没有进行抽象,这样就导致我们不能灵活的安排项目组长去做开场,即根据现在的代码,开场自我介绍被绑定给了小李而不能安排给其他人。为了解决上述的问题,我们引入首先引入Leader接口,相关代码和类图如下:
public interface Leader { public void introduce(); } public class Li implements Leader { @Override public void introduce() { System.out.println("大家好,我是小李"); } } public class Team { public void firstMeeting() { Leader li = new Li(); li.introduce(); } }
具体类图如下:

虽然上述的代码可以让我们安排给其他成员开场,但是我们可以看出Team类同时依赖Leader接口和Li类,并没有达到我们所期望的Team仅仅依赖于Leader接口的目的,如何解决这个问题呢?当然是引入Boss,由Boss决定具体由谁担任项目组长。具体类图和代码如下:
public interface Leader { public void introduce(); } public class Li implements Leader { @Override public void introduce() { System.out.println("大家好,我是小李"); } } public class Team { public void firstMetting(Leader leader){ leader.introduce(); } } public class Boss { public void direct(){ Leader leader = new Li(); Team team = new Team(); team.firstMetting(leader); } }
具体类图如下:

通过以上代码和图示,我们可以看出,通过引入老板类,我们将项目小组和具体由谁担任项目组长进行解耦。
对应上述例子,我们再来讲解一下IoC,IoC从字面上看分为控制和反转,控制在上面的实例中就是具体由谁担任项目组长,而反转就是将决定谁担任项目组长转移到Boss类中。通俗理解就是将接口的具体实现类(Li)的控制权从调用类(Team)中分离转交给第三方(Boss)决定。
深入浅出Spring(二)的更多相关文章
- 深入浅出Spring(二) IoC详解
上次的博客深入浅出Spring(一)Spring概述中,我给大家简单介绍了一下Spring相关概念.重点是这么一句:Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面 ...
- [MVC] 深入浅出Spring MVC
[MVC] 深入浅出Spring MVC 转:http://4925054.blog.51cto.com/4915054/1176855 Spring MVC主要包括以下要点: 1:由Dispatch ...
- 深入浅出Spring(四) Spring实例分析
上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...
- [置顶] 深入浅出Spring(三) AOP详解
上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...
- 深入浅出 JMS(二) - ActiveMQ 入门指南
深入浅出 JMS(二) - ActiveMQ 入门指南 上篇博文深入浅出 JMS(一) – JMS 基本概念,我们介绍了消息通信的规范JMS,这篇博文介绍一款开源的 JMS 具体实现-- Active ...
- 深入浅出Spring(三) AOP详解
上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...
- [置顶] 深入浅出Spring(四) Spring实例分析
上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...
- 06.深入浅出 Spring Boot - 数据访问之Druid
代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.Druid是什么? 1.Druid是数据库连接池,功能.性能.扩展性方面都算不错 ...
- 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...
- 深入浅出Spring(五) SpringMVC
上一篇深入浅出Spring(四) Spring实例分析的博文中,咱们已经可以了解Spring框架的运行原理和实现过程,接下来咱们继续讲解Spring的一个延伸产品——Spring MVC 1.Spri ...
随机推荐
- 全方面讲解TensorFlow
任何曾经试图在 Python 中只利用 NumPy 编写神经网络代码的人都知道那是多么麻烦.编写一个简单的一层前馈网络的代码尚且需要 40 多行代码,当增加层数时,编写代码将会更加困难,执行时间也会更 ...
- Element-ui-安装
1.node环境安装 1.1.根据自己电脑位数,下载最新版node.js并安装https://nodejs.org/en/ 1.2.下载git并安装https://gitforwindows.org/ ...
- PHP函数preg_match()
部分内容来自:http://www.nowamagic.net/librarys/veda/detail/1054 preg_match — 进行正则表达式匹配. 语法:int preg_match ...
- numpy.array 基本操作
import numpy as np np.random.seed(0) x = np.arange(10) x """ array([0, 1, 2, 3, 4, 5, ...
- csp模拟69
考试一眼看出$T3$原题,但是没做过,心态爆炸. 然后去看$T1$,迷之认为它是矩阵快速幂?推了一个小时,发现在转移过程中方案数并不均匀分布,然后就挂了. 决定先去看T3,只会$O(n\sqrt{n} ...
- 差异---虐爆了yxs的 后缀数组裸题 板子题 单调栈的简单应用 字符串的基础理解考察题
先玩柿子,发现可以拆开,前半部分可以瞬间求出,于是只求后半部分 然后抄板子就好了,完结撒花! 下边是个人口胡,因为已经被虐爆头脑不清醒了 定义:LCP(a,b)为排名为a,b两个后缀的最长公共前缀 证 ...
- FastJson稍微使用不当就会导致StackOverflow
GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...
- Python基础语法,他其实很贵!
# -*- coding:utf-8 -*- # @Time :2019/7/19 11:26# @Author :ITester# @Email :1036881587@qq.com# @File ...
- 使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- C++ 11新标准实现POJ No.1002-487-3279
487-3279(重复的电话号码查询)(标签:优先队列,哈希表) 题目描述 企业喜欢用容易被记住的电话号码.让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语.例如,你需要给滑铁卢大学 ...