8.2.2 指定Bean的作用域

8.2.2 指定Bean的作用域

XML方式如何指定Bean的作用域

当使用XML配置方式来配置Bean实例时,可以通过在<bean>元素上设置scope属性来指定Bean实例的作用域,没有指定scope属性的Bean实例的作用域默认是singleton.

通过@Scope指定作用域

当采用零配置方式来管理Bean实例时,可使用@Scope注解,只要在该注解中提供作用域的名称即可。例如可以定义如下Java

1
2
3
4
5
6
7
// 指定该bean的作用域为prototyep
@Scope("prototype")
@Component("axe")
public class SteelAxe implements Axe
{
...
}

自定义作用域

在一些极端的情况下,如果不想使用基于注解的方式来指定作用域,而是希望提供自定义的作用域解析器,让自定义的解析器实现ScopeMetadataResolver接口,并提供自定义的作用域解析策略,然后在配置扫描器时指定自定义的作用域解析器的全限定类名即可。看如下配置片段:

1
2
3
4
5
6
7
8
<beans ...>
...
// 指定自定义的作用域解析器的全限定类名
<context: component-scan
base-package="org.crazyit.app"
scope-resolver="org. crazyit.app.util.MyScopeResolver"/>
...
</beans>

新增的简写的作用域注解

此外,从Spring4.3开始还新增了@ApplicationScope@SessionScope@RequestScope这3个注解,它们分别对应于@Scope("application")@Scope("session")@Scope("request"),且proxyMode属性被设置为ScopedProxyMode.TARGET_CLASS