2015-04-30 3 views
2

Моя проблема заключается в том, как реализовать выборочную загрузку весенних фасолей в начале веб-приложения.Как выборочно загружать бобы при начале весны

Фон Наша заявка основана на J2EE и Spring. Мы запускаем одно и то же веб-приложение на разных управляемых серверах. На некоторых из этих управляемых серверов мы запускаем только веб-службу, но в других случаях нам также нужно запускать такие службы, как отчет, планировщик и т. Д. Все эти службы настроены как весна в конфигурационных файлах весенней конфигурации. Поэтому мы хотим отключить некоторые неиспользуемые компоненты, когда вы запускаете серверы с помощью веб-сервиса.

Проблемы, Я попытался переопределить метод customizeContext в org.springframework.web.context.ContextLoaderListener, чтобы удалить неиспользуемые компоненты из контекста. (Я знаю, что это не очень хорошая идея, чтобы удалить загруженные бобы вместо того, чтобы остановить их загрузку в первую очередь. Это потому, что я не мог понять, как это реализовать). Однако я получил java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext.

После некоторого расследования я понял, что BeanFactory здесь не может быть использован, но я как бы застрял и не знаю, как реализовать эту функцию. Может ли кто-нибудь помочь мне в этом, пожалуйста? Либо прекращение загрузки бобы в весну во время начала, либо удаление боба из Весны, когда оно только начинается, будет работать для меня.

Ниже приведен мой код для переопределения метода customizeContext.

@Override 
protected void customizeContext(ServletContext servletContext, ConfigurableWebApplicationContext applicationContext) { 

    super.customizeContext(servletContext, applicationContext); 

    ConfigurableListableBeanFactory configurableListableBeanFactory = applicationContext.getBeanFactory(); 
    BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) configurableListableBeanFactory; 
    beanDefinitionRegistry.removeBeanDefinition("testBean"); 
} 
+0

Пожалуйста, добавьте версию пружинный вы хотите это для, так как она сильно отличается от 2.5, 3.x и 4.x ... –

+0

Спасибо за ваше предложение. Мы используем Spring 3.0.5 в этом проекте и не планируем обновлять его в ближайшем будущем. –

ответ

1

Спасибо за предложения от Сержа и других парней. В настоящее время мы используем 3.0.5, поэтому не можем использовать функцию профилей 3.1 в нашем проекте.

Мы разработали способ сделать это, добавив BeanFactoryPostProcessor в ConfigurableWebApplicationContext в метод customizeContext.Кажется, мы решили наши проблемы.

изменения кода являются:

protected void customizeContext(ServletContext servletContext, ConfigurableWebApplicationContext applicationContext) { 
    super.customizeContext(servletContext, applicationContext); 
    applicationContext.addBeanFactoryPostProcessor(new BootProcessor()); 

} 

класс BootProcessor реализует BeanFactoryPostProcessor {

@Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory clbf) throws BeansException { 
     BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) clbf; 
     beanDefinitionRegistry.removeBeanDefinition("testerBean"); 


    } 

} 
4

Вместо того, чтобы пытаться настроить BeanFactory после загрузки всех бобов, вы должны иметь групп бобов и загружать только групп, связанных с фактическими бегущими услугами.

Унаследованный способ состоял в том, чтобы иметь промежуточные XML-файлы, содержащие импорт для других файлов, содержащих то, что я вызывал выше групп из bean-компонентов, а в основном файле XML - импортировать правильный. Выписка из Spring Reference Manual: опираясь на комбинации системной переменной среды и заявления XML, содержащих $ {заполнителя} лексемы, что решимость правильного пути к файлу конфигурации в зависимости от значения переменной среды

Но теперь инструмента выбор должен быть профилем. Вы кладете бобы в различных профилей, соответствующих вашим услугам

@Bean 
@Profile("production") 
public DataSource productionDataSource() throws Exception { 

или в XML

<beans profile="production"> 
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/> 
</beans> 

Вы должны просто включить соответствующие профили, либо programmaticaly:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
ctx.getEnvironment().setActiveProfiles("dev"); 

или даже виртуальной машины Java свойства:

-Dspring.profiles.active="profile1,profile2" 

Ссылки: Глава Environment Abstraction Справочное руководство по весне.

+0

Твердый ответ, но как насчет версий, запущенных в версии до 3.0. – Vishnu

+0

@Vishnu: 'PropertyPlaceholderConfigurer' существовал в 2.x, но я не уверен в части импорта, и у меня нет приложения, использующего Spring 2.x (чтобы проверить его) на время ожидания. –

+0

спасибо, Серж. но забыл упомянуть, мы используем 3.0.5. –

Смежные вопросы