2010-07-01 97 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