AnnotationInjectedBeanPostProcessor
上图主要是AnnotationInjectedBeanPostProcessor类图,图片可能看不清,我主要标记了 MergedBeanDefinitionPostProcessor
和 InstantiationAwareBeanPostProcessorAdapter
了解一下他们在Spring中的作用 , 看一下他们调用的时机
- MergedBeanDefinitionPostProcessor
从这段代码中可以看出。 调用 MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition 就是仅仅在new 一个 bean之后
// AbstractAutowireCapableBeanFactory
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
mbd.resolvedTargetType = beanType;
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
// 执行postProcessMergedBeanDefinition
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
..... // 忽略
}
// AnnotationInjectedBeanPostProcessor
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if (beanType != null) {
// 其中并没有直接给bean赋值, 而是将metadata 存储到 AnnotationInjectedBeanPostProcessor 中
InjectionMetadata metadata = findInjectionMetadata(beanName, beanType, null);
metadata.checkConfigMembers(beanDefinition);
}
}
- InstantiationAwareBeanPostProcessorAdapter
如果对其了解可以掠过, 我提及是因为不熟悉 和 重温Spring生命流程, 先看一下其中的方法。 然后百度了一篇参考,其中提到
postProcessBeforeInstantiation方法
这个方法在bean实例化之前被调用,返回的对象可能是代替了目标对象的代理对象,有效的阻止了目标bean默认的实例化。也就是说,如果该方法返回的是non-null对象 ,这个bean的创建过程就会被短路,就不会执行postProcessAfterInitialization的方法和postProcessPropertyValues方法; 相反的如果方法返回值为null,则会继续默认的bean的实例化过程。
由此可以很好的知道Spring 的动机 如果postProcessBeforeInstantiation 返回的不为null,代表用户自定义的想法实例化对象, 因此代码不执行接下来的 postProcessAfterInitialization的方法和postProcessPropertyValues方法。
public