浅谈@PostConstruct不被调用的原因

目录
  • @PostConstruct不被调用的原因
    • 如图
  • @PostConstruct详解
    • 定义
    • 用法
    • 作用
    • 执行顺序

@PostConstruct不被调用的原因

如果在配置文件中配置使用,延迟加载的话

如图

被@Service等注解的类,需要在注入使用的时候,才会被初始化.如果TableInit类只是被定义而没有在其他地方引用的话,@PostConstrut注释的方法是不会执行的.

@PostConstruct详解

定义

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

从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。

用法

@PostConstruct
public void someMethod(){}

或者

public @PostConstruct void someMethod(){}

作用

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

执行顺序

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

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

Constructor >> @Autowired >> @PostConstruct

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决spring懒加载以及@PostConstruct结合的坑

    目录 spring懒加载及@PostConstruct的坑 下面是一个初始化数据的组件 遗留问题 @PostConstruct注入不成功 直接先说原因吧 1.忽略ssm本身对注解是通过扫包才让注解有效的 2.忽略@Service的注解 3.注意扫包区间 4.@PostCoustruct注解用于 spring懒加载及@PostConstruct的坑 举例说明: 下面是一个初始化数据的组件 @Component public class InitData { /** * 初始化加载bean */ @

  • 基于@PostConstruct注解的使用,解决向静态变量注入值

    目录 @PostConstruct注解的使用,向静态变量注入值 说说思路 @PostConstruct和静态变量注入和spring初始化 执行顺序 关于spring初始化操作 @PostConstruct注解的使用,向静态变量注入值 今天在编写工具类时遇到了一个问题,一般在定义工具类方时,我们会将工具类中的方法定义成static类型,使用时可以通过类名.方法名获取该方法,无需实例化出对象才能使用其内部方法,但是当有些参数在配置文件中定义时,我们需要拿到这些参数就需要在工具类方法使用@Value注

  • SpringBoot @PostConstruct和@PreDestroy的使用说明

    目录 1. @PostConstruct 1.1 概述 1.2 验证执行顺序 2. @PreDestroy 1. @PostConstruct 1.1 概述 @PostConstruct标记在方法上,在当前类的实例加入到容器之前,会先执行@PostConstruct标记的方法.它的执行顺序是这样的: 先执行当前类的构造函数 然后执行@Autowired标记对象的初始化 最后执行@PostConstruct标记的方法 如果没有抛出异常,则该对象加入Spring管理容器 1.2 验证执行顺序 创建一

  • springboot @PostConstruct无效的解决

    目录 springboot @PostConstruct无效 解决办法 spring @PostConstruct的踩坑 在springboot程序启动过程中出现一个问题 springboot @PostConstruct无效 springboot 1.5.18,jdk9 @PostConstruct的方法并不执行,原因是jdk8以上的jdk使用了新的module系统,javax.annotation默认不可见. 解决办法 1.用jdk1.8 2.使用springboot 2.x 3.POM添加

  • 浅谈SpringBoot中的Bean初始化方法 @PostConstruct

    目录 注解说明 代码示例 注解示例 错误示例 正确示例 SpringBoot @PostConstruct虽好,也要慎用 1 问题的产生 2 案例模拟 3 总结 注解说明 使用注解: @PostConstruct 效果:在Bean初始化之后(构造方法和@Autowired之后)执行指定操作.经常用在将构造方法中的动作延迟. 备注:Bean初始化时候的执行顺序: 构造方法 -> @Autowired -> @PostConstruct 代码示例 注解示例 @Component public cl

  • SpringBoot使用@PostConstruct注解导入配置方式

    目录 使用@PostConstruct注解导入配置 使用@PostConstruct注解,完成静态对象注入 为什么static对象不可直接使用@Autowired注入? @PostConstruct和@PreDestroy 使用@PostConstruct注解导入配置 通过@PostConstruct注解能够通过一种更友好的方式将配置进行导入 代码如下: /** * 引导类 * * @author zhangzhixiang * @date 2018/09/18 14:51:39 */ @Con

  • 浅谈@PostConstruct不被调用的原因

    目录 @PostConstruct不被调用的原因 如图 @PostConstruct详解 定义 用法 作用 执行顺序 @PostConstruct不被调用的原因 如果在配置文件中配置使用,延迟加载的话 如图 被@Service等注解的类,需要在注入使用的时候,才会被初始化.如果TableInit类只是被定义而没有在其他地方引用的话,@PostConstrut注释的方法是不会执行的. @PostConstruct详解 定义 @PostContruct是Java自带的注解,在方法上加该注解会在项目启

  • 浅谈$_FILES数组为空的原因

    今天做上传的文件时候,打印$_files总是为空,查阅了下资料. 发现是 max_file_uploads=0 知道了原因 file_uploads = On upload_max_filesize = 20M max_file_uploads = 20 以上这篇浅谈$_FILES数组为空的原因就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 浅谈window.onbeforeunload() 事件调用ajax

    经常有这样的需求,就是在离开某个web页面时,用户不一定点注销,这样会导致会话不能及时销毁.为实现用户离开页面时,自动注销功能,需要在web页面的onbeforeunload事件处理函数中发送注销命令.这个地方大多用Ajax实现.有时还涉及到跨域访问的问题.这个地方就存在浏览器的兼容性问题. 浏览器在处理这个需求时的不兼容性有如下两点: 1.处理Ajax时的不兼容性,这里使用jQuery来解决. 2.在发送Ajax请求时的不兼容性 主要代码如下: function logout() { var

  • 浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    如何:对 Windows 窗体控件进行线程安全调用 访问 Windows 窗体控件本质上不是线程安全的. 如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态. 还可能会出现其他与线程相关的 Bug,例如争用情况和死锁. 确保以线程安全方式访问控件非常重要. 在未使用 Invoke 方法的情况下,从不是创建某个控件的线程的其他线程调用该控件是不安全的. 以下非线程安全的调用的示例. // This event handler creates a thread that

  • 浅谈list.removeAll()删除失败的原因及解决

    未重写hashCode() 和 equals() 方法 ! 在实体类中重写这两个方法即可 ATTENTION:若实体类中还有实体类的属性,则该实体类也要重写这两个方法 (实际开发中存在删除失败的问题,待研究.暂采用Map删除方式) 实体类: public class User { private String name; private int age; private String sex; //private Company company; // Company 类也要重写 hashCod

  • 浅谈python 调用open()打开文件时路径出错的原因

    昨晚搞鼓了一下python的open()打开文件 代码如下 def main(): infile =open("C:\Users\Spirit\Desktop\bc.txt",'r') data = infile.read() print(data) main() 然而结果总报错invaild argument 或者cant found such file *** 查找问题后 发现是由于python中的 '\' 是转义符号,要想输出\ 的办法有两种 1 .在\后再加\ 就是\\ 的形式

  • 浅谈js中调用函数时加不加括号的问题

    其实总结起来如下: 函数只要是要调用它进行执行的,都必须加括号.此时,函数()实际上等于函数的返回值.当然,有些没有返回值,但已经执行了函数体内的行为,这个是根本,就是说,只要加括号的,就代表将会执行函数体代码. 不加括号的,都是把函数名称作为函数的指针,用于传参,此时不是得到函数的结果,因为不会运行函数体代码.它只是传递了函数体所在的地址位置,在需要的时候好找到函数体去执行. 所以一般时候我们都是采用的是无括号的原因.这也是由于括号的二义性,因为括号是"函数调用运算符",相当于在执行

  • 浅谈Pycharm的项目文件名是红色的原因及解决方式

    今天在继续学习Python时,打开Pycharm后,发现有一个项目下的项目文件名是红色的,如下图: 刚开始我以为是我升级 Pycharm导致的,但我并没有急着去解决,因为并不会影响我执行代码等.当我修改了一点代码后,我将它add并commit到Git后,才发现问题的原因:是我以前将Word设置成了Git的一个仓库,但是当时这些文件我并没有添加到Git里,所以会显示为红色.(这倒是挺好,可以提示我记得提交) 解决方法一: 如上我说的那样,add(add后会显示成绿色)并commit到Git(或者其

  • 浅谈JVM内存溢出原因和解决思路

    目录 栈溢出(虚拟机栈和本地方法栈) 产生原因 解决思路 堆溢出 产生原因 解决思路 方法区和运行时常量池溢出 产生原因 解决思路 本机直接内存溢出 产生原因 解决思路 栈溢出(虚拟机栈和本地方法栈) 产生原因 在HotSpot中,只能由-Xss参数来设定.因为在HotSpot中不区分虚拟机栈和本地方法栈的. 栈溢出时会出现两种异常:StackOverflowError异常和OutOfMemoryError异常. StackOverflowError异常因为线程请求的栈深度大于虚拟机允许的最大深

  • 浅谈Python中对象是如何被调用的

    目录 楔子 从 Python 的角度看对象的调用 从解释器的角度看对象的调用 小结 楔子 我们知道对象是如何被创建的,主要有两种方式,一种是通过Python/C API,另一种是通过调用类型对象.对于内置类型的实例对象而言,这两种方式都是支持的,比如列表,我们即可以通过[]创建,也可以通过list(),前者是Python/C API,后者是调用类型对象. 但对于自定义类的实例对象而言,我们只能通过调用类型对象的方式来创建.而一个对象如果可以被调用,那么这个对象就是callable,否则就不是ca

随机推荐