Spring扩展机制之InstantiationAwareBeanPostProcessor

前言

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代替

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值