国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【細讀Spring Boot源碼】重中之重refresh()

這篇具有很好參考價值的文章主要介紹了【細讀Spring Boot源碼】重中之重refresh()。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

版本:spring-boot-2.7.3 | spring-context-5.3.22

在Spring Boot啟動過程中【細讀Spring Boot源碼】啟動步驟 主流程詳情7中applicationContext.refresh();這個操作是加載或刷新容器,把所有的配置轉(zhuǎn)換成響應的對象并存入容器。
下面看下他的具體執(zhí)行流程

調(diào)用主流程

主流程使用了模板模式是一個模板方法

@Override
public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// 步驟記錄器記錄開始
		StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

		// Prepare this context for refreshing.
		// 準備刷新。詳看1	
		prepareRefresh();

		// Tell the subclass to refresh the internal bean factory.
		// 告訴子類刷新內(nèi)部 bean 工廠,得到Bean工廠。詳看2
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

		// Prepare the bean factory for use in this context.
		//  準備 bean 工廠以在此上下文中使用。詳看3
		prepareBeanFactory(beanFactory);

		try {
			// Allows post-processing of the bean factory in context subclasses.
			// 在標準初始化后修改應用程序上下文的內(nèi)部bean工廠。
			// 所有bean定義都已加載,但尚未實例化bean。
			// 這允許在某些應用程序上下文實現(xiàn)中注冊特殊的BeanPostProcessors等。詳看4
			postProcessBeanFactory(beanFactory);

			StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
			// Invoke factory processors registered as beans in the context.
			// 調(diào)用工廠處理注冊Bean到上下文
			invokeBeanFactoryPostProcessors(beanFactory);

			// Register bean processors that intercept bean creation.
			// 從BeanFactory掃描找出BeanPostProcessor,實例化并注冊到BeanFactory里beanPostProcessors屬性中
			// 詳看6
			registerBeanPostProcessors(beanFactory);
			beanPostProcess.end();

			// Initialize message source for this context.
			// 初始化消息資源。詳看7
			initMessageSource();

			// Initialize event multicaster for this context.
			// 初始化應用事件多播器。詳看8
			initApplicationEventMulticaster();

			// Initialize other special beans in specific context subclasses.
			// 在特定上下文子類中初始化其他特殊bean。詳看9
			onRefresh();

			// Check for listener beans and register them.
			// 注冊監(jiān)聽器。詳看10
			registerListeners();

			// Instantiate all remaining (non-lazy-init) singletons.
			// 實例化所有剩余的 (非惰性init) 單例。詳看11
			finishBeanFactoryInitialization(beanFactory);

			// Last step: publish corresponding event.
			// 發(fā)布相應的事件。詳看12
			finishRefresh();
		}

		catch (BeansException ex) {
			if (logger.isWarnEnabled()) {
				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;
		}

		finally {
			// Reset common introspection caches in Spring's core, since we
			// might not ever need metadata for singleton beans anymore...
			// 重置通用緩存
			resetCommonCaches();
			// 刷新結(jié)束
			contextRefresh.end();
		}
	}
}

詳情1——準備刷新prepareRefresh()

Springboot容器沒有直接使用AbstractApplicationContext抽象類默認實現(xiàn)方法,Springboot容器是AnnotationConfigServletWebServerApplicationContext類,
功能如下:

  1. 清除之前容器緩存
  2. 記錄時間,撤銷關(guān)閉狀態(tài),開啟活躍狀態(tài)
  3. 初始化屬性源信息(Property)
  4. 驗證環(huán)境信息里一些必須存在的屬性
  5. 把早期使用的監(jiān)聽器存入監(jiān)聽器列表

實現(xiàn)如下

protected void prepareRefresh() {
	// 清除緩存,理解這里在清除之前容器的緩存。例如:nacos引導容器啟動時使用的緩存
	this.scanner.clearCache();
	// 再調(diào)用AbstractApplicationContext抽象類默認實現(xiàn)
	super.prepareRefresh();
}

看下AbstractApplicationContext抽象類默認實現(xiàn)。

protected void prepareRefresh() {
	// Switch to active.
	// 切換到活躍
	this.startupDate = System.currentTimeMillis();
	this.closed.set(false);
	this.active.set(true);

	if (logger.isDebugEnabled()) {
		if (logger.isTraceEnabled()) {
			logger.trace("Refreshing " + this);
		}
		else {
			logger.debug("Refreshing " + getDisplayName());
		}
	}

	// Initialize any placeholder property sources in the context environment.
	// 初始化上下文環(huán)境中的任何占位符屬性源
	initPropertySources();

	// Validate that all properties marked as required are resolvable:
	// see ConfigurablePropertyResolver#setRequiredProperties
	// 驗證標記為必需的所有屬性都是可解析的
	getEnvironment().validateRequiredProperties();

	// Store pre-refresh ApplicationListeners...
	// 存儲預刷新 ApplicationListeners
	if (this.earlyApplicationListeners == null) {
		this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
	}
	else {
		// Reset local application listeners to pre-refresh state.
		// 清空
		this.applicationListeners.clear();
		// 把早期使用的監(jiān)聽器存入監(jiān)聽器列表
		this.applicationListeners.addAll(this.earlyApplicationListeners);
	}

	// Allow for the collection of early ApplicationEvents,
	// to be published once the multicaster is available...
	// 允許早期應用程序事件的集合,一旦multicaster可用就發(fā)布
	this.earlyApplicationEvents = new LinkedHashSet<>();
}

