如何在Spring中从另一个模块添加bean依赖关系?

时间:2019-02-13 08:25:41

标签: java spring spring-boot javabeans spring-bean

我有两个模块:module1module2
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);
    }
}

如您所见,两个secondBeanbeanForModule2都取决于firstBean。 我需要确保在使用module2编译项目时,beanForModule2 应在 secondBean之前初始化。如果没有module2,则secondBean 应该在标准流程中初始化

是否可以在Spring中对其进行配置?

P.S。我需要控制被初始化的顺序。我知道有一个特殊的批注@DependsOn可用于设置间接依赖关系,但是在我的情况下,我不能在secondBean上使用它,因为依赖项beanForModule2是可选的,并放置在另一个模块。

2 个答案:

答案 0 :(得分:1)

Spring负责bean初始化的顺序,因此,如果一个bean依赖于另一个bean,那么Spring将首先初始化依赖Bean,然后它将初始化依赖Bean。
在您的情况下,FirstBean将始终在SomeBeanForModule2之前进行初始化,而无需任何其他配置。

如果未声明您所用的FirstBean依赖项Bean(即module1不存在),那么Spring将抛出org.springframework.beans.factory.NoSuchBeanDefinitionException。因此,如果没有module1,则无法初始化module2。

编辑:- 对于Bean初始化的排序,即使Bean位于单独的文件中,也可以使用@DependsOn。

只需在模块1的ConfigurationInModule1类中添加@import(ConfigurationInModule2.class)
并在secondBean上使用@DependsOn("beanForModule2")

这会有所帮助:-https://stackoverflow.com/a/16297827/4720870

答案 1 :(得分:0)

使用BeanFactoryPostProcessor找到了解决方案。我们需要定义我们的自定义BeanFactoryPostProcessor并在那里设置必要的依赖关系。 Spring不会在调用postProcessBeanFactory方法之前执行bean初始化。
为了解决上述问题,我们应该像这样定义自定义BeanFactoryPostProcessor

public class JBCDependencyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

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

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

}

在那之后,我们应该使用BeanFactoryPostProcessor制作一个 static bean。像这样:

@Configuration
public class ConfigurationInModule2 {

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

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

Spring将搜索所有bean。然后它将在我们的postProcessBeanFactory中执行BeanFactoryPostProcessor。我们将从secondBeanbeanForModule2进行依赖,然后spring将通过遵循我们的依赖关系来调用bean初始化。

P.S。感谢@Tarun共享链接。

相关问题