Spring扩展机制之InstantiationAwareBeanPostProcessor

Spring扩展机制之InstantiationAwareBeanPostProcessor,第1张

文章目录
  • 前言
  • 介绍
    • postProcessBeforeInstantiation
    • postProcessAfterInstantiation
    • postProcessProperties
    • postProcessPropertyValues

前言

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) {
        // 获取之前MergedBeanDefinitionPostProcessor收集到的所有带了@Value的字段或者方法
		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代替

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/787427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存