没有默认范围在弹簧定义属性beans.xsd文件。但根据BeanDefinition API
扩展bean工厂可能支持进一步的范围。
而且WebApplicationContext - 一个扩展的ApplicationContext支持要求范围
支持除了标准范围“单身”和“原型”
因此,只要是有意义的使用要求当你有一个WebApplicationContext的时候。如果你想注册在WebApplicationContext中定义的请求范围,你必须定义一个BeanFactoryPostProcessor的
public class RequestScopedPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
for(String beanName: factory.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = factory.getBeanDefinition(beanName);
beanDefinition.setScope("request");
}
}
}
而且不要忘记注册您的BeanFactoryPostProcessor
<bean class="RequestScopedPostProcessor"/>
但请记住
所有豆类
此方法不考虑祖先工厂。它只是针对访问该工厂
这样的BeanFactoryPostProcessor上面定义的本地bean定义只是覆盖范围属性你的bean是否在你的WebApplicationContext中定义
UPDATE
有一种方法然后覆盖一些默认的“请求”作用域bean是单身作用域?
您应该再次使用上面提供的相同的BeanFactoryPostProcessor。我不确定,但我认为您可以设置其范围的唯一方法是使用beanDefinition.setScope方法。和有很多有用的方法可以检索关于任何豆的信息。见ConfigurableListableBeanFactory如
...
/**
* Suppose Service is an interface
*
* And you want to define all of Service implementations as singleton
*/
String [] beanNameArray = factory.getBeanNamesForType(Service.class);
for(String beanName: beanNameArray) {
BeanDefinition beanDefinition = factory.getBeanDefinition(beanName);
beanDefinition.setScope("singleton");
}
我希望它可以是有用的
谢谢 - 是有没有办法再覆盖某些默认的“请求”作用域bean是单身作用域?就像在你的例子中那样,setScope(“request”)将改变所有bean来请求作用域,而不是使请求作用域成为新的默认值。 – JAWspeak 2010-07-01 19:47:19
@JAWspeak如果我的回答满足您的需求,请将其标记为已接受。谢谢 – 2010-07-01 23:36:09
你的建议不会使*所有*请求的范围?如果我仍然想要一些单例作用域呢?我知道我可以在我的自定义RequestScopedPostProcessor中做一些事情 - 但可以说“使每个请求都有作用域,除非它已经定义了明确的作用域”。 – JAWspeak 2010-07-04 21:56:09