詳看2——obtainFreshBeanFactory()

獲取BeanFactory

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
	// 刷新Bean工廠
	refreshBeanFactory();
	// 得到Bean工廠
	return getBeanFactory();
}

其中refreshBeanFactory()是AbstractApplicationContext抽象類的一個抽象方法。
子類必須實現(xiàn)此方法才能執(zhí)行實際的配置負載。在任何其他初始化工作之前,該方法都會通過refresh() 調(diào)用。
子類將創(chuàng)建一個新的bean工廠并持有對它的引用,或者返回它持有的單個BeanFactory實例。在后一種情況下,如果多次刷新上下文,通常會拋出IllegalStateException。
實際上就是:刷新內(nèi)部 bean 工廠,把當前上下文的Bean工廠切換為當前的Bean工廠。

protected final void refreshBeanFactory() throws IllegalStateException {
	// 如果當前值 = 期望值,則原子地將值設(shè)置為給定的更新值
	// 這個來判斷當前容器是否刷新過。即refreshed的值為false,就把值替換為true,并返回true。取反
	if (!this.refreshed.compareAndSet(false, true)) {
		// 如果刷新過就拋出異常
		throw new IllegalStateException(
				"GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
	}
	// 替換。為序列化目的指定一個id,如果需要的話,允許這個BeanFactory從這個id反序列化回BeanFactory對象。
	this.beanFactory.setSerializationId(getId());
}

詳看3——prepareBeanFactory(beanFactory)

設(shè)置這個工廠(BeanFactory)的標準上下文特征(一些配置),例如上下文的類加載器和后處理器。

在這之前先了解幾個方法:

  • void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);這個方法:添加一個新的BeanPostProcessor,該處理器將應用于該工廠創(chuàng)建的bean。在工廠配置期間調(diào)用。

注意: 此處提交的后處理器將按注冊順序應用; 通過實現(xiàn)org.springframework.core.Ordered接口表達的任何排序語義將被忽略。
請注意,自動檢測的后處理器 (例如,在ApplicationContext中作為bean) 將始終在以編程方式注冊的處理器之后應用。

  • void ignoreDependencyInterface(Class<?> ifc);這個方法:忽略給定的依賴接口進行自動查詢。
    這通常將由應用程序上下文用于注冊依賴關(guān)系,這些依賴關(guān)系以其他方式解決,例如通過BeanFactoryAware的BeanFactory或通過ApplicationContext的ApplicationContext。
    默認情況下,僅忽略BeanFactoryAware接口。對于要忽略的其他類型,請為每種類型調(diào)用此方法。

  • void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);這個方法:用相應的autowired值注冊一個特殊的依賴類型。這適用于factorycontext引用,這些引用應該是自動的,但在工廠中未定義為bean: 例如,ApplicationContext類型的依賴關(guān)系解析為bean所在的ApplicationContext實例。

注意: 在普通BeanFactory中沒有注冊這樣的默認類型,甚至對于BeanFactory接口本身也沒有。
Spring源碼筆記之beanFactory.registerResolvableDependency()方法,這個文章里解釋的很清楚,還有使用示例。

  • void registerSingleton(String beanName, Object singletonObject);這個方法:在給定的bean名稱下,在bean注冊表中將給定的現(xiàn)有對象注冊為singleton。
    給定的實例應該是完全初始化的; 注冊表不會執(zhí)行任何初始化回調(diào) (特別是,它不會調(diào)用InitializingBean的afterPropertiesSet方法)。給定的實例也不會收到任何破壞回調(diào) (如dispoablebean的destroy方法)。
    在full BeanFactory中運行時: 如果您的bean應該接收初始化和/或銷毀回調(diào),請注冊bean定義而不是現(xiàn)有實例。
    通常在注冊表配置期間調(diào)用,但也可以用于單例的運行時注冊。因此,注冊表實現(xiàn)應該同步單例訪問; 如果它支持BeanFactory的單例延遲初始化,則無論如何都必須這樣做

根據(jù)上面的鋪墊,看下面就很順暢。分為3部分

  1. 設(shè)置表達式解析器
  2. 添加應用上下文Aware的BeanPostProcessor和忽略EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationStartupAware
  3. 設(shè)置特殊的類型對應的bean。BeanFactory對應剛剛獲取的BeanFactory;ResourceLoader、ApplicationEventPublisher、ApplicationContext這3個接口對應的bean都設(shè)置為當前的Spring容器
  4. 注入一些其它信息的bean,比如environment、systemProperties等
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	// Tell the internal bean factory to use the context's class loader etc.
	// 將內(nèi)部bean工廠使用上下文的類加載器等
	beanFactory.setBeanClassLoader(getClassLoader());
	// 忽略表達式
	if (!shouldIgnoreSpel) {
		// 設(shè)置Bean表達式解析器
		beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
	}
	// 添加屬性編輯器注冊器
	beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

	// Configure the bean factory with context callbacks.
	// 添加上下文感知處理器
	beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
	// 忽略環(huán)境感知
	beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
	// 忽略內(nèi)含價值解析器感知
	beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
	// 忽略資源加載感知
	beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
	// 忽略應用程序事件發(fā)布者感知
	beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
	// 忽略消息資源感知
	beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
	// 忽略應用上下文感知
	beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
	// 忽略應用啟動步驟感知
	beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);

	// BeanFactory interface not registered as resolvable type in a plain factory.
	// MessageSource registered (and found for autowiring) as a bean.
	// 其他類想要用BeanFactory.class,就注入beanFactory。下面幾個同理
	beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
	beanFactory.registerResolvableDependency(ResourceLoader.class, this);
	beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
	beanFactory.registerResolvableDependency(ApplicationContext.class, this);

	// Register early post-processor for detecting inner beans as ApplicationListeners.
	// 注冊早期的后處理器,用于檢測內(nèi)部bean作為應用程序偵聽器。
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

	// Detect a LoadTimeWeaver and prepare for weaving, if found.
	if (!NativeDetector.inNativeImage() && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
		beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
		// Set a temporary ClassLoader for type matching.
		beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
	}

	// Register default environment beans.
	// 注入一些其它信息的bean,比如environment、systemProperties等
	if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
		beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
	}
	if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
		beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
	}
	if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
		beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
	}
	if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
		beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
	}
}

