@PostConstruct,@Autowired 和 Constructor的先后顺序

@PostConstruct 

  • PostConstruct 注释用于在完成依赖项注入以执行任何初始化之后需要执行的方法。必须在类投入使用之前调用此方法。
  • 所有支持依赖注入的类都必须支持此注释。即使类没有请求注入任何资源,也必须调用使用 PostConstruct 注释的方法。
  • 只有一个方法可以使用此批注进行批注。
  • 应用 PostConstruct 注释的方法必须满足以下所有条件:除了拦截器之外,方法绝不能有任何参数,在这种情况下它采用 Interceptor 规范定义的 InvocationContext 对象。
  • PostConstruct 拦截器方法不能抛出应用程序异常,但可以声明它抛出检查异常,包括java.lang.Exception。
  • 如果相同的拦截器方法除了生命周期事件之外插入业务或超时方法。
  • 如果 PostConstruct 拦截器方法返回一个值,容器将忽略它。
  • PostConstruct 的方法可以是 publicprotectedpackage private
  • 除应用程序客户端外,该方法绝不能是静态的。
  • 该方法可能是最终的。

这个注释是修饰初始化之后需要执行的方法,那么它和@Autowired、构造函数的执行顺序是什么呢? 

@Component
public class BeanA {

    @Autowired
    private BeanB beanB;

    public BeanA() {
        System.out.println("这是Bean A 的构造方法");
    }


    @PostConstruct
    private void init() {
        System.out.println("这是BeanA 的 init 方法");
        beanB.testB();
    }
}

@Component
public class BeanB {

    @PostConstruct
    private void init() {
        System.out.println("这是BeanB 的 init 方法");
    }

    public BeanB() {
        System.out.println("这是Bean B 的 构造方法");
    }

    void testB() {
        System.out.println("这是Bean B 的 testB 方法");
    }
}

输出结果

这是Bean A 的构造方法
这是Bean B的 构造方法
这是BeanB 的 init 方法
这是BeanA 的 init 方法
这是Bean B 的 testB 方法

所以得到结论: Constructor > @Autowired > @PostConstruct

 

 

你可能感兴趣的:(Spring)