spring 中构造Constructor、@Autowired、@PostConstruct、静态方法的执行顺序 (@PostConstruct 说明)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

 

1. 关于注解 PostConstruct 

public @interface PostConstructPostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。
应用 PostConstruct 注释的方法必须遵守以下标准:1)该方法不得有参数,除非是在 EJB 拦截器 (interceptor) 的情况下。
根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象 ;2)该方法的返回类型必须为 void;3)该方法不得抛出已检查异常;4)应用 PostConstruct 的方法可以是 public、protected、package private 或 private;5)除了应用程序客户端之外,该方法不能是 static;6)该方法可以是 final;7)如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。

2.  @PostConstruct 和 @PreConstruct

从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。

这两个注解被用来修饰一个非静态的void()方法.  而且这个方法不能有抛出异常声明。

@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。

 1)@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,且只会被服务器调用一次,类似于Serclet的inti()方法。   被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

 2) @PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,且只会被服务器调用一次,类似Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

 3)用法:

@PostConstructpublic void someMethod(){}或者public @PostConstruct void someMethod(){}

4)作用:

1.spring项目加载数据字典@PostConstruct 注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。2.spring项目的定时任务spring 自带的 @schedule 无开关,项目启动总会启动一个线程;Java 的 timer 可设置开关,自由控制,关闭时不会启动线程;但 timer 也需要一个启动类,如放到main函数里启动,这样代码的耦合性高。 综上:使用 PostConstruct  干净、方便。

3.  启动速度

 注解多少会影响服务器的启动速度。服务器在启动的时候,会遍历Web应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。如果程序中没有使用任何注解,可以在web.xml中设置<web-app>的metadatacomplete属性为true来关掉服务器启动时的例行检查。

4.  执行顺序

思路 1)

被@PostConstruct 修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行后执行。

执行顺序

另外,spring中Constructor、@Autowired、@PostConstruct的顺序

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

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

Constructor >> @Autowired >> @PostConstruct

思路 2)

从 jvm 类加载时机来看 

JVM 在加载阶段通过类的全路径找到该类并把类的信息加载到JVM的方法区,

--> 在堆区实例化有关 java.lang.Class 对象,作为方法区中这个类的信息的入口;

--> 在连接阶段,为类的静态变量 logClinet 分配内存并赋予 JVM 默认初始值 null;

因为注解@PostConstruct的缘故,在类初始化之前会先加载该使用该注解的方法,而后再执行类的初始化。

即加载顺序为:

    构造方法  ——> @Autowired —— > @PostConstruct ——> 静态方法 


 

转自:https://www.cnblogs.com/YuyuanNo1/p/8184003.html

https://www.jianshu.com/p/98cf7d8b9ec3

https://blog.csdn.net/u014515854/article/details/78832790

https://blog.csdn.net/qq_37636695/article/details/84791468

https://www.jianshu.com/p/aba99a49a459

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联合索引:创建、删除、查看 (解决报错:Duplicate key name)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 创建联合索引&#xff1a; CREATE INDEX idx_xxx_stitution ON xxx_order (status,institution_code) idx_xxx_stitution &#x…

mybatis 中 Example 的使用 :条件查询、排序、分页(三种分页方式 : RowBounds、PageHelpler 、limit )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 import tk.mybatis.mapper.entity.Example;import com.github.pagehelper.PageHelper;...Overridepublic List<Repayxxx> listRep…

解决: IDEA 代码 commit 后,Local Changes 中代码依旧在,提交失败,报错:is out of date

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 代码提交后 Local Changes 中的代码未消失。查看 Event log 发现提交失败。 如下 红框中位置就是 Event log&#xff0c;或者点击…

什么是响应式布局设计

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 看一个例子&#xff1a;Mashable 的首页&#xff1a; 浏览器窗口最大化时&#xff1a; 缩小浏览器窗口&#xff1a; 再缩小&#x…

git 提交 不用输入用户名、密码的方法(GIT免密提交)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我以前设置过&#xff0c;但最近把项目换地方了&#xff0c;环境也改了些配置&#xff0c;发现不能免密 push 了。 设置方法如下&#…