詳看4——postProcessBeanFactory(beanFactory);

這步處理所有的Bean

protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	super.postProcessBeanFactory(beanFactory);
	if (this.basePackages != null && this.basePackages.length > 0) {
		this.scanner.scan(this.basePackages);
	}
	if (!this.annotatedClasses.isEmpty()) {
		this.reader.register(ClassUtils.toClassArray(this.annotatedClasses));
	}
}

代碼super.postProcessBeanFactory(beanFactory)詳情

protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	// 添加一個BeanPostProcessor,
	// 用于初始化ServletContextAware、ServletConfigAware時使用,即在初始化ServletContext或ServletConfig之前使用
	beanFactory.addBeanPostProcessor(new WebApplicationContextServletContextAwareProcessor(this));
	// 忽略給定的ServletContextAware依賴接口進行自動查詢。
	// 默認僅忽略BeanFactoryAware接口。對于要忽略的其他類型,請為每種類型調(diào)用此方法
	beanFactory.ignoreDependencyInterface(ServletContextAware.class);
	// 注冊Web應用程序范圍,request范圍和session范圍
	registerWebApplicationScopes();
}

代碼registerWebApplicationScopes();詳情

private void registerWebApplicationScopes() {
	// 這個是內(nèi)部類,里面處理從beanFactory里取request、session對應的話就把域包裝到set里封裝成這個對象
	ExistingWebApplicationScopes existingScopes = new ExistingWebApplicationScopes(getBeanFactory());
	// 使用指定的beanFactory注冊web具體request、session、globalSession范圍
	WebApplicationContextUtils.registerWebApplicationScopes(getBeanFactory());
	// 把上面的域恢復注冊到beanFactory里,以確保后面對域的正確使用。
	// 上面方法內(nèi)注冊了一個新的request、session、application,這里如果之前有那么就恢復之前的
	existingScopes.restore();
}

代碼WebApplicationContextUtils.registerWebApplicationScopes(getBeanFactory());詳情

public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory) {
	registerWebApplicationScopes(beanFactory, null);
}
	
public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory,
		@Nullable ServletContext sc) {

	// 注冊一個新的request域
	beanFactory.registerScope(WebApplicationContext.SCOPE_REQUEST, new RequestScope());
	// 注冊一個新的session域
	beanFactory.registerScope(WebApplicationContext.SCOPE_SESSION, new SessionScope());
	// 如果服務上下文不為空,
	if (sc != null) {
		ServletContextScope appScope = new ServletContextScope(sc);
		// 注冊一個application域
		beanFactory.registerScope(WebApplicationContext.SCOPE_APPLICATION, appScope);
		// 并注冊為ServletContext屬性,以供ContextCleanupListener檢測。
		sc.setAttribute(ServletContextScope.class.getName(), appScope);
	}

	// 為request、response、session、webRequest注冊解析依賴
	beanFactory.registerResolvableDependency(ServletRequest.class, new RequestObjectFactory());
	beanFactory.registerResolvableDependency(ServletResponse.class, new ResponseObjectFactory());
	beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory());
	beanFactory.registerResolvableDependency(WebRequest.class, new WebRequestObjectFactory());
	if (jsfPresent) {
		FacesDependencyRegistrar.registerFacesDependencies(beanFactory);
	}
}

詳看5——invokeBeanFactoryPostProcessors(beanFactory);

調(diào)用BeanFactory后置處理,把所有的Bean注冊到beanFactory。

invokeBeanFactoryPostProcessors是一個方法。用于調(diào)用 BeanFactoryPostProcessor 接口實現(xiàn)類的方法。它的作用是在 Spring 容器初始化過程中,在 BeanDefinition 加載完成、實例化之前,給予開發(fā)者一個機會去修改或者擴展已注冊的 BeanDefinition。

需要了解接口BeanPostProcessor,看這篇文章
【細讀Spring Boot源碼】Spring擴展點接口BeanPostProcessor-儲備

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	// 調(diào)用一個靜態(tài)處理方法
	PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

	// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
	// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
	if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
		beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
		beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
	}
}

