在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>