白话Spring(基础篇)---IOC

通过自由恋爱与包办婚姻的比喻,介绍了Spring框架中IOC(控制反转)的概念。使用实例展示了传统对象创建方式与使用Spring IOC容器管理对象生命周期的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[一知半解,就是给自己挖坑]

Spring的IOC(Inversion of Control,控制反转)是一个非常重要的概念,但是,对于初学者的看过的大多数资料要么解释的讳莫如深,要么看完不知所云。接下来,我们先举一个实际的例子来类比程序中的IOC概念。另外,我们这里仅仅介绍概念及使用。对于Spring源码的解读,将会在高级篇中进行介绍,敬请期待!

准备工作:

a.操作系统:win7 x64

b.开发工具:eclipse mars j2ee版本,maven3.3.2,Spring 4

-----------------------------------------序言---------------------------------------------------------------------------------------------------------

我们先以自由恋爱和包办婚姻来举个例子吧!

假设:有一个男孩叫小明,有一个事件叫结婚,有多个女孩分别叫小美,小丽等。

在自由恋爱时,即当没有使用控制反转时:小明与女孩结婚。那么小明首先需要寻找一个合适的对象,再针对这个对象进行各种形式的追求,最后才能结婚。结婚这个动作从开始到结束一直"强制"的绑定了双方,在代码中是一种紧耦合的表现。在这个过程里,小明为了结婚,付出了很大的“牺牲”,如果运气不好,再来一次的话,那么从寻找对象到结婚这个动作又必须重来。

在包办婚姻情况下,即当使用控制反转时:小明想要结婚,那么Spring在结婚双方之间就像是婚介所(也可以换成父母),它管理所有女孩的信息,小明只要说:我想找个上得厅堂,下得厨房的妹子,那么婚介所从这么多女孩中寻找到符合要求的人提供给小明,他们直接结婚即可。如果小明在结婚时问“是否愿意嫁给我”女孩回答“不愿意”的话,那么程序直接就报错。因此,小明可以看作是一直“站在民政局门口”,只要成功的取得一个对象,那么马上就能完成“结婚”这个动作。

我们古人是多么智慧!多么先进!

------------------------------------------------------------------------------------------------------------------------------------------------------

正文开始:

一.我们先来看看“自由恋爱”情况下的“结婚动作”发生的全过程

1.1.以maven创建Spring02工程,创建步骤请参考:Maven简明教程(3)---在eclipse中创建工程与基本命令介绍,创建成功之后工程结构图如下所示:


1.2.pom文件的内容请参考前文helloworld,这里不在赘述。

1.3.创建Boy.java,具体内容如下:

package com.java.ingo.boy;
import com.java.ingo.service.GetMarried;

/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年2月28日上午8:47:57
*类说明
*/
public class Boy {
	public static void main(String[] args) {
		GetMarried getMarried = new GetMarried();
		getMarried.getMarried();
	}	
}
1.4.创建GetMarried.java,具体package com.java.ingo.service;
package com.java.ingo.service;

import com.java.ingo.girl.XiaoMei;

/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年2月28日上午8:54:24
*类说明
*/
public class GetMarried {
	public void getMarried(){
		XiaoMei xm = new XiaoMei();
		//追求女生。。。。
		//旅游。。。
		//看电影。。。
		//玫瑰花。。。
		//逗开心。。。
		xm.sayYes();
	}
}
1.5.创建XiaoMei.java。具体内容如下:

package com.java.ingo.girl;
/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年2月28日上午8:48:55
*类说明
*/
public class XiaoMei {
	public void sayYes(){
		System.out.println("XiaoMei:"+"Yes,I do!");
	}
}
1.6.创建XiaoLi.java,具体内容如下:

package com.java.ingo.girl;
/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年2月28日上午9:35:59
*类说明
*/
public class XiaoLi {
	public void sayYes(){
		System.out.println("XiaoLi:"+"Yes,I do!");
	}
}
1.7.测试方法:运行Boy.java中的main方法,就可以看到控制台的输出内容。

