Bean生命周期中@PostConstruct注解用法以及解决场景
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bean生命周期中@PostConstruct注解用法以及解决场景相关的知识,希望对你有一定的参考价值。
参考技术A @PostConstruct这个注解主要用在构造方法执行之后,也就是说在实例创建完成之后执行的方法。有时候我们需要在实例创建完成之后注入另外一个对象或执行某些操作,如把B注入到A中,这时候如果B还未初始化,那么A中注入的B也是null。如果想要B初始化之后才在A中做一些操作,这时候就需要@PostConstruct注解的帮助。
下面是@Construct,@Autowird以及@PostConstruct的执行顺序。
其中@PostConstruct修饰的方法里面的注入的对象都是初始化成功的对象
例子:
Test1对象会注入test2对象,分别在test1的构造方法和@PostConstruct修饰的方法中打印test2
Test2类如下
启动项目,查看控制台打印
可以看出在test2类还未初始化的时候,test1构造方法打印test2的值是null,但@PostConstruct修饰的say方法就可以等到test2初始化成功,将其注入,然后打印的功能。
遇到的场景
项目中某个service类需要启动一个rocketmq客户端,但是mq的配置参数需要从配置文件中注入,刚开始把mq的客户端启动放在该service的构造方法中,但是得到的配置参数都是null,所以服务就报错了。最后采用@PostConstruct注解实现mq生成者的创建,这个注解会将所以的配置都注入成功后才会调用mq的启动方法。
8 -- 深入使用Spring -- 2...4 使用@PostConstruct和@PreDestroy定制生命周期行为
8.2.4 使用@PostConstruct和@PreDestroy定制生命周期行为
@PostConstruct 和 @PreDestroy 同样位于javax.annotation 包下,也是来自Java EE 规范的两个Annotation,Spring直接借鉴了它们,用于定制Spring容器中Bean的生命周期行为。
@PostConstruct : 类似于<bean.../>元素中init-method属性的功能。用于修饰方法使之成为Bean的初始化方法;
@PreDestroy : 类似于<bean.../>元素中destroy-method属性的功能。用于修饰方法使之成为Bean销毁之前的方法。
package edu.pri.lime._8_2_4.bean.impl; import org.springframework.stereotype.Component; import edu.pri.lime._8_2_4.bean.Axe; import edu.pri.lime._8_2_4.bean.Person; @Component public class Chinese implements Person { @Resource(name="steelAxe") private Axe axe; /*可以让Spring在该Bean的依赖关系注入完成之后回调该方法*/ @PostConstruct public void init(){ System.out.println("正在执行初始化的init方法..."); } /*可以让Spring在销毁该Bean之前回调该方法*/ @PerDestroy public void close(){ System.out.println("正在执行销毁之前的close方法..."); } public void useAxe() { System.out.println(axe.chop()); } }
啦啦啦
啦啦啦
以上是关于Bean生命周期中@PostConstruct注解用法以及解决场景的主要内容,如果未能解决你的问题,请参考以下文章
@PostConstruct注解是Spring提供的?今天讲点不一样的
关于Spring Bean的生命周期中几个常用方法(@PostConstruct@PreDestroy 等)的执行顺序
8 -- 深入使用Spring -- 2...4 使用@PostConstruct和@PreDestroy定制生命周期行为