Нет default-scope Атрибут, определенный в файле spring-beans.xsd. Но согласно BeanDefinition API
Расширенные фабрики бинов могут поддерживать дальнейшие области действия .
И WebApplicationContext - расширенный ApplicationContext поддерживает запрос scope
Поддерживается в дополнение к стандартным областям применения «синглтон» и «прототип»
Так что имеет смысл использовать область запроса, когда у вас есть WebApplicationContext. И если вы хотите зарегистрировать все bean-компоненты, определенные в 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, определенный выше, просто переопределяет свойство области независимо от того, определен ваш компонент в вашем WebApplicationContext
UPDATE
есть ли способ затем переопределить , чтобы некоторые из заданных по умолчанию бобов "запроса" были одноэлементными областями ?
Опять же, вы должны использовать тот же 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");
}
Надеюсь, это может быть полезно