Spring@PostConstruct注解和构造方法的调用顺序
先看下@PostConstruct的注解
* The PostConstruct annotation is used on a method that needs to be executed * after dependency injection is done to perform any initialization. This * method MUST be invoked before the class is put into service. This * annotation MUST be supported on all classes that support dependency * injection. The method annotated with PostConstruct MUST be invoked even * if the class does not request any resources to be injected. Only one * method can be annotated with this annotation. The method on which the * PostConstruct annotation is applied MUST fulfill all of the following * criteria -
自己翻译一下,意思是:
PostConstruct注解用于方法上,该方法在初始化的依赖注入操作之后被执行。这个方法必须在class被放到service之后被执行,这个注解所在的类必须支持依赖注入。
父类class,被@component注解修饰,说明会被spring扫描并创建。在默认构造方法里加上输出打印,init方法被@PostConstruct修饰
1 @Component 2 public class ParentBean implements InitializingBean{ 3 4 public ParentBean() { 5 System.out.println("ParentBean construct"); 6 } 7 8 @PostConstruct 9 public void init(){ 10 System.out.println("ParentBean init"); 11 } 12 13 public void afterPropertiesSet() throws Exception { 14 System.out.println("ParentBean afterPropertiesSet"); 15 } 16 17 }
子类class,也被 @component注解修饰,其余配置和父类class一样
1 @Component 2 public class SonBean extends ParentBean{ 3 public SonBean() { 4 System.out.println("SonBean construct"); 5 } 6 7 @PostConstruct 8 public void init(){ 9 System.out.println("SonBean init"); 10 } 11 @Override 12 public void afterPropertiesSet() throws Exception { 13 System.out.println("SonBean afterPropertiesSet"); 14 } 15 16 }
然后我们使用maven命令 jetty:run,控制台输出如下:
[INFO] Initializing Spring root WebApplicationContext ParentBean construct ParentBean init ParentBean afterPropertiesSet ParentBean construct SonBean construct SonBean init SonBean afterPropertiesSet [INFO] Set web app root system property: 'webapp.root' = [J:\androidworkspace\com\src\main\webapp\] [INFO] Initializing log4j from [classpath:log4j.properties] [INFO] Started SelectChannelConnector@0.0.0.0:8088 [INFO] Started Jetty Server [INFO] Starting scanner at interval of 3 seconds.
可以看出优先执行依然是构造方法,这个是java的语言决定的,毕竟spring只是建立在java之上的框架。然后才是被PostConstruct修饰的方法,要注意的是这个方法在对象的初始化和依赖都完成之后才会执行,所以不必担心执行这个方法的时候有个别成员属性没有被初始化为null的情况发生。在init方法之后执行的才是afterPropertiesSet方法,这个方法必须实现InitializingBean接口,这个接口很多spring的bean都实现了他,从他的方法名就能看出在属性都被设置了之后执行,也属于springbean初始化方法。
其实spring提供了很多接口以供开发者在bean初始化后调用,可以在官网上查阅相关文档。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义