目錄
2. AnnotationAwareAspectJAutoProxyCreator的繼承關係
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)中;