Spring @PostConstruct 、@Autowired和Construct 顺序

  今天修bug的时候发现了@PostConstruct 注解,之前一直没注意到,今天正好学习了下,就来总结一波。

  @PostConstruct 

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

  然后就会思考问题,这个注释是修饰初始化之后需要执行的方法,那么它和@Autowired、构造函数的执行顺序是什么呢?(当然注释中已经说明了PostConstruct注释用于在完成依赖项注入之后)

  

@Service
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();
    }
}
@Service
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 方法

所以得到结论: 构造方法 > @Autowired > @PostConstruct

转载于:https://www.cnblogs.com/haoming1100/articles/9960171.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot是一个非常方便的框架,其注解功能可以让我们非常轻松地实现依赖注入功能。其,@PostConstruct是一个非常实用的注解,可以在对象构造之后自动执行一些初始化操作。但是,有些时候,我们在@PostConstruct使用@Autowired来注入依赖却发现注入失败。这通常是由于以下原因导致的: 1.类没有被Spring容器扫描到 如果类没有被Spring容器扫描到,那么该类的实例就不会在Spring容器创建,自然也就无法完成依赖注入。这时候,我们需要检查一下这个类是否被@ComponentScan或者其他扫描注解扫描到了。 2.循环依赖 如果两个或者更多的类之间存在循环依赖的情况,那么它们之间是无法完成依赖注入的。这时候,我们需要检查一下类之间的依赖关系,尽量避免循环依赖的情况发生。 3.依赖类型不匹配 在@Autowired注入依赖时,默认是按照类型去匹配的。如果容器存在多个符合条件的bean,那么就需要使用@Qualifier注解来指定特定的bean。如果注入失败,可以检查一下被注入的属性类型和容器实际存在的bean类型是否一致,或者使用@Qualifier注解来明确指定需要注入的bean。 总的来说,如果@PostConstruct的@Autowired无法注入依赖,我们需要仔细检查一下代码实现,看看是否存在以上这些问题。只有确定了问题出在哪里,我们才能够快速地解决它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值