CommonAnnotationBeanPostProcessor
@PostConstructor @PreDestory等是什么时候执行,在那个类,什么时候触发的
快速锁定PostConstructor的位置
1、先用快捷键找到这个类都在那个地方初始化
2、找到这个类就给她打上断点
3、它有继承接口
4、看其接口里面的是什么情况
Debug模式进去
1、打完断点,然后debug模式进去
2、通过调用栈进行反推,从头开始进入
3
4
5、
6、
7、
8、
9、
10、
11、
12、
13、
14、
15、
16、
17、
18、
19、
20、
最后一路来到对配置类的初始化(其实就是调用的的无参构造方法)
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
查看某个类所有方法Ctrl+F12
javaEE5引入了@PostConstruct和@PreDestroy两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作
使用场景
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执行流程
注意事项
使用此注解时会影响服务启动时间。服务启动时会扫描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注解的方法将会在依赖注入完成后被自动调用。
@PostConstruct
public void start() {
}
@PreDestroy
public void stop() {
}