沒有默認範圍在彈簧定義屬性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如
...
/**
* 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");
}
我希望它可以是有用的
謝謝 - 是有沒有辦法再覆蓋某些默認的「請求」作用域bean是單身作用域?就像在你的例子中那樣,setScope(「request」)將改變所有bean來請求作用域,而不是使請求作用域成爲新的默認值。 – JAWspeak 2010-07-01 19:47:19
@JAWspeak如果我的回答滿足您的需求,請將其標記爲已接受。謝謝 – 2010-07-01 23:36:09
你的建議不會使*所有*請求的範圍?如果我仍然想要一些單例作用域呢?我知道我可以在我的自定義RequestScopedPostProcessor中做一些事情 - 但可以說「使每個請求都有作用域,除非它已經定義了明確的作用域」。 – JAWspeak 2010-07-04 21:56:09