Как указать область по умолчанию в applicationContext.xml Spring для запроса области? - PullRequest
1 голос
/ 01 июля 2010

Я хочу сделать все запросы 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 Ответ

3 голосов
/ 01 июля 2010

Нет 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 , например

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

Надеюсь, это может быть полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...