2022更文挑战3-使用@DependsOn控制bean的加载顺序

104 阅读2分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。

使用@DependsOn控制bean的加载顺序

前文

有同事提到如何控制bean加载顺序的问题,因此在这里对@DependsOn的注解进行一下简单的使用总结。难免有不足之处,还请见谅。

注解内容

首先要了解一下这个注解的含义。Beans on which the current bean depends. Any beans specified are guaranteed to be created by the container before this bean.Used infrequently in cases where a bean does not explicitly depend on another through properties or constructor arguments,but rather depends on the side effects of another bean's initialization.该注解指定了哪些bean需要在该bean被创建前先创建,以防止再bean创建好时,其依赖的内容还没有被创建好。注解内容可以指定数组,也就是多个依赖的bean。

使用方法

@DependsOn({"testBean3","testBean2"})
@Bean("testBean1")
public TestBean1 testBean1(){
    return new TestBean1();
}

@Bean("testBean2")
public TestBean2 testBean2(){
    return new TestBean2();
}

@Bean("testBean3")
public TestBean3 testBean3(){
    return new TestBean3();
}

如上述代码所示,有三个bean分别是testBean1,testBean2,以及testBean3。其中假设我们在使用testBean1时,需要预先创建testBean2以及testBean3。因此我们需要在创建testBean1之前先将依赖的两个bean事先创建好。此处,我们采用了@DependsOn注解。由于此处我们依赖多个注解,因此要采用数组的形式进行操作@DependsOn({"testBean3","testBean2"})。在每个bean创建时,已经分别打印了"xxx has been initial"。例如:

public class TestBean1 {
    public TestBean1() {
        System.out.println("TestBean1 has been initial");
    }
}

下面来看一下执行效果:

image.png 如上图所示,创建bean的顺序为testBean3,testBean2,testBean1。也就是在testBean1被创建之前,其依赖的bean已经被事先创建好,不会出现空指针异常问题,与我们预期的效果一致,@DependsOn注解生效。

上面说明了当依赖多个bean时的操作方式,下面再简述一下当依赖单个bean时要如何编写代码:

@DependsOn("testBean2")
@Bean("testBean1")
public TestBean1 testBean1(){
    return new TestBean1();
}

@Bean("testBean2")
public TestBean2 testBean2(){
    return new TestBean2();
}

只需要将注解括号内直接使用bean名称代替数组即可,效果与预期的效果也是完全一致:

image.png 综上也就是@DependsOn注解的使用方法,用于指定bean加载顺序防止空指针异常。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。