@PostConstruct 注解详解

@PostConstruct 注解详解最近在项目中发现了一个没见过的注解 PostConstruc 于是学习了一下 这里做一个记录 在 spring 项目经常遇到 PostConstruc 注解 首先介绍一下它的用途 被注解的方法 在对象加载完依赖注入后执行 此注解是在 JavaEE5 规范中加入的 在 Servlet 生命周期中有一定作用 它通常都是一些初始化的操作 但初始化可能依赖于注入的其他组件 所以要等依赖全部加载完再执行

最近在项目中发现了一个没见过的注解:@PostConstruct,于是学习了一下,这里做一个记录。

@PostConstruct的介绍

  1. 要在依赖加载后,对象使用前执行,而且只执行一次,原因在上面已经说了。
  2. 所有支持依赖注入的类都要支持此方法。首先,我们可以看到这个注解是在javax.annotation包下的,也就是java拓展包定义的注解,并不是spring定义的,但至于为什么不在java包下,是因为java语言的元老们认为这个东西并不是java核心需要的工具,因此就放到扩展包里(javax中的x就是extension的意思),而spring是支持依赖注入的,因此spring必须要自己来实现@PostConstruct的功能。
  3. 文档中说一个类只能有一个方法加此注解,但实际测试中,我在一个类中多个方法加了此注解,并没有报错,而且都执行了,我用的是springboot框架。

PostConstruct注释规则

  1. 除了拦截器这个特殊情况以外,其他情况都不允许有参数,否则spring框架会报IllegalStateException;而且返回值要是void,但实际也可以有返回值,至少不会报错,只会忽略
  2. 方法随便你用什么权限来修饰,public、protected、private都可以,反正功能是由反射来实现
  3. 方法不可以是static的,但可以是final的

spring中Constructor、@Autowired、@PostConstruct的顺序

这里做了一个小测试:

@Component public class PostConstructA { @Autowired private PostConstructB postConstructB; public PostConstructA() { System.out.println("这是PostConstructA 的构造方法"); } @PostConstruct private void init() { System.out.println("这是PostConstructA的 init 方法"); postConstructB.test(); } }
@Component public class PostConstructB { @PostConstruct private void init() { System.out.println("这是PostConstructB的 init 方法"); } public PostConstructB() { System.out.println("这是PostConstructB的 构造方法"); } void test() { System.out.println("这是PostConstructB的 test 方法"); } }

测试结果如下: 

@PostConstruct 注解详解

其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。

如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

@PostConstruct在项目中的用处

  1. spring项目加载数据字典
    @PostConstruct注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。

  2. spring项目的定时任务spring自带的@schedule,没有开关,项目启动总会启动一个线程;
    做项目的时候就使用Java的timer,这个设置开关即可自由的控制,关闭的时候,不会启动线程;
    Java的timer也需要找到一个启动类,可以放到main函数里面启动,这样的话,代码的耦合性太高了,而使用PostConstruct是很干净的。




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178429.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:19
下一篇 2026年3月26日 下午5:19


相关推荐

  • 大数据管理与应用专业总结笔记

    大数据管理与应用专业总结笔记大数据管理与应用专业:数据科学教育特点:不仅依赖于传统的信息管理于信息系统专业,更依赖于计算机、数学、统计等学科。大数据专业十一门涉及广泛的交叉性的学科。大数据时代的下的理念(维克托·迈尔·舍恩伯格):一是更相关性而不是因果性;二是更关注数据的纷繁复杂,而不是数据的精准;三是全部数据,而不是抽样数据。维克托·迈尔·舍恩伯格:维克托·迈尔-舍恩伯格是十余年潜心研究数据科学的技术权威,是最早洞见大数据时代发展趋势的数据科学家之一,也是最受人尊敬的权威发言人之一。**目前的形势:**目前国内新增院校还不多

    2022年6月10日
    42
  • 新闻专栏~ART让Android更流畅

    新闻专栏~ART让Android更流畅

    2022年1月22日
    48
  • 服务降级 & 熔断机制

    服务降级 & 熔断机制一 服务降级 1 什么是降级 降级是从系统功能优先级的角度考虑如何应对系统故障 服务降级指的是当服务器压力剧增的情况下 根据当前业务情况及流量对一些服务和页面有策略的降级 以此释放服务器资源以保证核心任务的正常运行 降级服务的特征如下 原因 整体负荷超出整体负载承受能力 目的 保证重要或基本服务正常运行 非重要服务延迟使用或暂停使用 大小 降低服务粒度 要考虑整体模块粒度的大小 将粒度控制在合适的范围内 可控性 在服务粒度大小的基础上增加服务的可控性 后台服务开关的功能是一

    2026年3月17日
    2
  • Mac pycharm安装及激活成功教程

    Mac pycharm安装及激活成功教程1 安装直接从官网下载即可 一步一步傻瓜式安装 2 激活成功教程网上有很多方法 主要是修改 hosts 文件和安装激活成功教程补丁两种 参考了这篇博客 https blog csdn net u0 article details

    2026年3月16日
    2
  • 浅谈require和import

    浅谈require和import最近在学习 webpack 时候 教程上用到的是 require 但是之前我写代码用的 Import 比较多 所以借这个机会来学习一下 node 编程中最重要的思想就是模块化 import 和 require 都是被模块化所使用 遵循规范 require 是 AMD 规范引入方式 import 是 es6 的一个语法标准 如果要兼容浏览器的话必须转化成 es5 的语法调用时间 require 是运行时调用 所以 req

    2026年3月19日
    2
  • LINUX 挖矿脚本newdat.sh

    LINUX 挖矿脚本newdat.sh#!/bin/shsetenforce02>dev/nullechoSELINUX=disabled>/etc/sysconfig/selinux2>/dev/nullsync&&echo3>/proc/sys/vm/drop_cachescrondir=’/var/spool/cron/'”$USER”cont=`cat${crondir}`ssht=`cat/root/.ssh/authorized_keys`echo1&

    2022年7月13日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号