Spring中@PostConstruct注解的使用讲解
1、定义
从JavaEE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。
2、执行顺序及其使用场景
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法之后执行

从依赖注入的字面意思可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p和对象a,才能执行注入。
所以,如果一个类A中有个成员变量p被@Autowried或@Resource注解,那么成员变量p注入是发生在a的构造方法执行完之后的。
如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么这个初始化操作就无法在构造函数中实现。
这时,可以使用@PostConstruct 注解一个方法来完成初始化,被@PostConstruct注解的方法将会在依赖注入完成后被自动调用。 所以,@PostConstruct的执行顺序如下:
静态方法 >> Constructor >> @Autowired >> @PostConstruct
3、代码演示
我们知道:如果对象p注入到对象a,在服务启动时,会先执行p的构造方法,在执行a的构造方法。 那么如果对象p注入到对象a,且在对象p和对象a中都有@PostConstruct注解,那么在服务启动时,他的初始化顺序是什么呢,我们做个小测试,相关代码如下:
@Service
public class RoleService {
static {
System.out.println("RoleService static");
}
public RoleService(){
System.out.println("RoleService Constructor");
}
@PostConstruct
public void init(){
System.out.println("RoleService PostConstruct");
}
}
@Service
public class UserService {
@Resource
private RoleService roleService;
static {
System.out.println("UserService static");
}
public UserService(){
System.out.println("userService Constructor");
}
@PostConstruct
public void init(){
System.out.println("UserService PostConstruct");
}
}
我们可以看到,RoleService注入到了UserService中,我们启动程序,输出结果如下:
RoleService static
RoleService Constructor
RoleService PostConstruct
UserService static
userService Constructor
UserService PostConstruct
结论:
如果对象p注入到对象a,且在对象p和对象a中都有@PostConstruct注解,那么在服务启动时,他的初始化顺序是: p static -> p Constructor -> p PostConstruct -> a static -> a Constructor -> a PostConstruct
需要注意:
Spring有默认的类加载顺序 如果UserService注入到了RoleService,类加载顺序默认是先加载RoleService,所以它的执行顺序就是 RoleService static -> RoleService Constructor -> UserService static -> UserService Constructor -> UserService PostConstruct -> RoleService PostConstruct
到此这篇关于Spring中@PostConstruct注解的使用讲解的文章就介绍到这了,更多相关Spring中@PostConstruct注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot集成ShedLock实现分布式定时任务的示例代码
ShedLock 是一个 Java 库,通常用于分布式系统中,确保定时任务(Scheduled Tasks)在集群环境下只被某一个实例执行一次,本文给大家介绍了SpringBoot集成ShedLock实现分布式定时任务的示例代码,需要的朋友可以参考下2024-12-12
深入理解Spring Boot Starter概念、特点、场景、原理及自定义starter的方法
本文将深入探讨Spring Boot Starter的基本概念、主要特点、应用场景以及实现原理,帮助读者更好地理解和应用这一强大工具,感兴趣的朋友跟随小编一起看看吧2025-08-08
解决Spring Security集成knife4j访问接口文档出现403的问题
这篇文章主要给大家介绍了如何解决Spring Security集成knife4j访问接口文档出现403的问题,文中有详细的解决方案,有需要的朋友可以参考阅读下2023-07-07
基于javaWeb 项目SSM配置要点及可能遇到的问题和解决方法
下面小编就为大家带来一篇基于javaWeb 项目SSM配置要点及可能遇到的问题和解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-10-10
SpringBoot 自动扫描第三方包及spring.factories失效的问题解决
这篇文章主要介绍了SpringBoot 自动扫描第三方包及spring.factories失效的问题,本文给大家分享最新解决方法,需要的朋友可以参考下2023-05-05
Java SpringMVC实现PC端网页微信扫码支付(完整版)
这篇文章主要介绍了Java SpringMVC实现PC端网页微信扫码支付(完整版)的相关资料,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下2016-11-11


最新评论