Spring(6) bean的scope属性
- 在配置bean的时候,如果不指定scope属性的话,spring默认采用singleton,也就是单例模式创建实例的。这样不管请求多少次id,都只会创建一个实例而已。只有当显示指定scope属性为prototype的时候,才会一次请求就产生一个实例。
- 下面是实例代码,程序结构
-
<?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"> <!--配置一个singleton--> <bean id="p1" class="service.Person"/> <!--配置一个prototype实例--> <bean id="p2" class="service.Person" scope="prototype"/> <bean id="date" class="java.util.Date"/> </beans>
package service; public class Person{ }
package main; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class BeanTest { public static void main(String []args) throws Exception{ // 通过例子可以看到,如果不指定scope属性的话,默认是使用singleton,也就是单例模式来创建实例的 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans3.xml"); System.out.println(applicationContext.getBean("p1") == applicationContext.getBean("p1")); System.out.println(applicationContext.getBean("p2") == applicationContext.getBean("p2")); // 尽管程序阻塞了一秒钟,但是输出的时间是一样的,因为spring只创建了一个date实例 System.out.println(applicationContext.getBean("date")); Thread.sleep(1000); System.out.println(applicationContext.getBean("date")); } } //运行程序看到输出 // true // false // Sun Dec 02 13:50:11 CST 2018 // Sun Dec 02 13:50:11 CST 2018
这是我看李刚编著的《轻量级javaEE企业应用实战(第五版)-Struts2+Spring5+Hibernate5/JAP2》后总结出来的。