@PostConstruct 注解不生效的问题
1、从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。
写法有如下两种方式:
- @PostConstruct
-
- public void someMethod(){}
-
- 或者
-
- 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