前言
Spring框架是一个非常优秀的框架,是Java程序员必须会的技术,其提供了非常良好的扩展性能,那么更多的是依赖其提供的后置处理器性能
这些后置处理器按照对象主要分为两类,分别针对BeanFactory
和Bean
,然后存在各种类型
一、针对BeanFactory的
BeanFactoryPostProcessor
【代码入口】:AbstractApplicationContext -> refresh() -> invokeBeanFactoryPostProcessors()
在获取Bean工厂DefaultListableBeanFactory
以后,可以对工厂进行自定义扩展
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
BeanDefinitionRegistryPostProcessor
【代码入口】:同上
在获取Bean工厂以后,可以对IOC容器中的BeanDefinition
进行修改,注意在执行自定义的后置处理器之前,首先会执行ConfigurationClassPostProcessor
,把BeanDefinitoon
全部加载进去,这样在执行自定义后置处理器的时候,就可以操作已有的BeanDefinition
,同样也可以新增
这里看到的参数类型为:BeanDefinitionRegistry
,但实际上是DefaultListableBeanFactory
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
二、针对Bean的
在Sping Bean的整个生命周期中,有9个地方调用后置处理器。这些后置处理器是Spring实现自定义功能或者扩展spring的核心所在
第一次调用后置处理器
【代码入口】:AbstractAutowireCapableBeanFactory -> createBean() -> resolveBeforeInstantiation()
【作用】:可以通过该后置处理器自己创建Bean,而不走后面 doCreateBean()
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
return null;
}
@Deprecated
@Nullable
default PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
return pvs;
}
}
第二次调用后置处理器
【代码入口】:AbstractAutowireCapableBeanFactory -> doCreateBean() -> createBeanInstance() -> determineConstructorsFromBeanPostProcessors()
【作用】:该后置处理器推断使用哪个构造函数来初始化bean对象
在实例化Bean的时候,肯定会使用到构造方法,在推断使用哪一个构造函数的时候,会首先判断当前构造函数是否有@Value
和@Autowired
注解,如果没有,那就校验当前构造方法对应的bean和传来的beanClass是否一样,如果是同一个,就把当前构造函数赋值给defaultConstructor
在第二次调用后置处理器的时候,会返回当前可用的构造函数,由此来决定,使用哪个构造函数来创建bean
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
@Nullable
default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
// 主要是该方法,决定构造方法
@Nullable
default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
throws BeansException {
return null;
}
default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
return bean;
}
}
第三次调用后置处理器
【代码入口】:AbstractAutowireCapableBeanFactory -> doCreateBean() -> applyMergedBeanDefinitionPostProcessors()
【作用】:在实例化Bean之后,属性赋值之前,可以修改RootBeanDefiniton
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
default void resetBeanDefinition(String beanName) {
}
}
第四次调用后置处理器
【代码入口】:AbstractAutowireCapableBeanFactory -> doCreateBean() -> getEarlyBeanReference()
【作用】:把创建的对象 放到earlySingletonObjects
,解决循环依赖的,处理循环依赖问题会用到这个后置处理器。
第五、六次调用后置处理器
【代码入口】:AbstractAutowireCapableBeanFactory -> doCreateBean() -> populateBean()
【作用】:判断是否需要填充属性。
在这里会进行属性注入,首先会判断是否需要后置处理器操作属性,然后再操作属性
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
// 返回true, 代表会执行属性注入
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
return null;
}
// 属性操作, 但已逐步废弃
@Deprecated
@Nullable
default PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
return pvs;
}
}
第七、八次调用后置处理器
【代码入口】:AbstractAutowireCapableBeanFactory -> doCreateBean() -> initializeBean()
**【作用】:**Bean执行init-method
初始化前后执行的方法
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
第九次调用后置处理器
【代码入口】:AbstractAutowireCapableBeanFactory -> doCreateBean() -> registerDisposableBeanIfNecessary() -> new DisposableBeanAdapter() -> filterPostProcessors()
【作用】:最后就是销毁Bean时候使用的后置处理器
【代码入口】**:AbstractAutowireCapableBeanFactory -> doCreateBean() -> registerDisposableBeanIfNecessary() -> new DisposableBeanAdapter() -> filterPostProcessors()
【作用】:最后就是销毁Bean时候使用的后置处理器