最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自動(dòng)配置深入探究實(shí)現(xiàn)原理

 更新時(shí)間:2022年08月15日 16:27:15   作者:飄飄~  
在springboot的啟動(dòng)類(lèi)中可以看到@SpringBootApplication注解,它是SpringBoot的核心注解,也是一個(gè)組合注解。其中@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個(gè)注解尤為重要。今天我們就來(lái)淺析這三個(gè)注解的含義

說(shuō)明:在閱讀本篇文章之前建議大家先詳細(xì)學(xué)習(xí)一下spring的相關(guān)知識(shí),有助于更深刻的理解spirngboot的配置原理。

一、什么是springboot自動(dòng)配置

SpringBoot通過(guò)@EnableAutoConfiguration注解開(kāi)啟自動(dòng)配置,對(duì)jar包下的spring.factories文件進(jìn)行掃描,這個(gè)文件中包含了可以進(jìn)行自動(dòng)配置的類(lèi),當(dāng)滿足@Condition注解指定的條件時(shí),便在依賴(lài)的支持下進(jìn)行實(shí)例化,注冊(cè)到Spring容器中。

通俗的來(lái)講,我們之前在寫(xiě)ssm項(xiàng)目時(shí)候,配置了大量坐標(biāo)和配置內(nèi)容,搭環(huán)境的過(guò)程在項(xiàng)目開(kāi)發(fā)中占據(jù)了大量時(shí)間,SpringBoot的最大的特點(diǎn)就是簡(jiǎn)化了各種xml配置內(nèi)容,所以springboot的自動(dòng)配置就是用注解來(lái)對(duì)一些常規(guī)的配置做默認(rèn)配置,簡(jiǎn)化xml配置內(nèi)容,使你的項(xiàng)目能夠快速運(yùn)行。

springboot核心配置原理:

  • 自動(dòng)配置類(lèi)都存放在spring-boot-autoconfigure-版本號(hào).jar下的org.springframework.boot.autoconfigure中
  • 當(dāng)我們?cè)赼pplication.properties中配置debug=true后啟動(dòng)容器。可以看到服務(wù)器初始化的初始化配置
  • DispatcherServletAutoConfigratio注冊(cè)前端控制器
  • EmbeddedServletContainerAutoConfiguration注冊(cè)容器類(lèi)型
  • HttpMessageConvertersAutoConfiguration注冊(cè)json或者xml處理器
  • JacksonAutoConfiguration注冊(cè)json對(duì)象解析器
  • 如果加入其他功能的依賴(lài),springBoot還會(huì)實(shí)現(xiàn)這些功能的自動(dòng)配置

二、Starter組件

Starter組件是可被加載在應(yīng)用中的Maven依賴(lài)項(xiàng)項(xiàng)。只有在Maven配置中添加對(duì)應(yīng)的依賴(lài)配置,即可使用對(duì)應(yīng)的Starter組件。例如,添加spring-boot-starter-web依賴(lài),就可以用于構(gòu)建RESTAPI服務(wù),其包含了SpringMVC和Tomcat內(nèi)嵌容器。

一個(gè)完整的Starter組件包括以下兩點(diǎn):

  • 提供自動(dòng)配置功能的自動(dòng)配置模塊
  • 提供依賴(lài)關(guān)系管理崗功能的組件模塊,即封裝了組件所有功能,開(kāi)箱即用。

spring-boot-starter-web依賴(lài)源碼

package org.springframework.boot.autoconfigure.web.servlet;
@Configuration
@ConditionalOnClass({ServletRequest.class})
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({ServerProperties.class})
@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class})
public class ServletWebServerFactoryAutoConfiguration {
    ......
}
@

三、三大注解

@SpringBootConfiguration:繼承自Configuration,支持JavaConfig的方式進(jìn)行配置。

@EnableAutoConfiguration:本文重點(diǎn)講解,主要用于開(kāi)啟自動(dòng)配置。

@ComponentScan:自動(dòng)掃描組件,默認(rèn)掃描該類(lèi)所在包及其子包下所有帶有指定注解的類(lèi),將它們自動(dòng)裝配到bean容器中,會(huì)被自動(dòng)裝配的注解包括@Controller、@Service、@Component、@Repository等。也可以指定掃描路徑。

