首页 > 其他分享 >@PostConstruct 注解不生效的问题

@PostConstruct 注解不生效的问题

时间:2023-12-05 19:55:59浏览次数:32  
标签:初始化 springboot PostConstruct bean 生效 注解 加载

@PostConstruct 注解不生效的问题

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

写法有如下两种方式:

  1. @PostConstruct
  2. public void someMethod(){}
  3. 或者
  4. public @PostConstruct void someMethod(){}

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

执行顺序

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

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

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

Constructor >> @Autowired >> @PostConstruct

 然后,我遇到了一个问题:@PostConstruct 失效了!!!!

后来发现仅仅是我们ervice层的注解失效了(我们ervice层依赖了我们公司开发的框架的底层代码),其他的没有失效,然后我就重写了一个类

在这个类中去调用,但是又发现出现了空指针异常

后来发现是依赖了另外一个类:然后那个类可能还没有加载,

现在我们来说一下spring的加载过程:

springboot启动过程

springboot的bean加载的过程是这样的,程序启动时,springboot会把标记为bean的类或者接口自动进行全局的单例实例化,如果用户指定标记了初始化的顺序,springboot则会按照用户指定的顺序进行初始化,否则就会按照默认的顺序进行初始化,在这个过程中,如果一个bean所在的类或者接口存在@PostConstruct注解,springboot就会在执行完这个bean的构造方法之后执行标记有@PostConstruct注解的方法,然后实例化下一个bean

现在可能这个类先加载了,然后就需要查看怎么保证类的加载顺序:

如何正确控制springboot中bean的加载顺序总结:

https://www.pianshen.com/article/27791751446/

还有一种方式,我们不用@PostConstruct,改用ApplicationListener

 有两种方式:1,在类加载过程中用@PostConstruct完成轻量级的加载

2,在spring完成所有的加载后再进行初始化相关的操作,比如用:ApplicationListener

所以说,对于轻量级的逻辑,可以放在@PostConstruct注解的方法里,非常耗时的逻辑,可以考虑使用多线程处理,也可以放弃@PostConstruct注解,改用CommandLineRunner和ApplicationRunner

原文链接:https://blog.csdn.net/qq_16504067/article/details/119866086

标签:初始化,springboot,PostConstruct,bean,生效,注解,加载
From: https://www.cnblogs.com/sunny3158/p/17878028.html

相关文章

  • @Transactional事务注解及请求接口的定义先后执行顺序设计
    @Transactional事务注解及请求接口的定义先后执行顺序设计1.事务内查询,可能存在事务没有提交,导致查询数据查不出来。2.或者可能跟请求参数作为查询条件,在某个条件下,请求参数发生变化,也会导致查询不出来。可以将在一个事务内的操作(定义为一个组,Group_ID),根据组号来查询。根据接口......
  • 单元测试:Junit框架、反射、注解、动态代理
    单元测试:Junit框架单元测试单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性目前测试方法的方式的和存在的问题方式:只有一个main方法,如果一个方法的测试失败了,其他方法测试会受到影响问题:①无法得......
  • nvidia-smi修改ECC状态重启后不生效
    最近跑大模型发现显卡少了几个G显存,网上一查得知开启ecc会少一部分显存,但ecc对大模型计算准确性几乎没有影响,因此打算关闭ECC校验。在bash里面用sudonvidia-smi-e0​禁用了ECC之后,nvidia-smi-q-decc​显示Pending为Disable,但是重启之后ECC状态依旧是开启状态。进图形界面用......
  • vscode自动保存设置为afterDelay后prettier不生效
    "files.autoSave":"afterDelay""editor.formatOnSave":true这两个配置不能一起使用解决方法:1.将"afterDelay"修改为“onFocusChange"2.设置成onFocusChange或者onWindowChange3.关闭重启vscode 参考文件:files.autoSaveandeditor.formatOnSave  ......
  • vue3使用::v-deep深度选择器不生效
    会出现 ::v-deepusageasacombinatorhasbeendeprecated.Use:deep(<inner-selector>)insteadof::v-deep<inner-selector>.的报错::v-depth用作组合子已被弃用。使用:deep(<内部选择器>)而不是::v-deep<内部选择器>。需要改成:deep(class),示例代码如下:deep(.el-checkbo......
  • 基于xml的Spring是如何解析@Component,@Service等注解的
    SpringFramework2.0开始,引入可扩展的XML编程机制,该机制要求XMLSchema命名空间需要与Handler建立映射关系。该关系配置在相对于classpath下的/META-INF/spring.handlers中。如上图所示 ContextNamespaceHandler对应<context:...>分析的入口。ContextNamespaceHandler 这......
  • SpringBoot自定义注解导出Excel
    先定义一个注解importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)public@interfaceExcelHander{Stringvalue()default"";StringlinkFiled()default"";Cel......
  • Angular Input 注解在 Spartacus 项目开发中的实际应用场景一例
    @Input()装饰器是Angular中用于在组件中接收父组件传递的数据的一种方式。它的作用是将一个属性标记为输入属性,使得父组件可以将数据绑定到子组件的这些属性上。这样,父子组件之间就可以实现双向数据传递,实现更灵活的组件通信。下面是一个实际的例子:SearchBoxComponent是父组......
  • @RequestParam 注解导致无法自动将请求参数填充到函数参数中
    @RequestParam注解导致无法自动将请求参数填充到函数参数中@RequestParam注解通常用于从HTTP请求中提取单个参数值。它将参数值映射到方法的参数上,并且默认情况下不会自动将值填充到类的字段中。以下面的代码为例:classPageParam{ privateIntegerpage;privateInte......
  • windows10 Java环境变量配置后不生效
    一、问题从jdk8升级到jdk11,配置JAVA_HOME后,不生效。(备注:jdk8是安装版,jdk11是解压版。)二、解决办法在环境变量Path中,删除下面的配置:C:\ProgramFiles(x86)\CommonFiles\Oracle\Java\javapath验证:三、原因因为使用安装版本的JDK程序时(一般是1.7版本以上),在安装结束后会自......