源碼中有一段WARNING,譯文如下:
盡管看起來這個方法的主體很容易被重構(gòu),以避免使用多個循環(huán)和多個列表,但使用多個列表和多次傳遞處理器的名稱是有意的。我們必須確保我們遵守 PriorityOrdered 和 Ordered 處理器的契約。具體來說,我們不能導致處理器被實例化(通過getBean()調(diào)用)或以錯誤的順序在 ApplicationContext 中注冊。在提交改變此方法的拉動請求(PR)之前,請查看所有涉及改變PostProcessorRegistrationDelegate的被拒絕的PR列表,以確保你的建議不會導致破壞性的改變:https://github.com/spring-projects/spring-framework/issues?q=PostProcessorRegistrationDelegate+is%3Aclosed+label%3A%22status%3A+declined%22

梳理一下下面大段代碼的邏輯,整體分為2部分。
第一部分:這里把早期添加到context里的BeanFactoryPostProcessor執(zhí)行分類、排序、invoke
這里是處理Bean定義注冊的邏輯

if (beanFactory instanceof BeanDefinitionRegistry) {
	...
} else {
	...
}

第二部分:這里是后半部分,從中取出BeanDefinitionRegistryPostProcessor類的所有實現(xiàn),然后分類、排序、invoke

public static void invokeBeanFactoryPostProcessors(
		ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

	// 翻譯在上面
	// WARNING: Although it may appear that the body of this method can be easily
	// refactored to avoid the use of multiple loops and multiple lists, the use
	// of multiple lists and multiple passes over the names of processors is
	// intentional. We must ensure that we honor the contracts for PriorityOrdered
	// and Ordered processors. Specifically, we must NOT cause processors to be
	// instantiated (via getBean() invocations) or registered in the ApplicationContext
	// in the wrong order.
	//
	// Before submitting a pull request (PR) to change this method, please review the
	// list of all declined PRs involving changes to PostProcessorRegistrationDelegate
	// to ensure that your proposal does not result in a breaking change:
	// https://github.com/spring-projects/spring-framework/issues?q=PostProcessorRegistrationDelegate+is%3Aclosed+label%3A%22status%3A+declined%22

	// Invoke BeanDefinitionRegistryPostProcessors first, if any.
	// 首先調(diào)用BeanDefinitionRegistryPostProcessors,如果存在
	Set<String> processedBeans = new HashSet<>();

	if (beanFactory instanceof BeanDefinitionRegistry) {
		BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
		List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
		List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
		
		// 循環(huán)處理出入的beanFactoryPostProcessors
		for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
			if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
				BeanDefinitionRegistryPostProcessor registryProcessor =
						(BeanDefinitionRegistryPostProcessor) postProcessor;
				// 如果是BeanDefinitionRegistryPostProcessor調(diào)用這個擴展鉤子
				registryProcessor.postProcessBeanDefinitionRegistry(registry);
				// 處理完添加到常規(guī)的PostProcessors
				registryProcessors.add(registryProcessor);
			}
			else {
				// 添加到常規(guī)的PostProcessors
				regularPostProcessors.add(postProcessor);
			}
		}

		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let the bean factory post-processors apply to them!
		// Separate between BeanDefinitionRegistryPostProcessors that implement
		// PriorityOrdered, Ordered, and the rest.
		List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

		// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
		// 得到所有BeanDefinitionRegistryPostProcessor類型的Bean名稱
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
		// 按類型分類,處理PriorityOrdered類型
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				processedBeans.add(ppName);
			}
		}
		// 排序
		sortPostProcessors(currentRegistryProcessors, beanFactory);
		// 添加需要注冊的列表
		registryProcessors.addAll(currentRegistryProcessors);
		// 注冊,調(diào)用Bean定義注冊表后處理器
		invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
		currentRegistryProcessors.clear();

		// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
		postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
		// 按類型分類,處理Ordered類型
		for (String ppName : postProcessorNames) {
			if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
				currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				processedBeans.add(ppName);
			}
		}
		sortPostProcessors(currentRegistryProcessors, beanFactory);
		registryProcessors.addAll(currentRegistryProcessors);
		// 注冊
		invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
		currentRegistryProcessors.clear();

		// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
		// 最后注冊處理其他類型BeanDefinitionRegistryPostProcessor
		boolean reiterate = true;
		while (reiterate) {
			reiterate = false;
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (!processedBeans.contains(ppName)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
					reiterate = true;
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
			currentRegistryProcessors.clear();
		}

		// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
		// 現(xiàn)在,調(diào)用到目前為止處理的所有處理器的postProcessBeanFactory回調(diào)。
		invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
	}

	else {
		// Invoke factory processors registered with the context instance.
		// 直接調(diào)用處理的所有處理器的postProcessBeanFactory回調(diào)。
		invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
	}

	// Do not initialize FactoryBeans here: We need to leave all regular beans
	// uninitialized to let the bean factory post-processors apply to them!、
	// 獲取所有BeanFactoryPostProcessor
	String[] postProcessorNames =
			beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

	// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
	// Ordered, and the rest.
	// 分類
	List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
	List<String> orderedPostProcessorNames = new ArrayList<>();
	List<String> nonOrderedPostProcessorNames = new ArrayList<>();
	for (String ppName : postProcessorNames) {
		if (processedBeans.contains(ppName)) {
			// skip - already processed in first phase above
		}
		else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
		}
		else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}
		else {
			nonOrderedPostProcessorNames.add(ppName);
		}
	}

	// 先處理priorityOrdered的PostProcessor
	// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

	// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
	// 處理調(diào)用Ordered的PostProcessor
	List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
	for (String postProcessorName : orderedPostProcessorNames) {
		orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
	}
	sortPostProcessors(orderedPostProcessors, beanFactory);
	invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

	// Finally, invoke all other BeanFactoryPostProcessors.
	// 最后調(diào)用剩余的BeanFactoryPostProcessors
	List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
	for (String postProcessorName : nonOrderedPostProcessorNames) {
		nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
	}
	invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

	// Clear cached merged bean definitions since the post-processors might have
	// modified the original metadata, e.g. replacing placeholders in values...
	beanFactory.clearMetadataCache();
}

