我们都知道BeanPostProcessor是bean的增强器,最常用的是postProcessBeforeInitialization和postProcessAfterInitialization两个方法,但其实不止这两个扩展点,我们就总结一下它包含的扩展点和具体作用。
1.接口及子接口
核心接口BeanPostProcessor,在bean初始化前后调用。
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;
}
}
InstantiationAwareBeanPostProcessor在实例化前后进行回调,设置显式属性之前的回调
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;
}
}
SmartInstantiationAwareBeanPostProcessor拓展bean的实例化流程,前面两个在实例化和初始化前后,而SmartInstantiationAwareBeanPostProcessor可以做特殊扩展点,比如提前暴露getEarlyBeanReference等。
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;
}
}
了解了三个BeanPostProcessor接口及子接口后,就介绍一下他的拓展点及应用
2.应用点
单词 | 含义 |
---|---|
Instantiation | 表示实例化,对象还未生成 |
Initialization | 表示初始化,对象已经生成 |
1.InstantiationAwareBeanPostProcessor::postProcessBeforeInstantiation
顾名思义就是在实例化的处理器,前置方法 作用:跳出后续执行过程 自身方法,是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常doCreateBean流程。
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
2.InstantiationAwareBeanPostProcessor::postProcessAfterInstantiation
顾名思义在实例化后置方法 作用:postProcessPropertyValues方法是否执行 在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为它的返回值是决定要不要调用postProcessPropertyValues方法的其中一个因素(因为还有一个因素是mbd.getDependencyCheck());如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true,postProcessPropertyValues就会被执行
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
3.InstantiationAwareBeanPostProcessor::postProcessProperties
顾名思义处理属性值 作用:对属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改
4.SmartInstantiationAwareBeanPostProcessor::determineCandidateConstructors
顾名思义选择合适的构造方法 作用:选择合适的构造方法用于实例化bean
5.SmartInstantiationAwareBeanPostProcessor::getEarlyBeanReference
顾名思义提前暴露 作用:解决循环依赖AOP,放入三级缓存中,ObjectFactory
6.MergedBeanDefinitionPostProcessor::postProcessMergedBeanDefinition
作用:@Autowired @Value @Resource 等预解析bean上的注解 用于后续初始化执行和赋值等
7.BeanPostProcessor::postProcessBeforeInitialization
作用:初始化前置处理器 比如@PostConstruct等注解
8.BeanPostProcessor::postProcessAfterInitialization
作用:初始化后置处理器 比如动态代理
总结
BeanPostProcessor及其子接口有很多扩展点,帮助我们在bean创建过程中去拓展和灵活创建。 总结了在创建过程中四个接口共八个方法作用,下面给一张流程图来一言蔽之各个方法作用点。
评论