类型
XML配置文件定义Scope时,bean标签使用scope属性即可
Scope |
描述 |
singleton |
spring IoC 容器只存在一个bean 对象实例。 |
prototype |
与单例相反,每次请求bean 时,它都会创建一个新实例。 |
request |
在HTTP 请求(Request ) 的完整生命周期中,将创建并使用单个实例。 只适用于web 环境中Spring ApplicationContext 中有效。 |
session |
在HTTP 会话(Session ) 的完整生命周期中,将创建并使用单个实例。 只适用于web 环境中Spring ApplicationContext 中有效。 |
application |
将在ServletContext 的完整生命周期中创建并使用单个实例。只适用于web 环境中Spring ApplicationContext 中有效。 |
websocket |
在WebSocket的完整生命周期中,将创建并使用单个实例。 只适用于web 环境中Spring ApplicationContext 中有效。 |
singleton和prototype的区别
singleton
多次获取同一个bean时,获取到的是同一个对象,这是Spring默认的,可以不用说明(即bean标签可以省略scope属性)
beans.xml
1 2 3 4 5 6 7 8 9 10
| <?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="user" class="entity.User"> <property name="id" value="1"/> <property name="name" value="tom"/> </bean> </beans>
|
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import config.MyConfig; import entity.Student; import entity.StudentClass; import entity.User; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User user1 = context.getBean("user", User.class); User user2 = context.getBean("user", User.class); System.out.println(user1==user2); } }
|
结果
控制台打印出true
prototype
多次获取同一个bean时,获取到的是不同的对象,因为每一次获取都会生成一个新的对象
beans.xml
1 2 3 4 5 6 7 8 9 10
| <?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="user" class="entity.User" scope="prototype"> <property name="id" value="1"/> <property name="name" value="tom"/> </bean> </beans>
|
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import config.MyConfig; import entity.Student; import entity.StudentClass; import entity.User; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User user1 = context.getBean("user", User.class); User user2 = context.getBean("user", User.class); System.out.println(user1==user2); } }
|
结果
控制台打印出false