前言
这个问题,如果问到Spring的话,基本会被问到,如果多个bean怎么控制顺序,如何保证某个bean优先创建。在Spring框架中,bean的创建顺序通常是根据依赖关系自动确定的。然而,在某些情况下,我们需要优先创建某个特定的bean,以确保其他bean能够正常工作。本文将介绍如何在Spring如何控制bean的创建顺序,并根据多种实现方案进行案例分析。
解决方案
1)通过构造方法依赖的方式,来控制有依赖关系的 bean 之间初始化顺序,但是需要注意循环依赖的问题
代码语言:text复制@Component
public class CDemo1 {
private String name = "cdemo 1";
public CDemo1(CDemo2 cDemo2) {
System.out.println(name);
}
}
@Component
public class CDemo2 {
private String name = "cdemo 1";
public CDemo2() {
System.out.println(name);
}
}
- 需要有注入关系,如 CDemo2 通过构造方法注入到 CDemo1 中,如果需要指定两个没有注入关系的 bean 之间优先级,则不太合适(比如我希望某个 bean 在所有其他的 Bean 初始化之前执行)
- 循环依赖问题,如过上面的 CDemo2 的构造方法有一个 CDemo1 参数,那么循环依赖产生,应用无法启动
2)@DependsOn注解,会先加载依赖的bean实例化,来控制 bean 之间的实例顺序,需要注意的是 bean 的初始化方法调用顺序无法保证
代码语言:text复制@DependsOn("rightDemo2")
@Component
public class RightDemo1 {
private String name = "right demo 1";
public RightDemo1() {
System.out.println(name);
}
}
@Component
public class RightDemo2 {
private String name = "right demo 2";
public RightDemo2() {
System.out.println(name);
}
}
3)通过Spring扩展器PostProcessor,实现 BeanFactoryPostProcessor 接口方式,来手动控制 bean 的加载顺序
代码语言:text复制@Component
public class ABeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
A.initA();
}
}
4)使用@Order注解,标注在类
也可以在类上使用 @Order
注解。在类上使用 @Order
注解可以为整个类的所有 Bean 定义指定顺序。这对于需要按照特定顺序初始化 Bean 的场景非常有用。
@Configuration
@Order(1)
public class AppConfig {
@Bean
public BeanA beanA() {
return new BeanA();
}
@Bean
public BeanB beanB() {
return new BeanB();
}
}
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!