上一篇博文介绍了@Order注解的常见错误理解,它并不能指定 bean 的加载顺序,那么问题来了,如果我需要指定 bean 的加载顺序,那应该怎么办呢?

本文将介绍几种可行的方式来控制 bean 之间的加载顺序

  • 构造方法依赖
  • @DependOn 注解
  • BeanPostProcessor 扩展

原文: 

虽然这种方式比较直观简单,但是有几个限制

另外一个需要注意的点是,在构造方法中,不应有复杂耗时的逻辑,会拖慢应用的启动时间

2. @DependOn 注解

这是一个专用于解决 bean 的依赖问题,当一个 bean 需要在另一个 bean 初始化之后再初始化时,可以使用这个注解

使用方式也比较简单了,下面是一个简单的实例 case

@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);     } }

上面的注解放在 RightDemo1 上,表示RightDemo1的初始化依赖于rightDemo2这个 bean

在使用这个注解的时候,有一点需要特别注意,它能控制 bean 的实例化顺序,但是 bean 的初始化操作(如构造 bean 实例之后,调用@PostConstruct注解的初始化方法)顺序则不能保证,比如我们下面的一个实例,可以说明这个问题

@DependsOn("rightDemo2") @Component public class RightDemo1 {     private String name = "right demo 1";      @Autowired     private RightDemo2 rightDemo2;      public RightDemo1() {         System.out.println(name);     }      @PostConstruct     public void init() {         System.out.println(name + " _init");     } }  @Component public class RightDemo2 {     private String name = "right demo 2";      @Autowired     private RightDemo1 rightDemo1;      public RightDemo2() {         System.out.println(name);     }      @PostConstruct     public void init() {         System.out.println(name + " _init");     } }