Spring配置文件bean标签的创建
resources目录下的applicationContext.xml(Spring的配置文件)
当scope取值为"singleton"时
<?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="userDao" class="com.yiheng.dao.impl.UserDaoImpl" scope="singleton"></bean>
</beans>
UserDaoImpl.java
package com.yiheng.dao.impl;
import com.yiheng.dao.UserDao;
public class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("UserDaoImpl创建");
}
@Override
public void save() {
System.out.println("save.....");
}
}
UserDao接口
package com.yiheng.dao;
public interface UserDao {
public void save();
}
下面是一个测试代码片
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao)app.getBean("userDao");
UserDao userDao2 = (UserDao)app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
1、当Spring的配置文件中本标签中的scope=“singleton”时
测试结果为:
结论:可以看出UserDaoImpl只创建了一次,测试输出两次同一个地址。所以当scope=“singleton”时,bean的实例化个数是1个
2、当Spring的配置文件中本标签中的scope=“prototype”时
测试结果为:
结论:UserDaoImpl创建了两次,测试输出了不同的地址,所以当scope=“prototype”时,bean的实例化个数是多个
下面我们猜测当scope取singleton和prototype时,bean的实例化时机是否一样
当scope取singleton时
我们在如图位置添加断点
可以看出当程序运行完ApplicationContext app = new ClassPathXmlApplicationContext(“applicationContext.xml”)这一行,UserDaoImpl就实例化成功了,可以看出当调用完Spring的配置文件applicationContext.xml,就已经创建了bean。
当scope取prototype时
运行完ApplicationContext app = new ClassPathXmlApplicationContext(“applicationContext.xml”)这一行,没有输出
接着程序往下走一步
再走一步
结论:
1、当Spring的配置文件的bean标签的scope属性取值为singleton时,在运行Spring配置文件(创建容器)时就创建UserDaoImpl。
2、scope属性取值为prototype时,在运行Spring配置文件时没有创建UserDaoImpl,而是在getBean(使用对象)时创建UserDaoImpl。