2010-07-01 159 views
1

我想让默认范围内的所有bean请求,但是Spring文档说默认范围是Singleton。 (第3.4.1和3.4.2节http://static.springsource.org/spring/docs/2.5.x/reference/beans.html如何指定Spring的applicationContext.xml中的默认范围来请求范围?

我想声明默认范围是请求作用域。

这是迄今为止我发现的最接近的东西 - 这是一段时间内尚未触及的缺陷。 jira.springframework.org/browse/SPR-4994?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel#issue-tabs

回答

3

没有默认范围在弹簧定义属性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

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

我希望它可以是有用的

+0

谢谢 - 是有没有办法再覆盖某些默认的“请求”作用域bean是单身作用域?就像在你的例子中那样,setScope(“request”)将改变所有bean来请求作用域,而不是使请求作用域成为新的默认值。 – JAWspeak 2010-07-01 19:47:19

+0

@JAWspeak如果我的回答满足您的需求,请将其标记为已接受。谢谢 – 2010-07-01 23:36:09

+0

你的建议不会使*所有*请求的范围?如果我仍然想要一些单例作用域呢?我知道我可以在我的自定义RequestScopedPostProcessor中做一些事情 - 但可以说“使每个请求都有作用域,除非它已经定义了明确的作用域”。 – JAWspeak 2010-07-04 21:56:09