没有默认范围spring-beans.xsd 文件中定义的属性。但根据Bean定义 http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/beans/factory/config/BeanDefinition.html API
扩展 bean 工厂可能支持更多范围.
And Web应用程序上下文 http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/web/context/WebApplicationContext.html- 扩展的ApplicationContext支持request scope
除了标准范围“单例”和“原型”之外还支持
因此,当您拥有 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 定义
因此,无论您的 bean 是否在 WebApplicationContext 中定义,上面定义的 BeanFactoryPostProcessor 都会覆盖范围属性
UPDATE
有没有办法覆盖一些默认的“请求”作用域 bean 是单例作用域 ?
您应该再次使用上面提供的相同 BeanFactoryPostProcessor。我不确定,但我认为设置其范围的唯一方法是使用beanDefinition.setScope方法。和有很多有用的方法可以检索有关任何 bean 的信息. See 可配置列表Bean工厂 http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/beans/factory/config/ConfigurableListableBeanFactory.html such as
...
/**
* 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");
}
我希望它有用