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));
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;
}