InstantiationAwareBeanPostProcessor 总结

InstantiationAwareBeanPostProcessor 

一般用途

一般用于抑制特定bean的默认实例化,

例如创建具有特殊目标源的代理(池目标,

延迟初始化目标等),或实现额外的注入策略(注解Autowired实现就是实现类该接口)

总体方法介绍:

实例化前调用,返回不为null,短路bean的创建流程

@Nullable
	default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}

postProcessBeforeInstantiation返回为null,才会调用此方法,该方法实例化后创建,返回true为正常调用,返回false会中断后面的InstantiationAwareBeanPostProcessor 接口


	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

 在bean实例化前调用

 

    @Nullable
	default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}

 

如果该方法返回值不为空,那么bean的创建过程会短路,短路是什么意思呢? 下面开始介绍

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean 方法大概503行左右

你看英文注释就可以知道意思

@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {


		try {
			// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
            //这里如果返回不为null,则下面doCreateBean无法调用到,而doCreateBean中是调用
            //populateBean和initializeBean方法的,所以相应方法也会短路(initializeBean方法可以说会调用BeanPostProcessor接口的方法的)
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) {
				return bean;
			}
		}
        ....

		try {
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			if (logger.isTraceEnabled()) {
				logger.trace("Finished creating instance of bean '" + beanName + "'");
			}
			return beanInstance;
		}
		......
	}

你点到org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation方法可以看到他就在调用InstantiationAwareBeanPostProcessor 接口

	@Nullable
	protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
		Object bean = null;
		if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
			// Make sure bean class is actually resolved at this point.
            //ioc中是否有InstantiationAwareBeanPostProcessor目标接口
			if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
				Class<?> targetType = determineTargetType(beanName, mbd);
				if (targetType != null) {
					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
					if (bean != null) {
						bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
					}
				}
			}
			mbd.beforeInstantiationResolved = (bean != null);
		}
		return bean;
	}

 

 

postProcessAfterInstantiation

实例化之后调用

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		.....

		// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
		// state of the bean before properties are set. This can be used, for example,
		// to support styles of field injection.
        //遍历所有InstantiationAwareBeanPostProcessors 接口,如果方法返回false
        //会中断后面InstantiationAwareBeanPostProcessors 接口的调用,
        //方法即使返回false也不会中断bean生命周期的后续流程
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						return;
					}
				}
			}
		}

		....
	}

 

//todo

go home

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值