Как добавить зависимость bean-компонента из другого модуля в Spring? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть два модуля: module1 и module2.
module2 зависит от module1.

Конфигурация в module1:

@Configuration
public class ConfigurationInModule1 {

    @Bean
    public FirstBean firstBean() {
        return new FirstBean();
    }

    @Bean
    public SecondBean secondBean(FirstBean firstBean) {
        return new SecondBean(firstBean);
    }
}

Конфигурация в module2:

@Configuration
public class ConfigurationInModule2 {

    @Bean
    public SomeBeanForModule2 beanForModule2(FirstBean firstBean) {
        return new SomeBeanForModule2(firstBean);
    }
}

Как видите, оба компонента secondBean и beanForModule2 зависят от firstBean.Мне нужно убедиться, что когда проект скомпилирован с module2, то beanForModule2 должен быть инициализирован до secondBean.Если нет module2, то secondBean следует инициализировать в стандартном потоке .

Возможно ли настроить его весной?

PS Мне нужноконтролировать порядок инициализации.Я знаю, что есть специальная аннотация @DependsOn, которую можно использовать для настройки косвенной зависимости, но в моем случае я не могу использовать ее на secondBean, поскольку зависимость beanForModule2 является необязательной и помещается в другой модуль.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Нашли решение с помощью BeanFactoryPostProcessor.Нам нужно определить наш пользовательский BeanFactoryPostProcessor и установить там необходимые зависимости.Spring не выполнит инициализацию bean-компонентов перед вызовом postProcessBeanFactory метода.
Чтобы решить вышеупомянутую проблему, мы должны определить наш пользовательский BeanFactoryPostProcessor как этот:

public class JBCDependencyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("secondBean");
        beanDefinition.setDependsOn("beanForModule2");
    }

}

После этого мы должны сделать static bean с нашими BeanFactoryPostProcessor.Примерно так:

@Configuration
public class ConfigurationInModule2 {

    @Bean
    public static BeanFactoryPostProcessor dependencyBeanFactoryPostProcessor() {
        return new JBCDependencyBeanFactoryPostProcessor();
    }

    @Bean
    public SomeBeanForModule2 beanForModule2(FirstBean firstBean) {
        return new SomeBeanForModule2(firstBean);
    }
}

Spring будет искать все бины.Затем он выполнит postProcessBeanFactory в нашем BeanFactoryPostProcessor.Мы создадим зависимость от secondBean до beanForModule2, а затем Spring вызовет инициализацию bean, следуя нашим зависимостям.

PS Спасибо @Tarun за то, что поделились ссылкой.

0 голосов
/ 13 февраля 2019

Spring заботится о порядке инициализации компонента, поэтому, если один компонент зависит от другого, Spring сначала инициализирует компонент Bean, а затем инициализирует зависимый компонент.
В вашем случае FirstBean всегда будет инициализироваться раньше, чем SomeBeanForModule2без каких-либо дополнительных настроек.

И если в вашем случае Dependency Bean, который равен FirstBean, не объявлен (т. Е. Модуль1 отсутствует), Spring выдаст org.springframework.beans.factory.NoSuchBeanDefinitionException.Поэтому модуль 2 не может быть инициализирован без модуля 1.

РЕДАКТИРОВАТЬ: - Для упорядочения инициализации компонента вы можете использовать @DependsOn, даже если компоненты находятся в отдельном файле.

Просто добавьте @import(ConfigurationInModule2.class) в классе ConfigurationInModule1 в вашем модуле 1.
И использовать @DependsOn("beanForModule2") для secondBean.

Это поможет: - https://stackoverflow.com/a/16297827/4720870

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