spring学习(六)spring中的BeanPostProcessor

BeanPostProcessor是Spring容器的一个扩展点,接口的代码如下,从接口的方法名字可以得出在bean初始化之前执行和bean初始化之后执行2个方法,这里分析的是BeanPostProcessor具体在spring初始化的的哪一步执行

public interface BeanPostProcessor {

	void postProcessBeforeInitialization(Object bean, String beanName);
	
	void postProcessAfterInitialization(Object bean, String beanName);
}

spring是AbstractApplicationContext.refresh()方法中load所有的beanDefinition后。spring系统自带的beanPostProcessor有

1)ApplicationContextAwareProcessor

bean实例中初始化时向bean中设置EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware等参数信息,这个是为什么我们在自定义一些bean继承以上这些接口时可以取到相当的对象

2)AbstractApplicationContext$BeanPostProcessorChecker

这个processor主要是用来打印一些特殊bean实例化的日志。这个还没弄董

3)AbstractApplicationContext$ApplicationListenerDetector

这个processor是用来查看容器中是否有ApplicationListener的bean,并写到事件中


在prepareBeanFactory中定义了一个默认的BeanPostProcessor。这里先暂时记录一下

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
....
		// Configure the bean factory with context callbacks.
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));



1、AbstractAutowireCapableBeanFactory.createBeanInstance方法中,如果配置的bean的xml文件中的constructor不为空时,并设置了SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors类型的BeanPostProcessor(即配置bean实例化时的构造参数)
	protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
		Class beanClass = resolveBeanClass(mbd, beanName);
		if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
			//TODO throw new BeanCreateException 
		}
		//通过BeanPostProcessor选择合适的构造函数,应用的类型是<span>SmartInstantiationAwareBeanPostProcessor</span>
		Constructor[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
		return instantiateBean(beanName, mbd);
	}
其中的是通过BeanPostProcessor的子类SmartInstantiationAwareBeanPostProcessor进行查找合适的构造函数
<pre name="code" class="html">protected Constructor[] determineConstructorsFromBeanPostProcessors(Class beanClass, String beanName)
			throws BeansException {
		if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
					SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
					Constructor[] ctors = ibp.determineCandidateConstructors(beanClass, beanName);
					if (ctors != null) {
						return ctors;
					}
				}
			}
		}
		return null;
	}

 

2、AbstractAutowireCapableBeanFactory.doCreateBean方法时,创建实例bean以后(1),要执行所有的MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition,每个实例bean只执行一次.

synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {
				//创建bean实例时执行MergedBeanDefinitioinPostProcessor
				applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				mbd.postProcessed = true;
			}
		}

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class beanType, String beanName) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof MergedBeanDefinitionPostProcessor) {
				MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor)bp;
				bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
			}
		}
	}

3、spring在处理循环依赖时。向singletonsFactory缓存实例的引用工厂类会执行配置的SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference方法

boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			if (logger.isDebugEnabled()) {
				logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
			}
			addSingletonFactory(beanName, new ObjectFactory() {
				public Object getObject() {
					return getEarlyBeanReference(beanName, mbd, bean);
				}
			});
		}

	protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
		Object exposedObject = bean;
		if (bean != null && !mbd.isAbstract() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
					SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor)bp;
					exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
					if (exposedObject == null) {
						return exposedObject;
					}
				}
			}
		}
		return exposedObject;
	}

4、创建bean的实例以后,在初始化bean的属性时(populateBean方法),可以对bean的属性进行通过InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation进行修改的操作

//使用InstantiationAwareBeanPostProcessor去修改bean的properties
		boolean continueWithPropertyPopulation = true;
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						continueWithPropertyPopulation = false;
						break;
					}
				}
			}
		}
		if (!continueWithPropertyPopulation) {
			return;
		}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值