Skip to content

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>