四、@EnableAutoConfiguration

這個(gè)注解是幫助我們自動(dòng)加載默認(rèn)配置的,它里面有兩個(gè)關(guān)鍵注解@AutoConfigurationPackage和@Import,我們來(lái)詳細(xì)了解@Import注解。

@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		//檢查自動(dòng)配置功能是否開(kāi)啟,默認(rèn)開(kāi)啟
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		//加載自動(dòng)配置的元信息
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		//獲取候選配置類(lèi)
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
		//去掉重復(fù)的配置類(lèi)
		configurations = removeDuplicates(configurations);
		//獲得注解中被exclude和excludeName排除的類(lèi)的集合
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		//檢查被排除類(lèi)是否可實(shí)例化、是否被自動(dòng)注冊(cè)配置所使用,不符合條件則拋出異常
		checkExcludedClasses(configurations, exclusions);
		//從候選配置類(lèi)中去除掉被排除的類(lèi)
		configurations.removeAll(exclusions);
		//過(guò)濾
		configurations = filter(configurations, autoConfigurationMetadata);
		//將配置類(lèi)和排除類(lèi)通過(guò)事件傳入到監(jiān)聽(tīng)器中
		fireAutoConfigurationImportEvents(configurations, exclusions);
		//最終返回符合條件的自動(dòng)配置類(lèi)的全限定名數(shù)組
		return StringUtils.toStringArray(configurations);

@Import(AutoConfigurationImportSelector.class)注解,這里導(dǎo)入AutoConfigurationImportSelector類(lèi)。這個(gè)類(lèi)中有一個(gè)非常重要的方法——selectImports(),它幾乎涵蓋了組件自動(dòng)裝配的所有處理邏輯,包括獲得候選配置類(lèi)、配置類(lèi)去重、排除不需要的配置類(lèi)、過(guò)濾等,最終返回符合條件的自動(dòng)配置類(lèi)的全限定名數(shù)組。

五、SpringFactoriesLoader

spring-core包里定義了SpringFactoriesLoader類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)了檢索META-INF/spring.factories文件,并獲取指定接口的配置的功能。在這個(gè)類(lèi)中定義了兩個(gè)對(duì)外的方法:

  • loadFactories根據(jù)接口類(lèi)獲取其實(shí)現(xiàn)類(lèi)的實(shí)例,這個(gè)方法返回的是對(duì)象列表。
  • loadFactoryNames根據(jù)接口獲取其接口類(lèi)的名稱(chēng),這個(gè)方法返回的是類(lèi)名的列表。

上面的兩個(gè)方法的關(guān)鍵都是從指定的ClassLoader中獲取spring.factories文件,并解析得到類(lèi)名列表,具體代碼如下:

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    try {
        Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
        List<String> result = new ArrayList<String>();
        while (urls.hasMoreElements()) {
            URL url = urls.nextElement();
            Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
            String factoryClassNames = properties.getProperty(factoryClassName);
            result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
        }
        return result;
    }
    catch (IOException ex) {
        throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
    }
}

由代碼可知,在這個(gè)方法中會(huì)遍歷整個(gè)ClassLoader中所有jar包下的spring.factories文件。也就是說(shuō)我們可以在自己的jar中配置spring.factories文件,不會(huì)影響到其它地方的配置,也不會(huì)被別人的配置覆蓋。

spring.factories的是通過(guò)Properties解析得到的,所以我們?cè)趯?xiě)文件中的內(nèi)容都是安裝下面這種方式配置的:

com.xxx.interface=com.xxx.classname

最后希望大家在學(xué)習(xí)的過(guò)程中,能夠多了解實(shí)現(xiàn)各種功能的基本原理,有助于提高學(xué)習(xí)效率。

