- Bean 作用域机制是可扩展的。当默认的作用域无法满足业务需求时,除了使用 Spring 已经定义好的作用域之外,还可以自定义 bean 的作用域,甚至重新定义现有范围。
- 创建自定义作用域,需要实现 org.springframework.beans.factory.config.Scope 接口,然后注册到Spring 容器中
- Scope 接口提供了以下方法,从范围中获取对象,从范围中删除对象,然后销毁
方法 |
说明 |
get(String name, ObjectFactory objectFactory) |
从基础范围返回对象 |
remove(String name) |
从基础范围中删除该对象 |
registerDestructionCallback(String name, Runnable destructionCallback) |
注册在销毁作用域或销毁作用域中的指定对象时作用域应执行的回调 |
getConversationId() |
获取基础范围的会话标识符 |
resolveContextualObject(String key) |
据给定的键(key)查找并返回与之相关联的中的上下文对象 |
- 在实现一个或多个自定义 Scope 并测试通过之后,接下来便是如何让 Spring 容器来识别新的作用域。Spring 容器中提供了 registerScope 方法来注册新的作用域。
void registerScope(String scopeName, Scope scope);
- 第一个参数是与作用域相关的全局唯一的名称,第二个参数是准备实现的作用域的实例,就是实现 Scope 接口的实例。
例如实现 Scope 接口的类为 SimpleThreadScope,要实现的自定义的 bean 的作用域的名称为 “thread”
示例
- SpringTest.java
Scope threadScope = new SimpleThreadScope();
beanFactory.registerScope("thread", threadScope);
- application.xml
<bean id="..." class="..." scope="thread">
<bean id="bar" class="x.y.Bar" scope="thread">
<property name="name" value="Rick"/>
</bean>
注
- 自定义作用域不能覆盖内置的 singleton 和 prototype 范围。