欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何通過一張圖搞懂springBoot自動(dòng)注入原理

 更新時(shí)間:2022年02月21日 10:13:51   作者:野生java研究僧  
這篇文章主要給大家介紹了關(guān)于如何通過一張圖搞懂springBoot自動(dòng)注入原理的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

@SpringBootApplication注解解讀

為什么我們的啟動(dòng)類上標(biāo)注一個(gè)@SpringBootApplication注解,再加一個(gè)run()方法就可運(yùn)行起來,可以看出我們的@SpringBootApplication注解是多么的強(qiáng)大。

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

@SpringBootApplication其實(shí)是由三個(gè)字注解來合成的。我們可以完全用這個(gè)三個(gè)注解來替換掉@SpringBootApplication。

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @ComponentScan.Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

我們來說下這三個(gè)注解的一個(gè)作用,分別做了什么事情,為什么區(qū)區(qū)幾個(gè)注解就可以讓我們的程序跑起來。

1.@SpringBootConfiguration

其實(shí)點(diǎn)擊進(jìn)去就是一個(gè) @Configuration,沒什么特別的,學(xué)習(xí)過spring的朋友都知道,這是用于標(biāo)注一個(gè)配置類的。

2.@EnableAutoConfiguration

重點(diǎn)就是在于@EnableAutoConfiguration 這個(gè)注解,我們先看下他的一個(gè)構(gòu)成。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

@Inherited

@Inherited : 如果標(biāo)注此注解標(biāo)識(shí)子類也可以進(jìn)行繼承,這個(gè)不太重要

我們先來看.@EnableAutoConfiguration 注解中的@AutoConfigurationPackage注解里面的內(nèi)容有什么 ? 可以看到導(dǎo)入了一個(gè)AutoConfigurationPackages.Registrar類型的組件

@AutoConfigurationPackage

@AutoConfigurationPackage:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {

我們來看下導(dǎo)入的這個(gè)AutoConfigurationPackages.Registrar組件做了什么事情?

registerBeanDefinitions? registerBeanDefinitions是不是就是往我們的容器中添加組件???那我們來看看他具體導(dǎo)入了那些組件。你可以將斷點(diǎn)打在這兩個(gè)方法上

	static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {

		@Override
		public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
			register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
		}

		@Override
		public Set<Object> determineImports(AnnotationMetadata metadata) {
			return Collections.singleton(new PackageImports(metadata));
		}

	}

只要把BeanDefinition注冊(cè)進(jìn)去,往后我們只要調(diào)用getBean()就會(huì)得到該對(duì)象,當(dāng)然不一定得我們自己調(diào)用,spring在底層最后刷新容器的時(shí)候,就會(huì)初始化所有的單實(shí)例bean,這也就是為什么我們直接使用相關(guān)注解就可以獲取到該對(duì)象的原有。

getBean()有兩層意思:

1.容器中有直接從緩存中獲取

2.容器中沒有直接創(chuàng)建一個(gè),也就是走bean的生命周期創(chuàng)建

AutoConfigurationImportSelector.class

@Import(AutoConfigurationImportSelector.class) 核心組件,我們來看看他做了什么事情。

AutoConfigurationImportSelector他呢繼承了DeferredImportSelector,DeferredImportSelector他呢有個(gè)內(nèi)部接口Group,而Group中又有個(gè)方法process()
所以我們來到AutoConfigurationImportSelector中的process()方法打上斷點(diǎn)進(jìn)行觀察

	@Override
		public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {
			Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector,
					() -> String.format("Only %s implementations are supported, got %s",
							AutoConfigurationImportSelector.class.getSimpleName(),
							deferredImportSelector.getClass().getName()));
			AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
					.getAutoConfigurationEntry(annotationMetadata);
			this.autoConfigurationEntries.add(autoConfigurationEntry);
			for (String importClassName : autoConfigurationEntry.getConfigurations()) {
				this.entries.putIfAbsent(importClassName, annotationMetadata);
			}
		}

這個(gè)方法一上來就要獲取一些自動(dòng)注入的條目autoConfigurationEntry,那我們看下他是怎么獲取的,獲取的究竟是什么東西?
通過堆棧信息我們可以看到是通過invokeBeanDefinitionRegistryPostProcessors()這個(gè)方法調(diào)用過來的,說明在工廠初始化完畢,你可以往里面仍一些bean的定義信息了。

