面试专题:Spring bean如何优先创建?

2023-12-19 19:30:37 浏览数 (1)

前言

这个问题,如果问到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 的场景非常有用。

代码语言:text复制
@Configuration
@Order(1)
public class AppConfig {
    @Bean
    public BeanA beanA() {
        return new BeanA();
    }

    @Bean
    public BeanB beanB() {
        return new BeanB();
    }
}

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

0 人点赞