BeanFactoryPostProcessor 是在 Spring 容器實例化 Bean 之前調(diào)用的接口。
它允許您對應用程序上下文的 BeanFactory 進行自定義修改。
BeanFactoryPostProcessor 的實現(xiàn)類可以修改 Bean 的定義,添加額外的屬性或修改屬性值。
它通常用于在應用程序上下文準備就緒之前對 Bean 定義進行修改,例如更改 Bean 的作用域、添加屬性占位符解析器等。
BeanFactoryPostProcessor 在容器啟動時執(zhí)行,只對配置的 BeanFactory 生效。

詳看6——registerBeanPostProcessors(beanFactory);

發(fā)現(xiàn)注冊BeanPostProcessor

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	// 這里使用了一個靜態(tài)方法
	PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

看下registerBeanPostProcessors

源碼中有一段WARNING,譯文如下:
盡管看起來這個方法的主體很容易被重構(gòu),以避免使用多個循環(huán)和多個列表,但使用多個列表和多次傳遞處理器的名稱是有意的。我們必須確保我們遵守 PriorityOrdered 和 Ordered 處理器的契約。具體來說,我們不能導致處理器被實例化(通過getBean()調(diào)用)或以錯誤的順序在 ApplicationContext 中注冊。在提交改變此方法的拉動請求(PR)之前,請查看所有涉及改變PostProcessorRegistrationDelegate的被拒絕的PR列表,以確保你的建議不會導致破壞性的改變:https://github.com/spring-projects/spring-framework/issues?q=PostProcessorRegistrationDelegate+is%3Aclosed+label%3A%22status%3A+declined%22

public static void registerBeanPostProcessors(
		ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
	
	// 這段翻譯看上面
	// WARNING: Although it may appear that the body of this method can be easily
	// refactored to avoid the use of multiple loops and multiple lists, the use
	// of multiple lists and multiple passes over the names of processors is
	// intentional. We must ensure that we honor the contracts for PriorityOrdered
	// and Ordered processors. Specifically, we must NOT cause processors to be
	// instantiated (via getBean() invocations) or registered in the ApplicationContext
	// in the wrong order.
	//
	// Before submitting a pull request (PR) to change this method, please review the
	// list of all declined PRs involving changes to PostProcessorRegistrationDelegate
	// to ensure that your proposal does not result in a breaking change:
	// https://github.com/spring-projects/spring-framework/issues?q=PostProcessorRegistrationDelegate+is%3Aclosed+label%3A%22status%3A+declined%22

	// 取到所有BeanPostProcessor類型的Bean名稱
	String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

	// Register BeanPostProcessorChecker that logs an info message when
	// a bean is created during BeanPostProcessor instantiation, i.e. when
	// a bean is not eligible for getting processed by all BeanPostProcessors.
	// 重新計算BeanPostProcessor的數(shù)量
	int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
	// 添加
	beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

	// Separate between BeanPostProcessors that implement PriorityOrdered,
	// Ordered, and the rest.
	// 根據(jù)不同的排序方式進行分類
	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);
		}
	}

	// First, register the BeanPostProcessors that implement PriorityOrdered.
	// 注冊PriorityOrdered類型的BeanPostProcessors
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

	// Next, register the BeanPostProcessors that implement Ordered.
	// 注冊O(shè)rdered類型的BeanPostProcessors
	List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
	for (String ppName : orderedPostProcessorNames) {
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		orderedPostProcessors.add(pp);
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	sortPostProcessors(orderedPostProcessors, beanFactory);
	registerBeanPostProcessors(beanFactory, orderedPostProcessors);

	// Now, register all regular BeanPostProcessors.
	// 注冊所有常規(guī)的BeanPostProcessors
	List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
	for (String ppName : nonOrderedPostProcessorNames) {
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		nonOrderedPostProcessors.add(pp);
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

	// Finally, re-register all internal BeanPostProcessors.
	// 最后,再注冊所有的內(nèi)部BeanPostProcessors
	sortPostProcessors(internalPostProcessors, beanFactory);
	registerBeanPostProcessors(beanFactory, internalPostProcessors);

	// Re-register post-processor for detecting inner beans as ApplicationListeners,
	// moving it to the end of the processor chain (for picking up proxies etc).
	// 重新注冊后處理器,以檢測內(nèi)部bean作為應用程序偵聽器,將其移動到處理器鏈的末端 (用于拾取代理等)
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

看下實際的注冊邏輯,實際上還是調(diào)用了factory.addBeanPostProcessor()方法跟上面Spring的原理一樣。

private static void registerBeanPostProcessors(
		ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {

	if (beanFactory instanceof AbstractBeanFactory) {
		// Bulk addition is more efficient against our CopyOnWriteArrayList there
		((AbstractBeanFactory) beanFactory).addBeanPostProcessors(postProcessors);
	}
	else {
		for (BeanPostProcessor postProcessor : postProcessors) {
			beanFactory.addBeanPostProcessor(postProcessor);
		}
	}
}

從原來的位置移除,在重新添加
this.beanPostProcessors是BeanPostProcessorCacheAwareList的實例。
BeanPostProcessorCacheAwareList繼承了CopyOnWriteArrayList

public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
	Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
	// Remove from old position, if any
	this.beanPostProcessors.remove(beanPostProcessor);
	// Add to end of list
	this.beanPostProcessors.add(beanPostProcessor);
}

詳看7——initMessageSource();

初始化消息源(MessageSource),以支持國際化和本地化的消息處理

protected void initMessageSource() {
	ConfigurableListableBeanFactory beanFactory = getBeanFactory();
	// beanFactory中包好messageSource的Bean
	if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
		// 取到
		this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
		// 讓消息來源知道父消息來源
		if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
			HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
			if (hms.getParentMessageSource() == null) {
				// Only set parent context as parent MessageSource if no parent MessageSource
				// registered already.
				hms.setParentMessageSource(getInternalParentMessageSource());
			}
		}
		if (logger.isTraceEnabled()) {
			logger.trace("Using MessageSource [" + this.messageSource + "]");
		}
	}
	else {
		// Use empty MessageSource to be able to accept getMessage calls.
		// 使用空MessageSource能夠接受getMessage調(diào)用
		DelegatingMessageSource dms = new DelegatingMessageSource();
		dms.setParentMessageSource(getInternalParentMessageSource());
		this.messageSource = dms;
		beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
		if (logger.isTraceEnabled()) {
			logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
		}
	}
}

