【ソースコード分析】DEBUG Spring IOCソースコード

SpringIOC

声明: 此博客仅记录本人DUBUG源码步骤

概略図:

ここに画像の説明を挿入

  1. XMLファイルをロードする

ここに画像の説明を挿入


ここに画像の説明を挿入

setConfigLocationsメソッド

ここに画像の説明を挿入

  1. Refreshメソッドを呼び出す

ここに画像の説明を挿入

更新方法

prepare *メソッドはすべて準備です!

@Override
	public void refresh() throws BeansException, IllegalStateException {
    
    
		synchronized (this.startupShutdownMonitor) {
    
    
			// Prepare this context for refreshing.
         	// 准备工作
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
            // 实例化BeanFactory
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
            // 准备工作,设置或忽略Factory中的一些对箱子
			prepareBeanFactory(beanFactory);

			try {
    
    
				// Allows post-processing of the bean factory in context subclasses.
                // 做扩展
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
                // 实例化并执行BeanFactoryPostProcessors
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
                // 注册BeanPostProcessors
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
                // 国际化处理
				initMessageSource();

				// Initialize event multicaster for this context.
                // 初始化一个广播器
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
                // 扩展
				onRefresh();

				// Check for listener beans and register them.
                // 注册监听器
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
                // 实例化Bean
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
                // 刷新
				finishRefresh();
			}

			catch (BeansException ex) {
    
    
				logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}
		}
	}

prepareRefresh()メソッド

ここに画像の説明を挿入

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 创建BeanFactory对象

ここに画像の説明を挿入

refreshBeanFactoryメソッド

ここに画像の説明を挿入

prepareBeanFactory(beanFactory);

クラスローダーやコンテキストのポストプロセッサなど、構成ファクトリの標準コンテキスト機能。

ここに画像の説明を挿入

postProcessBeanFactory(beanFactory);

サブクラス拡張

ここに画像の説明を挿入

invokeBeanFactoryPostProcessors(beanFactory)

BeanFactoryPostProcessorsをインスタンス化して実行します!

ここに画像の説明を挿入

registerBeanPostProcessors(beanFactory)

BeanPostProcessor Beanを登録する

ここに画像の説明を挿入

initMessageSource();

国際処理!

ここに画像の説明を挿入

initApplicationEventMulticaster()

放送局を初期化!

ここに画像の説明を挿入

registerListeners()

リスナーを登録してください!

ここに画像の説明を挿入

finishBeanFactoryInitialization(beanFactory);

Beanをインスタンス化する

ここに画像の説明を挿入

ここに画像の説明を挿入

@Override
	public void preInstantiateSingletons() throws BeansException {
    
    
		if (this.logger.isDebugEnabled()) {
    
    
			this.logger.debug("Pre-instantiating singletons in " + this);
		}

		// Iterate over a copy to allow for init methods which in turn register new bean definitions.
		// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
		List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

		// Trigger initialization of all non-lazy singleton beans...
		for (String beanName : beanNames) {
    
    
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
    
    
				if (isFactoryBean(beanName)) {
    
    
					final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
    
    
						isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
    
    
							@Override
							public Boolean run() {
    
    
								return ((SmartFactoryBean<?>) factory).isEagerInit();
							}
						}, getAccessControlContext());
					}
					else {
    
    
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}
					if (isEagerInit) {
    
    
						getBean(beanName);
					}
				}
				else {
    
    
					getBean(beanName);
				}
			}
		}

ここに画像の説明を挿入

ここに画像の説明を挿入

doGetBeanメソッド内

ここに画像の説明を挿入

createBeanメソッド内

ここに画像の説明を挿入

ここに画像の説明を挿入

createBeanInstanceメソッドでは、Beanオブジェクトは一連のリフレクションロジックを通じて作成されます。

ここに画像の説明を挿入

属性値を使用して、指定されたBeanWrapperにBeanインスタンスを入力します

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

この時点で、Beanが作成され、インスタンス化されます。

finishRefresh()

このコンテキストの更新を完了するには、LifecycleProcessorのonRefresh()メソッドを呼び出して公開します

ここに画像の説明を挿入

添付:Beanのライフサイクル

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_42380734/article/details/108059099