目录
- [1. 继续研究BeanPostProcessor的postProcessBeforeInstantiation和postProcessAfterInitialization](#1. 继续研究BeanPostProcessor的postProcessBeforeInstantiation和postProcessAfterInitialization)
- [2. 创建其他单实例bean](#2. 创建其他单实例bean)
- [2.1. 给BeanPostProcess一个机会返回代理对象](#2.1. 给BeanPostProcess一个机会返回代理对象)
- [2.1.1. 执行postProcessBeforeInstantiation方法](#2.1.1. 执行postProcessBeforeInstantiation方法)
- [2.1.2. 执行postProcessAfterInitialization方法](#2.1.2. 执行postProcessAfterInitialization方法)
- [2.1. 给BeanPostProcess一个机会返回代理对象](#2.1. 给BeanPostProcess一个机会返回代理对象)
1. 继续研究BeanPostProcessor的postProcessBeforeInstantiation和postProcessAfterInitialization
我们把断点放行到
- AbstractAutoProxyCreator#postProcessBeforeInitialization
java
postProcessBeforeInitialization:282, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
applyBeanPostProcessorsBeforeInitialization:407, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1622, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:553, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:481, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:756, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:542, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
main:26, AopConfig
- AbstractAutoProxyCreator#postProcessAfterInitialization
java
postProcessAfterInitialization:293, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
applyBeanPostProcessorsAfterInitialization:421, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1634, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:553, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:481, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:756, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:542, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
main:26, AopConfig
2. 创建其他单实例bean
我们自己写的AopConfig、Calc、LogAspect都会在org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
这个逻辑中创建,而在创建之前、之后会分别
经过
AbstractAutoProxyCreator#postProcessBeforeInitialization
AbstractAutoProxyCreator#postProcessAfterInitialization
这两个AnnotationAwareAspectJAutoProxyCreator的postProcess方法
创建bean的过程参考4.实例化所有非懒加载的单实例bean.md.初始化Bean.执行所有PostProcessor的postProcessBeforeInitialization方法
2.1. 给BeanPostProcess一个机会返回代理对象
- AbstractAutowireCapableBeanFactory#createBean
这个逻辑中可以看出在真正创建bean实例之前,会先给BeanPostProcessors机会返回代理对象,有的话返回,没有的话才是真正创建
java
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating instance of bean '" + beanName + "'");
}
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// Prepare method overrides.
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
//给BeanPostProcessors机会返回代理对象,calc会在执行这个逻辑
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
//真正创建bean的逻辑
// 同2.1AnnotationAwareAspectJAutoProxyCreator Bean实例是如何创建的 创建AnnotationAwareAspectJAutoProxyCreator Bean实例
// 即 - doCreateBean
// - createBeanInstance(创建bean实例)
// - populateBean(给bean实例赋值)
// - initializeBean
// - invokeAwareMethods(如果是Aware接口,那么进行一些处理)
// - applyBeanPostProcessorsBeforeInitialization (调用BeanPostProcessor的beforeInitialization方法)
// - invokeInitMethods(执行自定义的初始化方法@PostInit)
// - applyBeanPostProcessorsAfterInitialization(调用BeanPostProcessor的afterInitialization方法)
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
- AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
java
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.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
//拿到所有的BeanPostProcessor,执行postProcessBeforeInstantiation方法
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
//拿到所有的BeanPostProcessor,执行postProcessBeforeInstantiation
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
2.1.1. 执行postProcessBeforeInstantiation方法
- AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
java
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
//遍历所有BeanPostProcessor
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
//如果是InstantiationAwareBeanPostProcessor(我们的AspectJAnnotationAutoProxyCreator)
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
//执行postProcessBeforeInstantiation方法
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
//不为空才返回
if (result != null) {
return result;
}
}
}
return null;
}
2.1.2. 执行postProcessAfterInitialization方法
- AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
java
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
//遍历所有BeanPostProcessor
for (BeanPostProcessor processor : getBeanPostProcessors()) {
//执行postProcessAfterInitialization方法
result = processor.postProcessAfterInitialization(result, beanName);
if (result == null) {
return result;
}
}
return result;
}