docker启动,重启,关闭命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 --------------------- 转自&#xff1a;https://blog.csdn.net/easternunbeaten/article/details/80463837

十二个生活习惯,增加你的心灵压力

随着生活节奏的加快&#xff0c;很多人抱怨压力越来越大。美国《赫芬顿邮报》近日载文指出&#xff0c;一些压力是外在压力&#xff0c;而更多的压力来自我们自身。以下就是在不知不觉中增加自身压力的习惯。 忘记每日大笑 如果你想不起来上次捧腹大笑的时间&#xff0c;你就该…

VisualCode 查看代码历史版本、还原代码到既定历史版本

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我想要类似 eclipse 查看并还原代码到既定历史版本的效果。 1. 安装插件&#xff1a;Local History &#xff0c;点击右下角 Install 就…

解决: cp -rf 命令中参数 -f 失效 ( 依旧要手动确认 )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 运行 cp -rf 命令时依旧给出无数提示&#xff0c;要求确认&#xff0c;很是麻烦&#xff0c;如下图&#xff1a; 2. 可能原因&#…

FreeSql (二十四)Linq To Sql 语法使用介绍

原本不支持 IQueryable 主要出于使用习惯的考虑&#xff0c;如果继承 IQueryable&#xff0c;编写代码的智能总会提示出现一堆你不想使用的方法&#xff08;对不起&#xff0c;我有强迫症&#xff09;&#xff0c;IQueryable 自身提供了一堆没法实现的方法&#xff0c;还有外部…

前后端分离工程实现 (VUE、JAVA)、附全部源码

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 整个工程基本情况简述&#xff1a; 前端工程语言&#xff1a;vue &#xff08;node.js&#xff09; 后端工程语言&#xff1a;java…

聊聊并发——生产者消费者模式

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里&#xff0c;生产者就是生产数据的线程&#xff0c;消费者就是消费数据的线程。在…

多个 VUE 前端工程部署设置、nginx 代理配置

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 PS&#xff1a;早期 我只有一个 VUE 前端工程&#xff1a;gentle-vue &#xff0c;加一个 java 后端工程&#xff1a;gentle &#xff0…

解决: 网站访问报错 AccessDenied (阿里云 OSS + CDN )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 使用阿里云 OSS服务 CDN 服务后&#xff0c;直接用顶级域名访问个人站点失败&#xff0c;报错如下&#xff1a; <Code>Acces…

二十一世纪Windows简史

摘要&#xff1a;Windows拥有者超过90%的消费级操作系统市场份额&#xff0c;处于龙头老大的位置&#xff0c;那其成长的故事是怎么的&#xff1f;ZDNet总结了21世纪Windows的发展史&#xff0c;以及围绕微软操作系统发生的事情&#xff0c;不妨一看。 据微软4月26日的官方通知…

VUE 项目中引入 json 配置

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 这个写法还是第一次见到&#xff0c;也不知道是否还有什么环境配置&#xff0c;记录一下&#xff0c;或许以后什么时候也可以参考&#…

新手课堂之汽车灯光操作及位置

驾考科目三模拟夜间灯光操作你了解多少&#xff1f;汽车灯光该如何操作&#xff1f;下面我们随众悦学车网编辑一起来看看吧&#xff01; 科目三考试中&#xff0c;模拟夜间灯光使用是每个学员都要参加的一项考试&#xff0c;那么&#xff0c;汽车灯光包括些什么灯呢&#xff1f…

Spring注解 @Qualifier 说明、用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 -------------------------------------------- 我是分隔线 --------------------------------------------------- Qualifier&#xf…

把 excel 表中的数据 批量修改到指定数据库表中、根据 excel 表中数据修改数据库表中数据

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 收到一张 excel 表&#xff0c;要求根据 “转账时间”一列的值批量修改数据库表中 "放款时间"一列的值。 2. 写出 sql 模…

查看 linux 硬件信息:内存、分区、系统、环境变量、防火墙、路由、端口监听、进程、CPU...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、linux CPU大小&#xff1b; 其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg…