SpringAOP源碼解析(AnnotationAwareAspectJAutoProxyCreator 註冊)

下面的源碼分析基於Spring版本 5.0.6.RELEASE

目錄

分析創建和註冊AnnotationAwareAspectJAutoProxyCreator的流程

1、瞧瞧這個註解都有啥

2、接下來重點研究 AnnotationAwareAspectJAutoProxyCreator的創建過程

3、我們來展開分析一下做爲beanPostProcessor後置處理器,究竟做了哪些工作;做爲BeanFactoryAware又做了哪些工作:

3.1、register()傳入配置類,準備創建ioc容器

3.2、調用refresh()刷新創建容器;

3.3、分析方法 registerBeanPostProcessors(beanFactory) ;

3.3.1、創建 internalAutoProxyCreatorr

3.3.2、初始化實例 internalAutoProxyCreator

3.3.3、註冊實現了Ordered接口的BeanPostProcessor;


分析創建和註冊AnnotationAwareAspectJAutoProxyCreator的流程

AnnotationAwareAspectJAutoProxyCreator 翻譯過來其實就叫做 ”註解裝配模式的ASPECT切面自動代理創建器”組件@EnableAspectJAutoProxy 核心從這個入手,AOP整個功能要啓作用,就靠這個註解

1、瞧瞧這個註解都有啥

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 關注這個引入的類,這是整個AOP的入口
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {

	/**
	 * 採用JDK動態代理織入增強(實現接口的方式);如果設爲true,則採用CGLIB動態代理織入增強
	 */
	boolean proxyTargetClass() default false;

	/**
	 * 通過aop框架暴露該代理對象,讓aopContext能夠訪問
	 */
	boolean exposeProxy() default false;

}

當 AbstractApplicationContext 執行 refresh()方法時,在 invokeBeanFactoryPostProcessors(beanFactory) 方法執行時會回調所有實現了接口 ImportBeanDefinitionRegistrar 的 registerBeanDefinitions 方法 

class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
	@Override
	public void registerBeanDefinitions(
			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
                // 註冊組件 AnnotationAwareAspectJAutoProxyCreator.class,關注這行
		AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

		AnnotationAttributes enableAspectJAutoProxy =
				AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
		if (enableAspectJAutoProxy != null) {
			if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
				AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
			}
			if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
				AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
			}
		}
	}
}

 

// org.springframework.aop.config.AopConfigUtils.java line 103 ,註冊組件	
public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry,
			@Nullable Object source) {
		return 
// 註冊或升級 AnnotationAwareAspectJAutoProxyCreator.class,第一次我們只關注註冊
registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
	}

 跟進代碼看看,這裏會註冊一個名爲  org.springframework.aop.config.internalAutoProxyCreator  的組件

	private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry,
			@Nullable Object source) {
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {
			BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
			if (!cls.getName().equals(apcDefinition.getBeanClassName())) {
				int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName());
				int requiredPriority = findPriorityForClass(cls);
				if (currentPriority < requiredPriority) {
					apcDefinition.setBeanClassName(cls.getName());
				}
			}
			return null;
		}
		RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
		beanDefinition.setSource(source);
		beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
		beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
                // 真正註冊組件的地方,該常量名爲:org.springframework.aop.config.internalAutoProxyCreator
		registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
		return beanDefinition;
	}

2、接下來重點研究 AnnotationAwareAspectJAutoProxyCreator的創建過程

先來一張類繼承關係圖

繼承關係圖
標題

SmartInstantiationAwareBeanPostProcessor: bean的後置處理器;
BeanFactoryAware 能把beanFacotry bean工廠傳進來 ;
通過分析以上的bean繼承關係我們發現,具有BeanPostProcessor特點, 也有Aware接口的特點, 實現了BeanFactoryAware 接口;

3、我們來展開分析一下做爲beanPostProcessor後置處理器,究竟做了哪些工作;做爲BeanFactoryAware又做了哪些工作:

3.1、register()傳入配置類,準備創建ioc容器

//	org.springframework.context.annotation.AnnotationConfigApplicationContext line 87
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
		this();
                // 註冊配置類,跟進去看
		register(annotatedClasses);
		refresh();
	}
//	org.springframework.context.annotation.AnnotatedBeanDefinitionReader line 213
<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,
			@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {
		AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
		if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
			return;
		}
		abd.setInstanceSupplier(instanceSupplier);
		ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
		abd.setScope(scopeMetadata.getScopeName());
		String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
		AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
		if (qualifiers != null) {
			for (Class<? extends Annotation> qualifier : qualifiers) {
				if (Primary.class == qualifier) {
					abd.setPrimary(true);
				}
				else if (Lazy.class == qualifier) {
					abd.setLazyInit(true);
				}
				else {
					abd.addQualifier(new AutowireCandidateQualifier(qualifier));
				}
			}
		}
		for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
			customizer.customize(abd);
		}
		BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
		definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
                // 註冊BeanDefinition
		BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
	}

3.2、調用refresh()刷新創建容器;

//	org.springframework.context.annotation.AnnotationConfigApplicationContext line 88	
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
		this();
		register(annotatedClasses);
                // 刷新創建容器
		refresh();
	}
	public void refresh() throws BeansException, IllegalStateException {
		// 來個鎖,不然 refresh() 還沒結束,你又來個啓動或銷燬容器的操作,那不就亂套了嘛
		synchronized (this.startupShutdownMonitor) {
			// 準備工作,記錄下容器的啓動時間、標記“已啓動”狀態、處理配置文件中的佔位符
			prepareRefresh();
			// ☆☆,這步完成後,配置文件就會解析成一個個 Bean 定義,註冊到 BeanFactory 中,
      		        // 當然,這裏說的 Bean 還沒有初始化,只是配置信息都提取出來了,
      		        // 註冊也只是將這些信息都保存到了ioc容器中
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
			// 設置 BeanFactory 的類加載器,添加幾個 BeanPostProcessor,手動註冊幾個特殊的 bean
			prepareBeanFactory(beanFactory);
			try {
         		        // 這裏是提供給子類的擴展點,到這裏的時候,所有的 Bean 都加載、註冊完成了,但是都還沒有初始化
         		        // 具體的子類可以在這步的時候添加一些特殊的 BeanFactoryPostProcessor 的實現類或做點什麼事
				postProcessBeanFactory(beanFactory);
				// 調用 BeanFactoryPostProcessor 各個實現類的 postProcessBeanFactory(factory) 方法
				invokeBeanFactoryPostProcessors(beanFactory);
				    // 註冊 BeanPostProcessor 的實現類,注意看和 BeanFactoryPostProcessor 的區別
         		        // BeanPostProcessor接口有兩個方法: postProcessBeforeInitialization 和 postProcessAfterInitialization
         		        // 而BeanFactoryPostProcessor接口只有一個方法:postProcessBeanFactory
         		        // 兩個方法分別在 Bean 初始化之前和初始化之後得到執行。注意,到這裏 Bean 還沒初始化
				registerBeanPostProcessors(beanFactory);
				// 初始化當前 ApplicationContext 的 MessageSource,國際化相關代碼略過不談
				initMessageSource();
				// 初始化當前 ApplicationContext 的事件廣播器,這裏也不展開了
				initApplicationEventMulticaster();
				// 典型的模板方法,具體的子類可以在這裏初始化一些特殊的 Bean(在初始化 singleton beans 之前)
				onRefresh();
				// 註冊事件監聽器,監聽器需要實現 ApplicationListener 接口。這也不是我們的重點,過
				registerListeners();
				// ★★★★,初始化所有的 singleton beans,lazy-init 的除外,圈起來,重點必考題
				finishBeanFactoryInitialization(beanFactory);
				// 最後,廣播事件,ApplicationContext 初始化完成
				finishRefresh();
			}
			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}
				// 銷燬已經初始化的 singleton 的 Beans,以免有些 bean 會一直佔用資源
				destroyBeans();
				// Reset 'active' flag.
				cancelRefresh(ex);
				// Propagate exception to caller.
				throw ex;
			}
			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}

3.3、分析方法 registerBeanPostProcessors(beanFactory) ;

註冊bean的後置處理器,用來攔截其他bean的創建(主要關注在哪裏註冊AnnotationAwareAspectJAutoProxyCreator);

	protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
	}

  •      先獲取ioc容器已經定義了的需要創建對象的所有BeanPostProcessor
  •      給容器中加別的BeanPostProcessor
  •      優先註冊實現了PriorityOrdered接口的BeanPostProcessor;
  •      創建後置處理器 internalAutoProxyCreator

  •      註冊實現了Ordered接口的BeanPostProcessor;
  •      註冊沒實現優先級接口的BeanPostProcessor;
  •      最後註冊Spring內部的BeanPostProcessor;
// org.springframework.context.support.PostProcessorRegistrationDelegate line 186
public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
		// 1)、 先獲取ioc容器已經定義了的需要創建對象的所有BeanPostProcessor
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		// 2)、給容器中加額外的BeanPostProcessor
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		// 3)、優先註冊實現了PriorityOrdered接口的BeanPostProcessor;
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
		for (String ppName : orderedPostProcessorNames) {
                        // 4)、☆☆☆ 創建後置處理器 internalAutoProxyCreator,下文會單獨講解
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		/* 5)、☆再給容器中註冊實現了Ordered接口的BeanPostProcessor,其中 AnnotationAwareAspectJAutoProxyCreator 就是在這裏進行註冊的*/
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);
		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
		for (String ppName : nonOrderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			nonOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		// 6)、註冊沒實現優先級接口的BeanPostProcessor;
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
		sortPostProcessors(internalPostProcessors, beanFactory);
		// 7)、註冊Spring已經創建好的BeanPostProcessor;
		registerBeanPostProcessors(beanFactory, internalPostProcessors);
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

接下來分三個步驟講解,分別是創建實例,初始化實例,初始化包含(應用工廠回調以及init方法和bean後處理器);這兩個小步驟是上文中的 創建後置處理器 internalAutoProxyCreator  的拆分;然後講解  註冊實現了Ordered接口的BeanPostProcessor; 

3.3.1、創建 internalAutoProxyCreatorr

【其實就是AnnotationAwareAspectJAutoProxyCreator】,代碼跟到上述代碼中提到的第4)點,對應代碼 

BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);跟進去瞅瞅;

// org.springframework.beans.factory.support.AbstractBeanFactory line 239
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
			@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
		final String beanName = transformedBeanName(name);
		Object bean;
		// 容器此時還沒有該Bean,返回 null
		Object sharedInstance = getSingleton(beanName);
		// 此處忽略部分代碼 ···
				if (mbd.isSingleton()) {
					sharedInstance = getSingleton(beanName, () -> {
						try {
							// 調用父類的父類的方法創建bean
							return createBean(beanName, mbd, args);
						}
						catch (BeansException ex) {
							destroySingleton(beanName);
							throw ex;
						}
					});
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}
		// 此處忽略部分代碼 ···
		}

這裏看一下Bean工廠的繼承關係,當前Bean工廠爲 強悍的DefaultListableBeanFactory,向上轉型成  AbstractBeanFactory,執行AbstractBeanFactory的方法 createBean(beanName, mbd, args),該方法是在其父類的父類 DefaultSingletonBeanRegistry 中定義的,被其子類 AbstractAutowireCapableBeanFactory 重寫,所以下面關注 AbstractAutowireCapableBeanFactory 這個類;

我們看看類 AbstractAutowireCapableBeanFactory  方法

createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)

	// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java line 501
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {
		if (logger.isDebugEnabled()) {
			logger.debug("Creating instance of bean '" + beanName + "'");
		}
		RootBeanDefinition mbdToUse = mbd;
		// 解析bean的類型
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
			mbdToUse = new RootBeanDefinition(mbd);
			mbdToUse.setBeanClass(resolvedClass);
		}
		// 處理override method方法
		try {
			mbdToUse.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
					beanName, "Validation of method overrides failed", ex);
		}
		try {
			// 返回代理對象,AOP的實現基礎就是基於這裏來實現的,後續講被切面攔截的對象創建時會詳細講解,這裏暫時略過
			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);
		}
		try {
			// ☆☆☆☆ 創建對象,此時beanName = "org.springframework.aop.config.internalAutoProxyCreator",args = null;
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			if (logger.isDebugEnabled()) {
				logger.debug("Finished creating instance of bean '" + beanName + "'");
			}
			return beanInstance;
		}
		// catch 部分代碼省略···
	}

	// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java line 532
	protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
			throws BeanCreationException {
		// bean實例包裝類,用於操作bean的屬性		
		BeanWrapper instanceWrapper = null;
		// 如果是單例的話,則先把工廠bean緩存中的同名bean清除
		if (mbd.isSingleton()) {
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {
			// ☆☆ 創建bean實例,下面的代碼會講解,看看註釋瞭解即可。
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		final Object bean = instanceWrapper.getWrappedInstance();
		// 獲取BeanWrapper中封裝的bean的Class
		Class<?> beanType = instanceWrapper.getWrappedClass();
		if (beanType != NullBean.class) {
			mbd.resolvedTargetType = beanType;
		}
		synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {
				try {
					 // bean 的生命週期之一。如果實現了MergedBeanDefinitionPostProcessor會在這裏調用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;
			}
		}
		// 如果RootBeanDefinition是單例的,並且開啓了自動嘗試解析bean之間的循環引用,並且當前bean正在創建中,則將其加入單例工廠緩存singletonFactories中,是個Map<String, ObjectFactory<?>>
		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			if (logger.isDebugEnabled()) {
				logger.debug("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
			/* 將 org.springframework.aop.config.internalAutoProxyCreator 加入單例工廠緩存singletonFactories,以下截取了主要代碼進行展示			
				this.singletonFactories.put(beanName, singletonFactory);
				this.earlySingletonObjects.remove(beanName);
				this.registeredSingletons.add(beanName);
			 */
			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
		}
		// 對已有的bean的實例初始化  一般情況下依賴注入就在這裏發生
		Object exposedObject = bean;
		try {
			// 填充bean的屬性
			populateBean(beanName, mbd, instanceWrapper);
			// ☆☆☆ 初始化bean的實例,應用工廠回調以及init方法和bean後處理器
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}
		catch (Throwable ex) {
			if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
				throw (BeanCreationException) ex;
			}
			else {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
			}
		}
		if (earlySingletonExposure) {
			// 從BeanFactory的單例緩存中獲取bean的實例
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {
				if (exposedObject == bean) {
					exposedObject = earlySingletonReference;
				}
				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
					String[] dependentBeans = getDependentBeans(beanName);
					Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
					// 處理循環依賴
					for (String dependentBean : dependentBeans) {
						if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
							actualDependentBeans.add(dependentBean);
						}
					}
					if (!actualDependentBeans.isEmpty()) {
						// throw 部分代碼省略···
					}
				}
			}
		}
		// 註冊bean的銷燬邏輯
		try {
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}
		return exposedObject;
	}	

接着上述代碼中的 帶有註釋【☆☆ 創建bean實例】的行,簡單講解下

		// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java line 1135
		protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
			// 此處 beanClass = org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator
			Class<?> beanClass = resolveBeanClass(mbd, beanName);
			// 中間省略大量代碼,最終會執行到這行,即使用無參構造函數創建Bean
			return instantiateBean(beanName, mbd);
		}	
			// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java line 1228
			protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
			try {
				Object beanInstance;
				final BeanFactory parent = this;
				if (System.getSecurityManager() != null) {
					beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
							getInstantiationStrategy().instantiate(mbd, beanName, parent),
							getAccessControlContext());
				}
				else {
					// 實例化bean,跟上節奏,別掉隊
					beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
				}
				// 將實例化的 bean 進行包裝
				BeanWrapper bw = new BeanWrapperImpl(beanInstance);
				initBeanWrapper(bw);
				return bw;
			}
			// catch 部分代碼省略···
			}
				// 此時代碼跳轉到了 org.springframework.beans.factory.support.SimpleInstantiationStrategy.java line 61
				public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
				if (!bd.hasMethodOverrides()) {
					Constructor<?> constructorToUse;
					// 省略部分代碼 ···
					// 使用 springframework 內部工具類創建實例,跟進去看看
					return BeanUtils.instantiateClass(constructorToUse);
				}
				else {
					return instantiateWithMethodInjection(bd, beanName, owner);
				}
				}
					// org.springframework.beans.BeanUtils line 170
					public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException {
						Assert.notNull(ctor, "Constructor must not be null");
						try {
							ReflectionUtils.makeAccessible(ctor);
							// 跟進 ctor.newInstance(args)
							return (KotlinDetector.isKotlinType(ctor.getDeclaringClass()) ?
									KotlinDelegate.instantiateClass(ctor, args) : ctor.newInstance(args));
						}
						// catch 異常部分代碼略
					}
						// java.lang.reflect.Constructor.java line 423
					    public T newInstance(Object ... initargs)
					        throws InstantiationException, IllegalAccessException,
					               IllegalArgumentException, InvocationTargetException
					    {
							// 省略部分代碼···
					        @SuppressWarnings("unchecked")
					        // 創建 bean 的終點站到啦!!!這裏利用java 反射原理創建實例
					        T inst = (T) ca.newInstance(initargs);
					        return inst;
					    }

到此爲止,實例已經創建完畢,接下來我看看bean 的初始化

3.3.2、初始化實例 internalAutoProxyCreator

	protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				// 3.3.2.1:處理Aware接口的方法回調
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			invokeAwareMethods(beanName, bean);
		}
		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			// 3.3.2.2:應用後置處理器的postProcessBeforeInitialization()
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}
		try {
			// 3.3.2.3:執行自定義的初始化方法
			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()) {
			// 3.3.2.4:執行後置處理器的postProcessAfterInitialization();
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		return wrappedBean;
	}

分別解析一下上述代碼中含註釋的部分

3.3.2.1、處理Aware接口的方法回調

	private void invokeAwareMethods(final String beanName, final Object bean) {
		// 如果沒有實現Aware接口,直接退出方法了;這裏顯然是實現了
		if (bean instanceof Aware) {
			// 沒有實現 BeanNameAware
			if (bean instanceof BeanNameAware) {
				((BeanNameAware) bean).setBeanName(beanName);
			}
			// 判斷成功,設置類加載器
			if (bean instanceof BeanClassLoaderAware) {
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			// ☆☆ 判斷成功,設置 bean 工廠
			if (bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}
	// org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.java line 57
	public void setBeanFactory(BeanFactory beanFactory) {
		// 調用父類方法設置工廠
		super.setBeanFactory(beanFactory);
		if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
			throw new IllegalArgumentException(
					"AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);
		}
		// 初始化 bean 工廠,跟進去摟一眼
		initBeanFactory((ConfigurableListableBeanFactory) beanFactory);
	}
		// org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.java line 79
		protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
		super.initBeanFactory(beanFactory);
		if (this.aspectJAdvisorFactory == null) {
			// 創建了ReflectiveAspectJAdvisorFactory反射機制,相當於把aspectJAdvisorFactory對象通知工廠
			this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);
		}
		// 通知適配器,相當於aspectJAdvisorFactory通知到構建器的適配器, 把aspectJAdvisorFactory重新包裝了一下
		this.aspectJAdvisorsBuilder =
				new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
		}

3.3.2.2、應用後置處理器的postProcessBeforeInitialization();

	// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java line 417
	public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException {
		Object result = existingBean;
		/*在這裏接收來自Spring內部的後置處理器的洗禮(postProcessBefore),後置處理大禮包走起
		org.springframework.context.support.ApplicationContextAwareProcessor
		org.springframework.context.support.ApplicationListenerDetector
		org.springframework.context.annotation.ConfigurationClassPostProcessor
		org.springframework.context.support.PostProcessorRegistrationDelegate
		org.springframework.context.annotation.CommonAnnotationBeanPostProcessor
		org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
		org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor
		*/
		for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
			Object current = beanProcessor.postProcessBeforeInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}		

3.3.2.3、執行自定義的初始化方法

	// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java line 1745
	protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
			throws Throwable {
		// 省略部分代碼···
		if (mbd != null && bean.getClass() != NullBean.class) {
			// 其實就是聲明@Bean註解的時候,指定初始化方法或銷燬方法是什麼,在這裏執行;當前實例類沒有設置初始化方法,這裏跳過
			String initMethodName = mbd.getInitMethodName();
			if (StringUtils.hasLength(initMethodName) &&
					!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
					!mbd.isExternallyManagedInitMethod(initMethodName)) {
				invokeCustomInitMethod(beanName, bean, mbd);
			}
		}
	}	

3.3.2.4、執行後置處理器的postProcessAfterInitialization();

	// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java line 432
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {
		Object result = existingBean;
		for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
			// 同上,在這裏接收來自Spring內部的後置處理器的洗禮(postProcessAfter)
			Object current = beanProcessor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}

好了,實例已經創建和初始化完畢了,接下來看看最後一步,

3.3.3、註冊實現了Ordered接口的BeanPostProcessor;

代碼回到 org.springframework.context.support.PostProcessorRegistrationDelegate line 233

registerBeanPostProcessors(beanFactory, internalPostProcessors);

如果到現在頭還沒暈,恭喜你,獲得最強大腦榮譽勳章一枚!深吸一口氣,馬上就結束了,跟進去看看

	private static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {
                // 將創建成功的BeanPostProcessor對象加入工廠,AOP核心對象創建完成
		for (BeanPostProcessor postProcessor : postProcessors) {
			beanFactory.addBeanPostProcessor(postProcessor);
		}
	}

 

 

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