3.Java Spring框架源码分析-AOP-AnnotationAwareAspectJAutoProxyCreator是在什么时候起作用的

目录

  • [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方法)

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