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,一经查实,立即删除!

相关文章

科目三靠边停车驾驶流程

科目三靠边停车项目考试要求是什么&#xff1f;靠边停车驾驶难不难&#xff1f;有什么驾驶技巧吗&#xff1f; 靠边停车考试项目中规定&#xff0c;车前保险杠离目标前后均不超过1250px&#xff0c;车距目标的横向距离保持在50-2500px之间&#xff0c;同时停车后车要与路边平行…

FreeSql (四)实体特性 Fluent Api

FreeSql 提供使用 Fluent Api&#xff0c; 在外部配置实体的数据库特性&#xff0c;Fluent Api 的方法命名与特性名保持一致&#xff0c;如下&#xff1a; fsql.CodeFirst.ConfigEntity<TestFluenttb1>(a > {a.Name("xxdkdkdk1").SelectFilter("a.Id22…

mybatis3 中 @Provider 的使用方式

若用MyBatis注解方式写sql&#xff0c;又想要XML写法的判断入参拼接条件&#xff0c;可以通过SelectProvider方式实现。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 新建Provider …

科目三电子路考易错细节总结

小编咨询了多家驾校的教练员&#xff0c;总结了科目三电子路考中&#xff0c;考生犯错率最高的几个细节&#xff0c;下面就一起来看看是哪些吧&#xff0c;希望对还没参加科目三考试的朋友有所帮助。 ●起步前不使用安全带 在等待了约2小时后&#xff0c;考生史某终于坐上了考…

java 查询功能实现的八种方式

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 只是记录一下 1. HQL 2. Mybatis : mapper.xml 中写 sql 。 3. Mybatis : 注解 Select Select("select * from xxx_order wher…

科目三夜考考试内容及过关攻略

驾考科目三夜考&#xff0c;考试内容是什么&#xff1f;夜考到底难不难&#xff1f;具体评判标准是什么&#xff1f;夜考有什么驾驶技巧吗&#xff1f;本文&#xff0c;小编将一一为大家解析&#xff01; ●夜考过关攻略 场外考试的新增内容就是&#xff1a;在夜间和低能见度…

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

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

科目三场外考试易出错的环节

现在很多的城市都已经开始实行电子考试&#xff0c;这使得科目三考试更加公平公正&#xff0c;但还是有考生在考试中忽略了场外易出错的环节导致成绩不合格。●起步前不使用安全带在等待了约2小时后&#xff0c;考生史某终于坐上了考试车。史某很兴奋地调整了座位&#xff0c;观…

FreeSql (八)插入数据时指定列

插入数据时指定列&#xff0c;和忽略列对应&#xff0c;未被指定的列将被忽略。 var connstr "Data Source127.0.0.1;Port3306;User IDroot;Passwordroot;" "Initial Catalogcccddd;Charsetutf8;SslModenone;Max pool size10";IFreeSql fsql new FreeSq…

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

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

科目三大路考8个驾驶技巧

驾考科目三考试&#xff0c;大路考的考试内容是什么&#xff0c;有什么考试要点&#xff0c;考试时&#xff0c;有哪些细节要注意&#xff1f;下面&#xff0c;就跟着小编一起来看看吧&#xff01; 科目三大路考驾驶技巧是在实际道路上驾驶机动车进行起步前的准备、起步、通过…

FreeSql (九)删除数据

删除是一个非常危险的操作&#xff0c;FreeSql对删除支持并不强大&#xff0c;仅支持了单表有条件的删除方法。 不想过多的介绍拉长删除数据的系列文章&#xff0c;删除数据的介绍仅此一篇。 若Where条件为空的时候执行方法&#xff0c;FreeSql仅返回0或默认值&#xff0c;不执…

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

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

FreeSql (十)更新数据

FreeSql支持丰富的更新数据方法&#xff0c;支持单条或批量更新&#xff0c;在特定的数据库执行还可以返回更新后的记录值。 var connstr "Data Source127.0.0.1;Port3306;User IDroot;Passwordroot;" "Initial Catalogcccddd;Charsetutf8;SslModenone;Max po…

科目三的7个小步骤

科目三路考中&#xff0c;做好几个步骤就可以顺利的通过考试了&#xff0c;以下来分享下路考中需要注意的几个点。1、上车前&#xff0c;无论你在车辆的什么位置&#xff0c;请务必从车的右侧绕过车头走到驾驶室门前&#xff0c;先观察车前道路上是否有障碍&#xff0c;再观察车…

解决:The ‘Access-Control-Allow-Origin‘ header contains multiple values‘x, *‘, but only one is allowed.

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 跨域问题报错&#xff1a; Access to XMLHttpRequest at http://xx.xx.xx.xx/getUser from origin http://ergouzi.fun has been bloc…

科目三道路考试技巧流程详解

科目三是公认最难的考试科目&#xff0c;它不像科目二练习是在驾校训练场&#xff0c;有些技术不错的学员也会卡在这个项目上&#xff0c;由于突发状况多&#xff0c;了解考试流程是必不可少的。考试流程&#xff1a;1、上车前的准备工作2、上车起步3、变更车道4、直线行驶5、学…

springbootajaxhas been blocked by CORS policy: No ‘Access-Control-Allow-Origin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 ajaxspringboot解决跨域问题&#xff0c;以下报的错误就是html跨域的问题 Access to XMLHttpRequest at http://localhost:8080/user/l…

起步前要做哪些准备?

开车前&#xff0c;做好起步的准备工作是必不可少的&#xff0c;有的人可能还不知道开车前要做那些起步工作。一、开车起步前&#xff0c;检查工作不能忘1、检查车子轮胎是否完好&#xff0c;若发现轮胎有损毁&#xff0c;及时更换。2、检查地面是否有会造成伤害的事或物&#…

什么是响应式布局设计

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