- Bean的作用域
scope
属性的值一共包括 8 个选项:
- singleton:默认的,单例。
- prototype:原型。每调用一次
getBean()
方法则获取一个新的Bean
对象,或每次注入的时候都是新对象。- request:一个请求对应一个
Bean
,仅限于在 WEB 应用中使用。- session:一个会话对应一个
Bean
,仅限于在 WEB 应用中使用。- global session:portlet 应用中专用的,如果在 Servlet 的 WEB 应用中使用 global session 的话,和 session 一个效果。(portlet 和 servlet 都是规范。servlet 运行在 servlet 容器中,例如 Tomcat。portlet 运行在 portlet 容器中)。
- application:一个应用对应一个
Bean
,仅限于在 WEB 应用中使用。- websocket:一个 websocket 生命周期对应一个
Bean
,仅限于在 WEB 应用中使用。- 自定义 scope:很少使用。
五、Bean的作用域
5.1 singleton和prototype
Spring 默认情况下是如何管理
Bean
的:- 默认情况下
Bean
是单例(singleton
)的。 - 在 Spring 上下文初始化的时候实例化。
- 每一次调用
getBean()
方法的时候,都返回那个单例的对象。
1
2
3
4
5
6
7
8
9
10
11package com.f.spring6.bean;
/**
* @author fzy
* @date 2024/1/18 16:16
*/
public class SpringBean {
public SpringBean() {
System.out.println("SpringBean的无参构造方法执行了...");
}
}1
2
3
4
5
6
<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="springBean" class="com.f.spring6.bean.SpringBean"/>
</beans>1
2
3
4
5
6
7
8
9
10
11
public void testBeanScope() {
// Spring 上下文初始化
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");
SpringBean springBean1 = applicationContext.getBean("springBean", SpringBean.class);
System.out.println(springBean1);
SpringBean springBean2 = applicationContext.getBean("springBean", SpringBean.class);
System.out.println(springBean2);
SpringBean springBean3 = applicationContext.getBean("springBean", SpringBean.class);
System.out.println(springBean3);
}执行结果:
1
2
3
4SpringBean的无参构造方法执行了...
com.f.spring6.bean.SpringBean@614df0a4
com.f.spring6.bean.SpringBean@614df0a4
com.f.spring6.bean.SpringBean@614df0a4- 默认情况下
当将
Bean
的scope
属性设置为prototype
:Bean
是多例(prototype
)的。- Spring 上下文初始化的时候,并不会初始化这些
prototype
的Bean
。 - 每一次调用
getBean()
的时候,实例化Bean
对象。
1
2
3
4
5
6
<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="springBean" class="com.f.spring6.bean.SpringBean" scope="prototype"/>
</beans>执行结果:
1
2
3
4
5
6SpringBean的无参构造方法执行了...
com.f.spring6.bean.SpringBean@53bd8fca
SpringBean的无参构造方法执行了...
com.f.spring6.bean.SpringBean@7642df8f
SpringBean的无参构造方法执行了...
com.f.spring6.bean.SpringBean@3e30646a
5.2 其他scope
scope
属性的值一共包括 8 个选项:- singleton:默认的,单例。
- prototype:原型。每调用一次
getBean()
方法则获取一个新的Bean
对象,或每次注入的时候都是新对象。 - request:一个请求对应一个
Bean
,仅限于在 WEB 应用中使用。 - session:一个会话对应一个
Bean
,仅限于在 WEB 应用中使用。 - global session:portlet 应用中专用的,如果在 Servlet 的 WEB 应用中使用 global session 的话,和 session 一个效果。(portlet 和 servlet 都是规范。servlet 运行在 servlet 容器中,例如 Tomcat。portlet 运行在 portlet 容器中)。
- application:一个应用对应一个
Bean
,仅限于在 WEB 应用中使用。 - websocket:一个 websocket 生命周期对应一个
Bean
,仅限于在 WEB 应用中使用。 - 自定义 scope:很少使用。