Spring bean 的作用域
🏷️ Spring
Spring 定义了多种作用域,可以基于这些作用域创建 bean
。
单例(
Singleton
):在整个应用中,只创建bean
的一个实例原型(
Prototype
):每次注入或者通过 Spring 应用上下文获取时,都会创建一个新的bean
实例会话(
Session
):在 Web 应用中,为每个会话创建一个bean
实例请求(
Request
):在 Web 应用中,为每个请求创建一个bean
实例
默认是单例的作用域,使用 @Scope
注解可以改变作用域。
java
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DbConfig {}
XML 文件中的可以使用 bean
标签的 scope
属性改变作用域。
xml
<bean id="dbConfig" class="xmlbean.DbConfig" scope="prototype">
</bean>
使用会话和请求作用域
java
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.INTERFACES)
同时还使用了一个 proxyMode
属性,它被设置成 ScopedProxyMode.INTERFACES
。这个属性解决了将会话或者请求作用域的 bean
注入到单例 bean
中所遇到的问题。
在 XML 文件中配置代理 proxy
(使用 aop 命名空间)
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="dbConfig" class="xmlbean.DbConfig" scope="prototype">
<aop:scoped-proxy proxy-target-class="false" />
</bean>
</beans>