到此這篇關(guān)于SpringBoot自動(dòng)配置深入探究實(shí)現(xiàn)原理的文章就介紹到這了,更多相關(guān)SpringBoot自動(dòng)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea2023.3安裝及配置詳細(xì)圖文教程

    idea2023.3安裝及配置詳細(xì)圖文教程

    IDEA全稱(chēng)IntelliJ?IDEA,是Java語(yǔ)言對(duì)的集成開(kāi)發(fā)環(huán)境,IDEA在業(yè)界被認(rèn)為是公認(rèn)最好的Java開(kāi)發(fā)工具,這篇文章主要給大家介紹了關(guān)于idea2023.3安裝及配置的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 自定義注解基本概念和使用方式

    自定義注解基本概念和使用方式

    這篇文章主要介紹了自定義注解基本概念和使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java實(shí)現(xiàn)象棋算法的示例代碼

    Java實(shí)現(xiàn)象棋算法的示例代碼

    象棋算法包括搜索算法、評(píng)估函數(shù)和剪枝算法,本文主要介紹了Java實(shí)現(xiàn)象棋算法的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 如何使用?Spring?Boot?搭建?WebSocket?服務(wù)器實(shí)現(xiàn)多客戶端連接

    如何使用?Spring?Boot?搭建?WebSocket?服務(wù)器實(shí)現(xiàn)多客戶端連接

    本文介紹如何使用SpringBoot快速搭建WebSocket服務(wù)器,實(shí)現(xiàn)多客戶端連接和消息廣播,WebSocket協(xié)議提供全雙工通信,SpringBoot通過(guò)@ServerEndpoint簡(jiǎn)化配置,支持實(shí)時(shí)消息推送,適用于聊天室或通知系統(tǒng)等應(yīng)用場(chǎng)景
    2024-11-11
  • 一文帶你搞懂如何在Spring?Boot中輕松調(diào)用Python腳本

    一文帶你搞懂如何在Spring?Boot中輕松調(diào)用Python腳本

    雖然springBoot非常適合開(kāi)發(fā)高性能的Web應(yīng)用,但它的生態(tài)中并沒(méi)有像Python那樣豐富的科學(xué)計(jì)算庫(kù),所以最理想的方案就是將Spring?Boot和Python結(jié)合,下面我們來(lái)看看具體的實(shí)現(xiàn)方法吧
    2025-04-04
  • Java?設(shè)計(jì)模式中的策略模式詳情

    Java?設(shè)計(jì)模式中的策略模式詳情

    這篇文章主要介紹了Java?設(shè)計(jì)模式中的策略模式詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • spring 整合 mybatis 中數(shù)據(jù)源的幾種配置方式(總結(jié)篇)

    spring 整合 mybatis 中數(shù)據(jù)源的幾種配置方式(總結(jié)篇)

    因?yàn)閟pring 整合mybatis的過(guò)程中, 有好幾種整合方式,尤其是數(shù)據(jù)源那塊,經(jīng)常看到不一樣的配置方式,總感覺(jué)有點(diǎn)亂,所以今天有空總結(jié)下,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • Mybatis中的resultType和resultMap查詢(xún)操作實(shí)例詳解

    Mybatis中的resultType和resultMap查詢(xún)操作實(shí)例詳解

    resultType是直接表示返回類(lèi)型的,而resultMap則是對(duì)外部ResultMap的引用,resultMap解決復(fù)雜查詢(xún)是的映射問(wèn)題。這篇文章主要介紹了Mybatis中的resultType和resultMap查詢(xún)操作實(shí)例詳解,需要的朋友可以參考下
    2016-09-09
  • Nacos設(shè)置為windows自啟動(dòng)服務(wù)的步驟詳解

    Nacos設(shè)置為windows自啟動(dòng)服務(wù)的步驟詳解

    這篇文章給大家介紹了Nacos設(shè)置為windows自啟動(dòng)服務(wù)的操作步驟,文中通過(guò)代碼示例和圖文結(jié)合講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • Java實(shí)現(xiàn)簡(jiǎn)單圖書(shū)借閱系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)單圖書(shū)借閱系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單圖書(shū)借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

巴林左旗| 梅河口市| 大石桥市| 宜宾市| 景德镇市| 临颍县| 宁化县| 西乌珠穆沁旗| 太湖县| 宾川县| 沙河市| 都昌县| 景德镇市| 军事| 海阳市| 黄石市| 钟祥市| 玛沁县| 肥西县| 苏尼特左旗| 扎兰屯市| 内丘县| 新昌县| 巩留县| 石楼县| 个旧市| 郁南县| 顺平县| 乐山市| 茶陵县| 临洮县| 徐州市| 武山县| 正宁县| 抚松县| 崇信县| 上饶市| 咸阳市| 汾阳市| 内黄县| 滨州市|