Spring——IOC容器基本概念

Posted 任长江

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring——IOC容器基本概念相关的知识,希望对你有一定的参考价值。

        前一段时间在学习Spring,感觉Spring确实挺有魅力的,学习之后,对学过的知识简单的做一下总结,如果要总结IOC容器自然是少不了的,我前边有过一篇文章来介绍IOC的思想,但是没有涉及到Spring容器,在这里结合着Spring容器来看一下IOC的相关知识和美妙之处吧!IOC是Spring容器的核心,Spring的AOP和声明式事务等功能的实现都依赖于IOC容器的存在。

        写着写着博客突然想我女朋友了,也不知道她现在吃饭了没有,开心不开心,现在在哪儿,叫什么名字!哈哈…..,小开一个玩笑!一个小猿需要找到女朋友帮他做家务,下面以一个小猿找女朋友来介绍一下IOC容器吧,哈哈…..,都是套路,慢慢都快跟上城里人脚步了。

        按说小猿(XiaoYuan)找女朋友应该是这样的,假设小猿喜欢小丽(XiaoLi),那么小猿就想要小丽能成为他的对象,于是程序就是这样的:

public class XiaoYuan 
	public void findGirlDo()
 		//直接找到小丽
		XiaoLi girl = new XiaoLi();
		girl.doHouseWork();
	

UML:


        但是情况并非小猿想的那么好,因为,小丽并不喜欢他,那么于是,小猿开始想,既然小丽不能成为他的对象,那么一个和小丽条件差不多的女孩(Girl)也行,于是上边的程序变成了下边的这样:

public class XiaoYuan 
	public void findGirlDo()
		//对XiaoLi的依赖减弱,new的可以不是XiaoLi
		Girl girl = new XiaoLi();
		girl.doHouseWork();
	

UML:


        小猿总是不幸的,现在这世道就算是连一个和小丽条件差不多的女孩也找不到啊,哎,于是,小猿心里暗自思量,算了,是个女孩就行了,情况更糟糕的是,小猿身边已经没有女孩了,只能通过媒婆(MatchMaker)来介绍一下了,于是,就有了下边的程序。

public class XiaoYuan 
	private Girl girl;
	//用来将对象注入进来
	public XiaoYuan(Girl girl)
		this.girl = girl;
	
	//让女孩做家务
	public void findGirlDo()
		girl.doHouseWork();
	
public class MatchMaker 
	public void match()
		//媒婆找到小丽这个女孩
		Girl girl = new XiaoLi();
		//媒婆找到小猿,把小丽介绍给小猿。
		XiaoYuan xiaoYuan = new XiaoYuan(girl);
		//小猿让小丽帮他做家务
		xiaoYuan.findGirlDo();
	

UML:


        好吧,那么这就符合IOC的概念了,控制反转,控制(选择对象的权利)反转(选择对象的权利小猿已交给了媒婆了)

        下边继续介绍一下IOC注入的三种方式,其实对照上边的故事来说就是,如果媒婆找到了一个比较适合的对象后,小猿需要媒婆通过什么样的方式把对象介绍给他。

1、构造函数注入:

        上边的程序就是构造函数注入,这种情况就是小猿着实着急了,只要一被媒婆通知过去就非要领一个对象回去不可了。也就是在new小猿的时候就引入了一个对象。

2、属性注入:

        这种情况就是,媒婆把小猿叫过去,小猿还要考虑一下,这个女孩能不能跟我一起走下去,如果可以那就通过set方法将女孩注入进来,表示同意。用程序表示如下:

public class XiaoYuan 
	private Girl girl;
	//set方法将对象注入
	public void setGirl(Girl girl) 
		this.girl = girl;
	
	//让女孩做家务
	public void findGirlDo()
		girl.doHouseWork();
	

3、接口注入:

        接口注入其实和属性注入是一样的,只是,属性注入用的是属性的set方法,而接口注入是让小猿实现一个接口,在接口的一个方法中进行注入。程序如下:

public class XiaoYuan implements InjectGirl
	private Girl girl;
	//set方法将对象注入
	public void inject(Girl girl) 
		this.girl = girl;
	
	//让女孩做家务
	public void findGirlDo()
		girl.doHouseWork();
	

        通过上边小猿找对象的过程可以看出,小猿对小丽的依赖性越来越弱,最开始小猿完全依赖于小丽,后边,小猿不再那么依赖于小丽,只要跟小丽条件差不多的女孩就可以,但是还是存有依赖,再后边小猿就不再依赖于小丽了,这种依赖关系转交给了媒婆,媒婆既可以介绍小丽给小猿,也可以介绍一个和小丽条件差不多的女孩给小猿。但是现在还是存在一个问题,那就是媒婆和小猿以及女孩之间还是存在依赖关系,现在出来了一个机构,这个机构可以实现这样一个功能,只要小猿在这个机构登记一下,后边的事情这个机构就包办了,比如小猿在这个机构里登记了我想找一个女孩,小丽是个女孩也在这个机构登记了,那么这个机构就从介绍到婚事就全包办了。

<bean id="girl" class="com.test.XiaoLi"></bean>
<bean id="XiaoYuan" class="com.test.XiaoYuan" p:girl-ref="girl"></bean>

        Spring就是这样一个机构(术语叫容器),Spring为注册的Bean提供了一系列的服务,从实例化到Bean之间的装配都可以实现。这也是容器这个概念的基本理解,它为放入到这个容器中的对象提供一系列的服务。

        这篇文章就介绍到这里吧,到这里只是介绍了一下IOC的一个基本概念,后边再介绍Spring中IOC的其他相关知识吧。

以上是关于Spring——IOC容器基本概念的主要内容,如果未能解决你的问题,请参考以下文章

Spring学习---Spring IoC容器的核心原理

Spring5 框架基本概念

spring ioc 容器概念

#yyds干货盘点# Spring核心原理之IoC容器初体验

Spring 5IOC 容器

Spring入门篇——第2章 Spring IOC容器