詳看8——initApplicationEventMulticaster();

protected void initApplicationEventMulticaster() {
	ConfigurableListableBeanFactory beanFactory = getBeanFactory();
	// beanFactory中包含applicationEventMulticaster
	if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
		// 取出來賦值
		this.applicationEventMulticaster =
				beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
		if (logger.isTraceEnabled()) {
			logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
		}
	}
	else {
		// 沒有初始化一個簡單的事件多播器
		this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
		// 注冊單例到beanFactory里
		beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
		if (logger.isTraceEnabled()) {
			logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
					"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
		}
	}
}

看下簡單事件多播器初始化做了什么

public SimpleApplicationEventMulticaster(BeanFactory beanFactory) {
	// 設(shè)置beanFactory
	setBeanFactory(beanFactory);
}

詳看9——onRefresh()

ServletWebServerApplicationContext中,onRefresh是創(chuàng)建webServer

protected void onRefresh() {
	super.onRefresh();
	try {
		createWebServer();
	}
	catch (Throwable ex) {
		throw new ApplicationContextException("Unable to start web server", ex);
	}
}

創(chuàng)建webServer詳情

private void createWebServer() {
	WebServer webServer = this.webServer;
	ServletContext servletContext = getServletContext();
	// 都沒獲取到
	if (webServer == null && servletContext == null) {
		StartupStep createWebServer = this.getApplicationStartup().start("spring.boot.webserver.create");
		// 通過ServletWebServerFactory獲取Bean
		ServletWebServerFactory factory = getWebServerFactory();
		createWebServer.tag("factory", factory.getClass().toString());
		// 通過工廠獲取webServer
		this.webServer = factory.getWebServer(getSelfInitializer());
		createWebServer.end();
		// 注冊webServerGracefulShutdown
		getBeanFactory().registerSingleton("webServerGracefulShutdown",
				new WebServerGracefulShutdownLifecycle(this.webServer));
		// 注冊webServerStartStop
		getBeanFactory().registerSingleton("webServerStartStop",
				new WebServerStartStopLifecycle(this, this.webServer));
	}
	else if (servletContext != null) {
		try {
			getSelfInitializer().onStartup(servletContext);
		}
		catch (ServletException ex) {
			throw new ApplicationContextException("Cannot initialize servlet context", ex);
		}
	}
	// 初始化屬性資源
	initPropertySources();
}
protected void initPropertySources() {
	ConfigurableEnvironment env = getEnvironment();
	if (env instanceof ConfigurableWebEnvironment) {
		((ConfigurableWebEnvironment) env).initPropertySources(this.servletContext, null);
	}
}

public void initPropertySources(@Nullable ServletContext servletContext, @Nullable ServletConfig servletConfig) {
	WebApplicationContextUtils.initServletPropertySources(getPropertySources(), servletContext, servletConfig);
}

設(shè)置servletContextInitParams、servletConfigInitParams屬性

public static void initServletPropertySources(MutablePropertySources sources,
		@Nullable ServletContext servletContext, @Nullable ServletConfig servletConfig) {

	Assert.notNull(sources, "'propertySources' must not be null");
	// servletContextInitParams
	String name = StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME;
	if (servletContext != null && sources.get(name) instanceof StubPropertySource) {
		sources.replace(name, new ServletContextPropertySource(name, servletContext));
	}
	// servletConfigInitParams
	name = StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME;
	if (servletConfig != null && sources.get(name) instanceof StubPropertySource) {
		sources.replace(name, new ServletConfigPropertySource(name, servletConfig));
	}
}

詳看10——registerListeners();

protected void registerListeners() {
	// Register statically specified listeners first.
	// 首先注冊靜態(tài)指定的偵聽器。
	for (ApplicationListener<?> listener : getApplicationListeners()) {
		getApplicationEventMulticaster().addApplicationListener(listener);
	}

	// Do not initialize FactoryBeans here: We need to leave all regular beans
	// uninitialized to let post-processors apply to them!
	// 找打所有的ApplicationListener接口實現(xiàn)類,都添加給多播器
	String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
	for (String listenerBeanName : listenerBeanNames) {
		getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
	}

	// Publish early application events now that we finally have a multicaster...
	// 得到早期應用事件
	Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
	this.earlyApplicationEvents = null;
	if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
		for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
			// 執(zhí)行早期應用事件
			getApplicationEventMulticaster().multicastEvent(earlyEvent);
		}
	}
}

詳看11——finishBeanFactoryInitialization(beanFactory);

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
	// Initialize conversion service for this context.
	// 為此上下文初始化轉(zhuǎn)換服務。
	if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
			beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
		beanFactory.setConversionService(
				beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
	}

	// Register a default embedded value resolver if no BeanFactoryPostProcessor
	// (such as a PropertySourcesPlaceholderConfigurer bean) registered any before:
	// at this point, primarily for resolution in annotation attribute values.
	// 有嵌入值解析器
	if (!beanFactory.hasEmbeddedValueResolver()) {
		beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
	}

	// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
	// 初始化LoadTimeWeaverAware
	String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
	for (String weaverAwareName : weaverAwareNames) {
		getBean(weaverAwareName);
	}

	// Stop using the temporary ClassLoader for type matching.
	// 停止使用臨時類加載器進行類型匹配
	beanFactory.setTempClassLoader(null);

	// Allow for caching all bean definition metadata, not expecting further changes.
	// 允許緩存所有bean定義元數(shù)據(jù),不期望進一步更改。凍結(jié)bean定義名稱
	beanFactory.freezeConfiguration();

	// Instantiate all remaining (non-lazy-init) singletons.
	// 實例化所有剩余的 (非惰性init) 單例
	beanFactory.preInstantiateSingletons();
}

實例化所有剩余的 (非惰性init) 單例方法詳情:

public void preInstantiateSingletons() throws BeansException {
	if (logger.isTraceEnabled()) {
		logger.trace("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<>(this.beanDefinitionNames);

	// Trigger initialization of all non-lazy singleton beans...
	// 循環(huán)初始化所有非惰性Bean,通過BeanName
	for (String beanName : beanNames) {
		// 獲取合并的本地Bean定義
		RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
		// 不是抽象的、是單例、不是懶加載
		if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
			// 是工廠Bean,前綴有&符號為工廠Bean
			if (isFactoryBean(beanName)) {
				Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
				if (bean instanceof FactoryBean) {
					FactoryBean<?> factory = (FactoryBean<?>) bean;
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
						isEagerInit = AccessController.doPrivileged(
								(PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
								getAccessControlContext());
					}
					else {
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}
					// 根據(jù)上面條件判斷需要初始化就初始化
					if (isEagerInit) {
						getBean(beanName);
					}
				}
			}
			else {
				// 最重要的方法。BeanFactory接口的getBean(String name)。通過這個方法初始化以及實例化Bean
				getBean(beanName);
			}
		}
	}

	// Trigger post-initialization callback for all applicable beans...
	// 觸發(fā)所有適用bean的初始化后回調(diào)
	for (String beanName : beanNames) {
		Object singletonInstance = getSingleton(beanName);
		if (singletonInstance instanceof SmartInitializingSingleton) {
			StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
					.tag("beanName", beanName);
			SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
			if (System.getSecurityManager() != null) {
				AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
					smartSingleton.afterSingletonsInstantiated();
					return null;
				}, getAccessControlContext());
			}
			else {
				smartSingleton.afterSingletonsInstantiated();
			}
			smartInitialize.end();
		}
	}
}

詳看12——finishRefresh();

protected void finishRefresh() {
	// Clear context-level resource caches (such as ASM metadata from scanning).
	// 清除上下文級別的資源緩存 (例如來自掃描的ASM元數(shù)據(jù))
	clearResourceCaches();

	// Initialize lifecycle processor for this context.
	// 為此上下文初始化生命周期處理器
	initLifecycleProcessor();

	// Propagate refresh to lifecycle processor first.
	// 首先將刷新傳播到生命周期處理器。
	getLifecycleProcessor().onRefresh();

	// Publish the final event.
	// 發(fā)布最終事件
	publishEvent(new ContextRefreshedEvent(this));

	// Participate in LiveBeansView MBean, if active.
	// 如果活躍,則參與LiveBeansView MBean。
	if (!NativeDetector.inNativeImage()) {
		LiveBeansView.registerApplicationContext(this);
	}
}

完~

求點贊、關(guān)注、建議文章來源地址http://www.zghlxwxcb.cn/news/detail-428510.html

