在Spring 2.0以后的版本中,Spring的bean作用域机制是可以自定义扩展的。这意味着,我们不仅可以使用Spring提供的预定义bean作用域; 还可以定义自己的作用域,甚至重新定义现有的作用域(但是不提倡这么做,而且不能覆盖内置的singleton和prototype作用域)
作用域由接口org.springframework.beans.factory.config.Scope定义。要将自定义作用域集成到Spring容器中,需要实现该接口。
实现scope接口
public class ThreadScop implements Scope {
private final ThreadLocal<Map<String,Object>> threadSCope= new ThreadLocal<Map<String, Object>>() {
protected Map<String, Object> initialValue() {
return new HashMap<String, Object>();
}
};
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
Map<String,Object> scope=threadSCope.get();
Object obj=scope.get(name);
if (obj==null){
obj=objectFactory.getObject();
scope.put(name,obj);
}
return obj;
}
@Override
public Object remove(String name) {
Map<String,Object>scope=threadSCope.get();
return scope.remove(name);
}
@Override
public void registerDestructionCallback(String s, Runnable runnable) {
}
@Override
public Object resolveContextualObject(String s) {
return null;
}
@Override
public String getConversationId() {
return null;
}
}
实现一个或多个自定义Scope后,接下来就是如何让Spring容器识别新作用域。
实现BeanFactoryPostProcessor
public class RegisterCustScope implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
configurableListableBeanFactory.registerScope("therad",new ThreadScop());
}
}
xml配置自定义Bean作用域:
<bean id="owner" class="org.sl.mgrhouse.eneities.Owner" scope="therad"></bean>
本文介绍了如何在Spring 2.0以后的版本中扩展bean作用域,通过实现Scope接口创建了一个ThreadScope示例。这个自定义作用域使得每个线程拥有独立的bean实例。此外,还展示了如何通过实现BeanFactoryPostProcessor接口并将自定义作用域注册到Spring容器中。最后,给出了在XML配置中使用自定义作用域的例子。
1386

被折叠的 条评论
为什么被折叠?



