学习过Spring的朋友都知道,Spring的核心就是一个容器,它实现了IOC的概念,可以协助管理各个对象的生命周期,以及对象之间的依赖关系。在核心容器的使用上,熟悉BeanFactory与ApplicationContext的运用是了解Spring的重点所在。所谓IoC就是一个用XML来定义生成对象的模式,个人大体有一点的理解就是假设对象之间存在依赖关系时,则被依赖对象会主动去找依赖对象,也就是所谓的变被动为主动。对象需要什么,我就会给你提供什么并主动找上门来,还有就是通过XML配置文件配置bean,也就是通过对bean的配置来配置各个对象之间的关系结构,不知道我理解正确了没。
这里简单的以一个实例实现来看看Spring的IOC是如何帮助我们管理对象的。
首先建立数据模型:
接口类:Chinese(中国人)
实现此接口的子类:ChongQing(重庆)
实现此接口的子类:ChengDu(成都)
数据模型图:

源代码如下:

Chinese.java
package com.easyjf.SpringIOC;


/** *//**
* 中国人
*
* @author 冷雨 http://www.easyjf.com
*
*/

public interface Chinese ...{

/** *//**
* 到不同的城市去旅游
*/
void tour();
}
ChongQing.java
package com.easyjf.SpringIOC;


/** *//**
* 重庆
*
* @author 冷雨 http://www.easyjf.com
*
*/

public class ChongQing implements Chinese ...{


public void tour() ...{
System.out.println("重庆火锅好好吃哟!PLMM也多.");
}
}


ChengDu.java
package com.easyjf.SpringIOC;


/** *//**
* 成都
*
* @author 冷雨 http://www.easyjf.com
*
*/

public class ChengDu implements Chinese ...{


public void tour() ...{
System.out.println("成都的高楼没重庆的多,不过到处都是茶馆。");
}

}

现在再在项目的classpath下创建一个maowei.xml配置文件位置如下图,注意不要看花眼把它看成com.easyjf.SpringIOC目录下了,其实它是与com.easyjf.SpringIOC目录同级别的。
maowei.xml配置文件内容为:
xml version="1.0" encoding="UTF-8"?>
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="ChengDu" class="com.easyjf.SpringIOC.ChengDu" />
<bean id="ChongQing" class="com.easyjf.SpringIOC.ChongQing" />
beans>
好了,现在再建立一个测试类SpringDemo.java内容为:

package com.easyjf.SpringIOC;

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

/** *//**
* 测试BEAN
*
* @author 冷雨 http://www.easyjf.com
*
*/

public class SpringDemo ...{

public static void main(String[] args) ...{
// 使用此方式加载XML文件,默认会到项目的根目录下去查找该文件
// ApplicationContext context = new FileSystemXmlApplicationContext(
// "maowei.xml");

// 使用此方式加载XML文件,默认会到项目的classpath根目录下去查找该文件
ApplicationContext context = new ClassPathXmlApplicationContext(
"maowei.xml");
Chinese cq = (Chinese) context.getBean("ChongQing");
cq.tour();
System.out.println("-----------------");
Chinese cd = (Chinese) context.getBean("ChengDu");
cd.tour();
}
}
执行结果如下:

再回头看原来的maowei.xml文件的这一句:
<bean id="ChongQing" class="com.easyjf.SpringIOC.ChongQing" />
id就是context.getBean的参数值,一个字符串。class就是一个类(包名+类名)。然后在SpringDemo类里获得ChongQing对象的就是这么一句。
Chinese cq = (Chinese) context.getBean("ChongQing");
因为getBean方法返回的是Object类型,所以前面要加一个类型转换。
总结:
也许有朋友会想,本来是很简单的一件事,为什么要搞得看起这么复杂呢。直接通过工厂模式还不需要配置就可以搞定这一切,IOC看起反而还麻烦多了。
是的,也许这只是一个小的项目,但好好想想,IOC这样做了自少我觉得有两大好处:
大大降低了程序的耦合度。
2.举个例子,如果用户需求发生变化,要把ChongQing类修改一下。如果使用工厂模式,就要更改Factory类的方法,并且重新编译布署。而IoC只需要将class属性改变一下,并且由于IoC利用了Java反射机制,这些对象是动态生成的,这时我们就可以热插拨ChongQing对象(不必把原程序停止下来重新编译布署)
在spring中,IOC容器的实际代表就是BeanFactory,IOC容器负责载入在配置元数据中描述的bean,并对bean进行管理
Spring的中IOC容器是为程序员管理Bean而设立的,但是Bean是如何创建,它们的生存周期是什么样子的,他们的作用域分别是什么呢? 在这里就不长篇大论,不过推荐初学Spring的朋友大家看看《Spring技术手册》这本书,或到http://www.easyjf.com这个站上去收集资料。