我想使默认作用域所有bean的请求,但是Spring文档说,默认范围是单身。 (第3.4.1和3.4.2 http://static.springsource.org/spring/docs/2.5.x/reference/beans.html )
我想声明的默认范围是请求范围。
这是到目前为止,我已经找到了最接近的事 - 它已经一段时间没有被感动的缺陷。 jira.springframework.org/browse/SPR-4994?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel#issue-tabs
有一个在弹簧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"/>
但是要记住
此方法不考虑父工厂 。 它只是针对访问该工厂的本地bean定义
所以,上面定义的BeanFactoryPostProcessor时只覆盖你的bean是否在你的WebApplicationContext中定义scope属性
UPDATE
有没有办法来然后覆盖一些默认的“请求”的作用域bean是单身范围是什么?
同样,你应该使用上面提供的相同的BeanFactoryPostProcessor。 我不知道,但我认为你可以设置其范围的唯一方法是通过使用beanDefinition.setScope方法。 并且有很多你可以检索有关任何bean的有用的方法 。 见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");
}
我希望它可以是有用的
文章来源: How to specify the default scope in Spring's applicationContext.xml to request scope?