大家好,今天来介绍postconstruct注解的作用(postconstruct注解的作用)的问题,以下是渲大师小编对此问题的归纳和整理,感兴趣的来一起看看吧!
@PostConstruct 注解说明
Spring中Constructor、@Autowired、@PostConstruct三者的顺序,A类中引用B类对源告象,生成A类对象进行依赖注入时,引用的B类对象必须存在才能注入A类中;例如A类中有B类对象,生成A类实例前必雹闭明须先注入B类实例;
现在A类中成员变量b被@Autowried注解,实例b注入是发生在A的构造方法执行完之后的。如果在A的构造方法中需要用到实例b,那么就无法在构造函数中进行;此时可以采用@PostConstruct注解,@PostConstruct注解的作用是在依赖注态世入完成后调用被注解的方法;
@PostConstruct注解详解
javaEE5引入了@PostConstruct和@PreDestroy两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作
在项目中主要是在Servlet初始化之前加载一些缓存数据等
PostConstruct 注释用于在依赖关系滚誉注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。应用 PostConstruct 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象 ;该方法的返回类型必须为 void;该方法不得抛出已检查异大纳段常;应用 PostConstruct 的方法可以是 public、protected、package private 或 private;除了应用程序客户端之外,该方法不能是 static;该方法可以是 final;如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。
1、只有一个非静茄毁态方法能使用此注解
2、被注解的方法不得有任何参数
3、被注解的方法返回值必须为void
4、被注解方法不得抛出已检查异常
5、此方法只会被执行一次
使用此注解时会影响服务启动时间。服务启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。
@PostConstruct注解作用
之前在项目里面见过这个注解,当时搜索之后是初始化的作用。
今天看书看到了,再次记录一下。
这个注解是spring管理Bean时用到的肆蚂燃,会在Bean加载时先运行配置了该注解的方法,物滑在Bean创建时进行初裂虚始化操作。
于此相反的还有@PreDestroy注解,在Bean销毁时调用。
Bean生命周期中@PostConstruct注解用法以及解决场景
@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的启动方法。
本文地址:https://gpu.xuandashi.com/73641.html,转载请说明来源于:渲大师
声明:本站部分内容来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。分享目的仅供大家学习与参考,不代表本站立场!