如何在Spring的applicationContext.xml中指定默认范围来请求范围?

时间:2010-07-01 00:23:32

标签: java spring spring-mvc scope

我想默认使所有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

1 个答案:

答案 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,例如

  • getBeanNamesForType

...

/**
  * 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");
}

我希望它有用