Spring AOP原理之AnnotationAwareAspectJAutoProxyCreator分析

 

目錄

1. 說明

2. AnnotationAwareAspectJAutoProxyCreator的繼承關係

3. 關鍵類分析


1. 說明

@EnableAspectJAutoProxy通過@Import導入AspectJAutoProxyRegistrar.class,然後AspectJAutoProxyRegistrar是ImportBeanDefinitionRegistrar接口的實現類,又導入了AnnotationAwareAspectJAutoProxyCreator;

2. AnnotationAwareAspectJAutoProxyCreator的繼承關係

AnnotationAwareAspectJAutoProxyCreator的繼承關係如下:
        AnnotationAwareAspectJAutoProxyCreator
            --AspectJAwareAdvisorAutoProxyCreator
                --AbstractAdvisorAutoProxyCreator
                    --AbstractAutoProxyCreator
                        -- ProxyProcessorSupport, SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
        其中
        ProxyProcessorSupport
            --ProxyConfig,Ordered,BeanClassLoaderAware,AopInfrastructureBean
        SmartInstantiationAwareBeanPostProcessor
            --InstantiationAwareBeanPostProcessor
                --BeanPostProcessor
        BeanFactoryAware
            --Aware

3. 關鍵類分析

  • 3.1 BeanFactoryAware, Aware

容器中每個組件被創建和屬性賦值之後,初始化組件的時候,會調用Aware的子接口的方法,具體實現在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(String, Object, RootBeanDefinition),代碼如下:

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
	if (System.getSecurityManager() != null) {
		AccessController.doPrivileged(new PrivilegedAction<Object>() {
			@Override
			public Object run() {
				invokeAwareMethods(beanName, bean);
				return null;
			}
		}, getAccessControlContext());
	}
	else {
		// 判斷是否實現Aware接口,執行Aware的子接口中的方法
		invokeAwareMethods(beanName, bean);
	}

	Object wrappedBean = bean;
	if (mbd == null || !mbd.isSynthetic()) {
		//執行所有BeanPostProcessor的postProcessBeforeInitialization的方法
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}

	try {
		//執行所有初始化方法:實現InitializingBean的afterPropertiesSet()方法,@Bean中init-method指定的方法和@PostConstruct標記的方法;
		invokeInitMethods(beanName, wrappedBean, mbd);
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
			(mbd != null ? mbd.getResourceDescription() : null),
				beanName, "Invocation of init method failed", ex);
	}

	if (mbd == null || !mbd.isSynthetic()) {
		//執行所有BeanPostProcessor的postProcessAfterInitialization的方法
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}
	return wrappedBean;
}

其中,org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(String, Object)代碼如下:

private void invokeAwareMethods(final String beanName, final Object bean) {
	if (bean instanceof Aware) {
		if (bean instanceof BeanNameAware) {
			((BeanNameAware) bean).setBeanName(beanName);
		}
		if (bean instanceof BeanClassLoaderAware) {
			((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
		}
		if (bean instanceof BeanFactoryAware) {
			// 通過setBeanFactory方法給BeanFactoryAware的所有實現類注入BeanFactory實例
			((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
		}
	}
}
  • 3.2 BeanPostProcessor

  BeanPostProcessor中接口中有兩個方法: 分別是 postProcessBeforeInitialization()和 postProcessAfterInitialization(),兩個方法是在組件被創建,屬性賦值之後,初始化組件的時候,調用Aware子接口方法,然後調用ostProcessBeforeInitialization接口,再調用調用所有自定義初始化方法,再調用postProcessAfterInitialization方法;具體實現在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(String, Object, RootBeanDefinition)中;

  • 3.3  InstantiationAwareBeanPostProcessor

nstantiationAwareBeanPostProcessor實現了BeanPostProcessor接口,還擴展瞭如下3個方法:

Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;

InstantiationAwareBeanPostProcessor中的postProcessBeforeInstantiation是在組件被創建之前被調用(區別於BeanPostProcessor中的兩個方法,BeanPostProcessor是在組件創建完成,屬性賦值完成之後,調用組件自定義初始化方法的時候被調用),具體被調用是在的代碼org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[]),代碼如下:

/**
 * Central method of this class: creates a bean instance,
 * populates the bean instance, applies post-processors, etc.
 * @see #doCreateBean
*/
@Override
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來創建組件的代理,並返回
		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);
	}

	Object beanInstance = doCreateBean(beanName, mbdToUse, args);
	if (logger.isDebugEnabled()) {
		logger.debug("Finished creating instance of bean '" + beanName + "'");
	}
	return beanInstance;
}

其中,org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(String, RootBeanDefinition)的代碼如下:

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) {
				// 這裏
				bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
				if (bean != null) {
					// 如果創建出組件的代理,這裏還是調用所有BeanPostProcessor的postProcessAfterInitialization方法,執行組件的初始化之後的方法調用
					bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
				}
			}
		}
		mbd.beforeInstantiationResolved = (bean != null);
	}
	return bean;
}

其中,org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(Class<?>, String)的代碼如下:

protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
	for (BeanPostProcessor bp : getBeanPostProcessors()) {
		//判斷是否是InstantiationAwareBeanPostProcessor,如果是
		if (bp instanceof InstantiationAwareBeanPostProcessor) { 
			InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
			// 調用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法,嘗試創建組件的代理
			Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
			if (result != null) {
				return result;
			}
		}
	}
	return null;
}
  • 3.4 Ordered

 Ordered接口是指定組件組件創建的優先級,優先級高的先被創建,類似的還有PriorityOrdered接口,在導入BeanPostProcessor的過程中,會先導入實現了PriorityOrdered的BeanPostProcessor,然後再導入實現了Ordered接口的BeanPostProcessor,最後再導入剩下其他的BeanPostProcessor,具體的代碼實現在org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(ConfigurableListableBeanFactory, AbstractApplicationContext)中;
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章