@PostConstruct 注解不生效的问题

发布时间 2023-12-05 19:51:52作者: sunny123456

@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