我有两个模块: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);
}
}
正如你所看到的两个bean secondBean
和beanForModule2
依赖firstBean
。我需要确保当项目编译module2
然后beanForModule2
前应进行初始化 secondBean
。如果没有module2
那么secondBean
应在标准流程进行初始化。
是否可以在Spring中进行配置?
PS我需要控制被初始化的顺序。我知道有一个特殊的批注@DependsOn
可用于设置间接依赖关系,但是在我的情况下,secondBean
由于依赖关系beanForModule2
是可选的并且位于另一个模块中,因此无法使用它。
使用找到了解决方案BeanFactoryPostProcessor
。我们需要定义我们的自定义BeanFactoryPostProcessor
并在其中设置必要的依赖项。在调用postProcessBeanFactory
方法之前,Spring不会执行bean初始化。
为了解决上述问题,我们应该BeanFactoryPostProcessor
像这样定义我们的自定义:
public class JBCDependencyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("secondBean");
beanDefinition.setDependsOn("beanForModule2");
}
}
之后,我们应该用制作一个静态 bean BeanFactoryPostProcessor
。像这样:
@Configuration
public class ConfigurationInModule2 {
@Bean
public static BeanFactoryPostProcessor dependencyBeanFactoryPostProcessor() {
return new JBCDependencyBeanFactoryPostProcessor();
}
@Bean
public SomeBeanForModule2 beanForModule2(FirstBean firstBean) {
return new SomeBeanForModule2(firstBean);
}
}
春天会搜索所有的豆子。然后它将postProcessBeanFactory
在我们的程序中执行BeanFactoryPostProcessor
。我们将建立一个从secondBean
到的依赖关系beanForModule2
,然后spring将通过遵循我们的依赖关系来调用bean初始化。
PS感谢@Tarun共享链接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句