到了這里,關(guān)于【細讀Spring Boot源碼】重中之重refresh()的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 【Spring Boot】Spring Boot源碼解讀與原理剖析

    【Spring Boot】Spring Boot源碼解讀與原理剖析

    承載著作者的厚望,掘金爆火小冊同名讀物《Spring Boot源碼解讀與原理剖析》正式出書! 本書前身是掘金社區(qū)銷量TOP的小冊——《Spring Boot源碼解讀與原理剖析》,整個社區(qū)中有3600+開發(fā)者都不約而同地選擇了這本小冊,也使它成為掘金社區(qū)首屈一指的王牌Spring教程,非常能打

    2024年02月08日
    瀏覽(41)
  • Spring Boot啟動源碼分析

    Spring Boot啟動源碼分析

    版本:spring-boot-starter-parent版本為2.3.0 Spring Boot項目的啟動入口是一個main方法,因此我們從該方法入手即可 跟蹤run方法 這里分兩步debug: new SpringApplication( primarySources ) 執(zhí)行run()方法 deduceFromClasspath推斷應用程序類型 該方法根據(jù)是否存在指定路徑的類來推斷應用程序類型。有

    2024年02月07日
    瀏覽(20)
  • 11.spring boot 啟動源碼(一)

    spring boot 版本 2.6.13 spring boot 啟動源碼(一) 涉及 SpringApplication 中靜態(tài)與實例方法 run 方法源碼解析、配置文件和 Actuator

    2024年01月19日
    瀏覽(23)
  • 【Spring Boot 源碼學習】自動裝配流程源碼解析(下)

    【Spring Boot 源碼學習】自動裝配流程源碼解析(下)

    《Spring Boot 源碼學習系列》 上篇博文,筆者帶大家了解了自動裝配流程中有關(guān)自動配置加載的流程; 本篇將介紹自動裝配流程剩余的內(nèi)容,包含了自動配置組件的排除和過濾、觸發(fā)自動配置事件。 在開始本篇的內(nèi)容介紹之前,我們先來看看往期的系列文章【有需要的朋友,

    2024年02月11日
    瀏覽(37)
  • 【Spring Boot 源碼學習】自動裝配流程源碼解析(上)

    【Spring Boot 源碼學習】自動裝配流程源碼解析(上)

    《Spring Boot 源碼學習系列》 上篇博文,筆者帶大家從整體上了解了AutoConfigurationImportSelector 自動裝配邏輯的核心功能及流程,由于篇幅有限,更加細化的功能及流程詳解還沒有介紹。本篇開始將從其源碼入手,重點解析細化后的自動裝配流程源碼。 在開始本篇的內(nèi)容介紹之前

    2024年02月14日
    瀏覽(31)
  • 【Spring Boot 源碼學習】初識 SpringApplication

    【Spring Boot 源碼學習】初識 SpringApplication

    《Spring Boot 源碼學習系列》 往期的博文, Huazie 圍繞 Spring Boot 的核心功能,帶大家從總整體上了解 Spring Boot 自動配置的原理以及自動配置核心組件的運作過程。這些內(nèi)容大家需要重點關(guān)注,只有了解這些基礎(chǔ)的組件和功能,我們在后續(xù)集成其他三方類庫的 Starters 時,才能夠

    2024年02月05日
    瀏覽(23)
  • 【Spring Boot 源碼學習】深入 FilteringSpringBootCondition

    【Spring Boot 源碼學習】深入 FilteringSpringBootCondition

    Spring Boot 源碼學習系列 前兩篇博文筆者帶大家從源碼深入了解了 Spring Boot 的自動裝配流程,其中自動配置過濾的實現(xiàn)由于篇幅限制,還未深入分析。 那么從本篇開始,Huazie 就帶大家走近 AutoConfigurationImportFilter ,一起從源碼解析 FilteringSpringBootCondition 、 OnBeanCondition 、 OnCl

    2024年02月09日
    瀏覽(40)
  • Spring Boot源碼解讀與原理分析

    Spring Boot源碼解讀與原理分析

    ??最近機緣巧合之下,讀到了 LinkedBear 編寫的《Spring Boot源碼解讀與原理分析》這本書,本人花了一周的時間認真研讀了一下這本書,真的是受益匪淺,特此推薦給大家,好書不容錯過啊。 LinkedBear 是一名資深的Java開發(fā)工程師,常年致力于底層技術(shù)的研究,同時也通過技術(shù)

    2024年02月08日
    瀏覽(23)
  • 【Spring Boot 源碼學習】走近 AutoConfigurationImportSelector

    【Spring Boot 源碼學習】走近 AutoConfigurationImportSelector

    《Spring Boot 源碼學習系列》 上篇博文我們了解了 @EnableAutoConfiguration 注解,其中真正實現(xiàn)自動配置功能的核心實現(xiàn)者 AutoConfigurationImportSelector 還沒有詳細說明,本篇將從它的源碼入手來重點介紹。 在介紹 AutoConfigurationImportSelector 之前,有必要了解下它所實現(xiàn)的 ImportSelector 接

    2024年02月12日
    瀏覽(18)
  • 【Spring Boot 源碼學習】RedisAutoConfiguration 詳解

    【Spring Boot 源碼學習】RedisAutoConfiguration 詳解

    《Spring Boot 源碼學習系列》 上篇博文, Huazie 帶大家從源碼角度分析了 Spring Boot 內(nèi)置的 http 編碼功能,進一步熟悉了自動配置的裝配流程。本篇趁熱打鐵,繼續(xù)帶大家分析 Spring Boot 內(nèi)置的有關(guān) Redis 的自動配置類【 RedisAutoConfiguration 】。 在開始本篇的內(nèi)容介紹之前,我們先來

    2024年02月07日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包