本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Spring中的Instantiation接口:
- postProcessBeforeInstantiation:在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走 。
- postProcessAfterInstantiation:在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。
- postProcessPropertyValues:可以在该方法内对属性值进行修改。如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。还有一个因素是mbd.getDependencyCheck():如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true,postProcessPropertyValues就会被执行。
Spring中的Initializing接口:
- postProcessBeforeInitialization 在Bean的自定义初始化方法之前执行
- postProcessAfterInitialization 在Bean的自定义初始化方法执行完成之后执行
区别
- Instantiation方法是在Bean的
实例化阶段被调用。 - Initializing方法是在Bean实例化完成后的
初始化阶段被调用。
作用
Spring 容器中的 Bean 具有生命周期,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,以提升框架的可扩展性。
-
Instantiation在Bean的实例化阶段。用于处理Bean的实例化前回调、实例化后回调和Values配置注入。
-
Initializing在Bean初始化的最后阶段,此时的Autowired属性都已经完成注入完成并且Bean的初始化也基本完成,因此将AOP安插在此阶段。
- 在Bean初始化阶段initializeBean方法中调用BeanPostProcessor#postProcessAfterInitialization做Bean的初始化的最后一个回调,Bean的AOP处理也是安插在此阶段,通过AOP对Bean进行装饰增强。最终getBean生成返回的Bean是经过DynamicProxy的对象,对Bean的方法调用都会先经过PointCut匹配上的Advice方法。
- 在Bean初始化阶段initializeBean方法中调用BeanPostProcessor#postProcessAfterInitialization做Bean的初始化的最后一个回调,Bean的AOP处理也是安插在此阶段,通过AOP对Bean进行装饰增强。最终getBean生成返回的Bean是经过DynamicProxy的对象,对Bean的方法调用都会先经过PointCut匹配上的Advice方法。