此时,我们就发现,当Boy调用getMarried时,我们需要创建XiaoMei对象,并且需要针对当前的XiaoMei对象进行一系列的动作处理,最后,XiaoMei对象才能被我们使用。当我们创建的对象变为XiaoLi时,我们需要修改getMarried中的全部内容,才能使用XiaoLi对象。这么做的缺点显而易见,因此,我们需要转化另外一种方式来改造我们的getMarried方法,使得我们在改变创建的对象是,getMarried方法整体上不用修改。当然,这里的修改方式有多种方式,下面我们就使用java的多态,Spring分别来演示改造方法。

二.使用java多态改造。

2.1改造之后的工程结构如下图所示:


2.2创建Girl.java文件,具体内容如下:

package com.java.ingo.girl;
/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年2月28日上午9:58:18
*类说明
*/
public interface Girl {
	public void sayYes();
}
2.3修改XiaoMei.java,XiaoLi.java实现此接口

2.4修改GetMarried.java文件,具体内容如下:

package com.java.ingo.service;

import com.java.ingo.girl.Girl;

/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年2月28日上午8:54:24
*类说明
*/
public class GetMarried {
	private Girl gril;
	
	public void setGril(Girl gril) {
		this.gril = gril;
	}

	public void getMarried(){
		/**	XiaoMei xm = new XiaoMei();
		//追求女生。。。。
		//旅游。。。
		//看电影。。。
		//玫瑰花。。。
		//逗开心。。。
		xm.sayYes();*/
		gril.sayYes();
	}
}
2.5修改Boy.java,具体内容如下;

package com.java.ingo.boy;
import com.java.ingo.girl.XiaoMei;
import com.java.ingo.service.GetMarried;

/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年2月28日上午8:47:57
*类说明
*/
public class Boy {
	public static void main(String[] args) {
		GetMarried getMarried = new GetMarried();
		getMarried.setGril(new XiaoMei());
		getMarried.getMarried();
	}	
}
2.6如上面所示,当Boy想要使用getMarried时,就不再需要在getMarried中在实现创建对象等动作,而是直接的使用一个符合要求的对象即可。

2.7测试方法:运行Boy.java中的main方法,就可以看到控制台的输出内容。

三.使用Spring来改造

3.1创建beans.xml,存放位置为:src/main/resources下,具体内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="XiaoLi" class="com.java.ingo.girl.XiaoLi"></bean>
  	<bean id="XiaoMei" class="com.java.ingo.girl.XiaoMei"></bean>
  	<bean id="GetMarried" class="com.java.ingo.service.GetMarried">
  		<property name="gril" ref="XiaoLi"></property>
  	</bean>
</beans>
上面的配置文件中,我们首先针对每一个对象创建一条bean。再针对结婚这个动作创建一个bean,并且结婚的bean的内部有一个结婚对象的属性,属性名称对应与GetMarried.java中的属性名称,属性的值使用ref来设置为另外两个bean的id值。关于这个属性的设置及用法,我们将在后续文章中进行介绍,敬请期待!

3.2修改Boy.java文件,具体内容如下:

package com.java.ingo.boy;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.java.ingo.girl.XiaoMei;
import com.java.ingo.service.GetMarried;

/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年2月28日上午8:47:57
*类说明
*/
public class Boy {
	public static void main(String[] args) {
		//首先读取配置文件,配置文件中的bean将会保存到ApplicationContext的实例中
		ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:beans.xml");
		//从ApplicationContext的实例中按照id值获取对应类的实例对象,并且需要进行强制类型
		GetMarried gm = (GetMarried) ac.getBean("GetMarried");
		//使用对象的内部方法,就像我们使用new创建的对象一样
		gm.getMarried();
	}	
}
从main方法中,我们可以看到,只保留了结婚的动作,彻底的隐藏了结婚对象。而结婚的对象交给spring去管理。当结婚对象发生改变时,我们修改的是spring配置文件,而不是源代码。

3.3测试方法:运行Boy.java中的main方法,就可以看到控制台的输出内容。

--------------------------------------------------------------------------------------------------------------------------------------------------------
至此,白话Spring(基础篇)---IOC结束


备注:

本文基于前文maven教程与Spring--helloworld工程来创建和使用,如果有读者对于工程的建立有疑问,请参考前文内容,在进行理解。

参考资料:

Spring官网:http://spring.io/docs

其他博文:http://blog.youkuaiyun.com/it_man/article/details/4402245













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值