進(jìn)去就是這個(gè)方法

	protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
		configurations = removeDuplicates(configurations);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = getConfigurationClassFilter().filter(configurations);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}

我們?cè)龠M(jìn)入這個(gè)方法

在進(jìn)入loadFactoryNames()方法中

那我們?nèi)タ纯催@個(gè)文件里面有什么

?

結(jié)合上面的代碼他是不是要加載org.springframework.boot.autoconfigure.EnableAutoConfiguration里面的內(nèi)容,這些就是一些配置類的信息

其實(shí)這個(gè)文件 spring.factories 里面的每一個(gè)類的權(quán)限的名稱就是一個(gè)配置類,只不過springBoot把這些配置類都寫好了,在我們某些場(chǎng)景需要的時(shí)候直接給你注入就行,這就說明了我們不用寫那么多配置文件的原因。

我隨便點(diǎn)擊一個(gè)類進(jìn)去看看

加載完成后: 怎么多?是不是全部第用得上???

在這里插入圖**片描述

你看下面的代碼,是不是要排除,移除掉,過濾掉一些啊,排除就是我們自己在注解中寫的排除屬性進(jìn)行排除,讓后就是經(jīng)過一系列的篩選過濾。

最后將這些信息put到entries中

3.@ComponentScan

@ComponentScan這個(gè)注解的功能就是掃描當(dāng)前類上標(biāo)注此注解所在包路徑的所有類,這也就是為什么我們需要把主啟動(dòng)類放在最外面的原有,如果你想把配置類放在別的地方,那你就得自己手動(dòng)指定包掃描路徑.

最后奉上超清晰的圖

總結(jié) 

到此這篇關(guān)于如何通過一張圖搞懂springBoot自動(dòng)注入原理的文章就介紹到這了,更多相關(guān)springBoot自動(dòng)注入原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis的update更新批量與普通解決方式對(duì)比

    Mybatis的update更新批量與普通解決方式對(duì)比

    這篇文章主要為大家介紹了Mybatis的update更新批量與普通解決方式對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 詳談java線程與線程、進(jìn)程與進(jìn)程間通信

    詳談java線程與線程、進(jìn)程與進(jìn)程間通信

    下面小編就為大家?guī)硪黄斦刯ava線程與線程、進(jìn)程與進(jìn)程間通信。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • mybatis的association傳遞參數(shù)問題示例

    mybatis的association傳遞參數(shù)問題示例

    這篇文章主要介紹了mybatis的association傳遞參數(shù)問題,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟

    SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟

    這篇文章主要介紹了SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Java中I/O輸入輸出的深入講解

    Java中I/O輸入輸出的深入講解

    Java的I/O技術(shù)可以將數(shù)據(jù)保存到文本文件、二進(jìn)制文件甚至是ZIP壓縮文件中,以達(dá)到永久性保存數(shù)據(jù)的要求,下面這篇文章主要給大家介紹了關(guān)于Java中I/O輸入輸出的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • java從命令行獲取數(shù)據(jù)的三種方式代碼實(shí)例

    java從命令行獲取數(shù)據(jù)的三種方式代碼實(shí)例

    這篇文章主要介紹了java從命令行獲取數(shù)據(jù)的三種方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • springMVC中HttpMessageConverter的具體使用

    springMVC中HttpMessageConverter的具體使用

    HttpMessageConverter,報(bào)文信息轉(zhuǎn)換器,將請(qǐng)求報(bào)文轉(zhuǎn)換為Java對(duì)象,本文主要介紹了springMVC中HttpMessageConverter的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Resty極簡(jiǎn)restful框架快速接入Spring

    Resty極簡(jiǎn)restful框架快速接入Spring

    這篇文章主要為大家介紹了Resty極簡(jiǎn)的restful框架快速接入Spring詳細(xì)說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java實(shí)現(xiàn)簡(jiǎn)單臺(tái)球游戲

    Java實(shí)現(xiàn)簡(jiǎn)單臺(tái)球游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單臺(tái)球游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • gradle安裝配置以及使用最新方法

    gradle安裝配置以及使用最新方法

    這篇文章主要給大家介紹了關(guān)于gradle安裝配置以及使用的相關(guān)資料,Gradle是一個(gè)基于ApacheAnt和ApacheMaven概念的項(xiàng)目自動(dòng)化構(gòu)建開源工具,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11

最新評(píng)論