CommonAnnotationBeanPostProcessor
@PostConstructor @PreDestory等是什么时候执行,在那个类,什么时候触发的

快速锁定PostConstructor的位置

1、先用快捷键找到这个类都在那个地方初始化

image.png

2、找到这个类就给她打上断点

image.png
3、它有继承接口
image.png
4、看其接口里面的是什么情况
image.png

Debug模式进去

1、打完断点,然后debug模式进去

image.png

2、通过调用栈进行反推,从头开始进入

image.png

3

image.png

4

image.png
image.png
image.png

5、

image.png

6、

image.png

7、

image.png

8、

image.png

9、

image.png

10、

image.png

11、

image.png

12、

image.png

13、

image.png

14、

image.png

15、

image.png

16、

image.png

17、

image.png

18、

image.png

19、

image.png

20、

最后一路来到对配置类的初始化(其实就是调用的的无参构造方法)
image.png

AbstractApplicationContext#refreshAbstractApplicationContext#registerBeanPostProcessors
PostProcessorRegistrationDelegate#registerBeanPostProcessors (这里得到三个处理器)
AbstractBeanFactory#getBean
AbstractBeanFactory#doGetBean
DefaultSingletonBeanRegistry#getSingleton
AbstractBeanFactory#doGetBean
AbstractAutowireCapableBeanFactory#createBean
AbstractAutowireCapableBeanFactory#doCreateBean
AbstractAutowireCapableBeanFactory#createBeanInstance
AbstractAutowireCapableBeanFactory#instantiateBean
SimpleInstantiationStrategy#instantiate
BeanUtils#instantiateClass
CommonAnnotationBeanPostProcessor#CommonAnnotationBeanPostProcessor 在这个类的无参中加入PostConstruct,PreDestroy注解类

有空再画时序图

查看某个类的某个方法或该类在哪里被调用 / 引用

1、方法的话鼠标定位到该方法名,右键Find Usages
2、类的话,定位到文件夹下的Java类文件,或者定位到 public class 类名这里,右键Find Usages
image.png

查看某个类所有方法Ctrl+F12

javaEE5引入了@PostConstruct和@PreDestroy两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作

使用场景

在项目中主要是在Servlet初始化之前加载一些缓存数据等

API使用说明

PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。应用 PostConstruct 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象 ;该方法的返回类型必须为 void;该方法不得抛出已检查异常;应用 PostConstruct 的方法可以是 public、protected、package private 或 private;除了应用程序客户端之外,该方法不能是 static;该方法可以是 final;如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。_

特点:

1、只有一个非静态方法能使用此注解
2、被注解的方法不得有任何参数
3、被注解的方法返回值必须为void
4、被注解方法不得抛出已检查异常
5、此方法只会被执行一次

servlet执行流程


PostConstructor&PreDestory什么时候处理的 - 图28

注意事项

使用此注解时会影响服务启动时间。服务启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。

spring中的@PostConstruct注解的用法

该注解可以实现在运行工程时,自动运行该注解下的方法;
@PostConstruct是java5的时候引入的注解,指的是在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。

被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行
也就是加载顺序
服务器加载Servlet -> servlet 构造函数的加载 -> postConstruct ->init(init是在service 中的初始化方法. 创建service 时发生的事件.) ->Service->destory->predestory->服务器卸载serlvet
那么问题:spring中Constructor、@Autowired、@PostConstruct的顺序
Constructor >> @Autowired >> @PostConstruct
依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。
@PostConstruct应用场景:
如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

  1. @PostConstruct
  2. public void start() {
  3. }
  4. @PreDestroy
  5. public void stop() {
  6. }