前言
spring中一个InstantiationAwareBeanPostProcessor接口,本文介绍下它的作用
介绍
InstantiationAwareBeanPostProcessor的定义
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
org.springframework.beans.factory.support.AbstractBeanDefinition#getFactoryMethodName()
*/
@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;
}
}
postProcessBeforeInstantiation
调用链路,createBean方法开始 获取所有BeanPostProcessor,如果是InstantiationAwareBeanPostProcessor,则调用它的postProcessBeforeInstantiation
那么这个方法都用于哪些地方呢
比如你不想使用spring默认创建bean的方法通过构造器创建bean,比如Mybatis的Mapper,它只有接口,没有实现类的构造方法,postProcessBeforeInstantiation就是在spring使用构造器帮你创建bean之前创建对象的,你可以创建一个代理对象返回,那么就可以实现自定义实例化对象了 spring创建bean的地方是下面这个doCreateBean方法,当调用postProcessBeforeInstantiation返回对象时,就可以直接返回对象了,也就不会走到doCreateBean这个方法了
postProcessAfterInstantiation
调用链路,也是createBean开始,进入doCreateBean创建bean 进入依赖注入方法populateBean,在依赖注入之前,同样获取所有InstantiationAwareBeanPostProcessor,调用它的postProcessAfterInstantiation,如果返回值是false,那么就不进行下面的依赖注入流程了
也就是这个方法的触发逻辑是在,bean创建完成,依赖注入的过程前执行的
postProcessProperties
调用链路,这个方法同样在是依赖注入的方法populateBean中执行的,但是不同的是,它是在其他属性全部依赖注入完成后执行的 这个方法最常见的是配合MergedBeanDefinitionPostProcessor接口来使用,上文讲到了MergedBeanDefinitionPostProcessor可以用来收集类的某些属性或者字段
那么postProcessProperties这个方法,就可以对收集到的属性进行操作,比如:
AutowiredAnnotationBeanPostProcessor的postProcessProperties
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
try {
metadata.inject(bean, beanName, pvs);
}
catch (BeanCreationException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
}
return pvs;
}
metadata.inject里面会对收集到的字段,获取他们需要注入的属性,最终通过反射完成属性的注入
postProcessPropertyValues
这个方法在spring低版本中使用,在高版本已经过时了,使用postProcessProperties代替
|