我想默认使所有bean请求作用域,但是Spring文档说默认作用域是Singleton。 (第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
答案 0 :(得分:3)
spring-beans.xsd文件中没有定义 default-scope 属性。但是根据BeanDefinition API
扩展bean工厂可能支持更多范围。
和WebApplicationContext - 扩展的ApplicationContext支持请求范围
除标准范围“singleton”和“prototype”
外,还支持
所以有意义当你有一个WebApplicationContext时使用请求范围。如果您想要将WebApplicationContext中定义的所有bean注册为请求范围,您必须定义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只是覆盖了scope属性,无论你的bean是在WebApplicationContext中定义的
<强>更新强>
有没有办法将某些默认的“请求”范围内的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");
}
我希望它有用