更改配置文件后执行main方法类,输出:
none
runnerBeanOne
none
runnerBeanOne
runnerBeanOne
可以看出runnerBeanOne与runnerBeanTwo中引用的singletonBean已经不是同一个对象了,因为虽然都是SingletonBean类,但是在配置文件中作出了两个Bean的定义,而Spring的单例模式只保证每个Bean的定义只存在一个实例。
接下来看前面说到的第一点,1.每个Spring Container中定义的Bean只存在一个实例。
使用改动之前的Spring配置文件,并更改main方法类如下:
[java]
package beanscope;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanScopceMain
{
/**
* @comment [注释说明]
* @author 荣磊, 2012-7-17
*
* @param args
*/
public static void main(String[] args)
{
String springConfig = "beanscope/spring-config.xml";
//创建一个SpringContainer
ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);
/****************************
* 创建另外一个SpringContainer
********/
ApplicationContext context2 = new ClassPathXmlApplicationContext(springConfig);
//通过SpringContainer取得runnerBeanOne
RunnerBeanRefToSingletonBean runnerBeanOne =
context.getBean("runnerBeanOne", RunnerBeanRefToSingletonBean.class);
/**************************************************
* 通过新创建的另外一个SpringContainer取得runnerBeanTwo
*****************/
RunnerBeanRefToSingletonBeanTwo runnerBeanTwo =
context2.getBean("runnerBeanTwo", RunnerBeanRefToSingletonBeanTwo.class);
//通过SpringContainer取得singletonBean
SingletonBean singletonBean =
context.getBean("singletonBean", SingletonBean.class);
//输出上一次操作singltonBean的Bean名称,
//因为在这之前没有对singletonBean的lastOperatedBy
//属性进行初始化,所以这里应该会输出none
singletonBean.showLastOperateBean();
//设置runnerBeanOne中singletonBean对象的上一次操作者
//信息为runnerBeanOne
runnerBeanOne.setMyNameToSingletonBean();
//通过singletonBean输出上一次操作者信息
singletonBean.showLastOperateBean();
//输出runnerBeanTwo中应用的singletonBean对象的上一次操作者信息
runnerBeanTwo.showLastOprBeanOfSingletonBean();
//设置runnerBeanOne中singletonBean对象的上一次操作者信息为runnerBeanTwo
runnerBeanTwo.setMyNameToSingletonBean();
//通过singletonBean输出上一次操作者信息
singletonBean.showLastOperateBean();
//输出runnerBeanOne中应用的singletonBean对象的上一次操作者信息
runnerBeanOne.showLastOprBeanOfSingletonBean();
}
}
输出结果:
none
runnerBeanOne
none
runnerBeanOne
runnerBeanOne
在上边的代码中创建了两个SpringContainer对象 context 和 context2.分别用context和context2获取runnerBeanOne与runnerBeanTwo,再进行操作与输出,从结果来看他们分别应用的singletonBean对象同样是两个不同的对象。虽然在配置文件中两个runnerBean都引用了同一个singletonBean定义,但是因为是通过不同的SpringContainer创建的,所以仍然创建除了两个singletonBean对象这就可以理解第一点:1.每个Spring Container中定义的Bean只存在一个实例。
Spring默认是以上述单例模式创建对象的,但是通过Bean标签中的设置scope="prototype"可以设置Spring不再以单例模式创建对象,而是每次都创建新的对象。在上边的例子中,如果不再定义两个runnerBean,而是指定义一个runnerBean,但是给他设置属性scope=“prototype”,那在main方法中就可以通过同一