我有两个模块: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
应该在标准流程中初始化。
是否可以在Spring中对其进行配置?
P.S。我需要控制被初始化的顺序。我知道有一个特殊的批注@DependsOn
可用于设置间接依赖关系,但是在我的情况下,我不能在secondBean
上使用它,因为依赖项beanForModule2
是可选的,并放置在另一个模块。
答案 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")
。
答案 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
。我们将从secondBean
到beanForModule2
进行依赖,然后spring将通过遵循我们的依赖关系来调用bean初始化。
P.S。感谢@Tarun共享链接。