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

深入淺析SpringBoot自動(dòng)配置原理

 更新時(shí)間:2021年10月13日 16:00:39   作者:胡榕昆  
本文給大家介紹SpringBoot自動(dòng)配置原理解析,springboot使用的是2.3.1版本源碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

SpringBoot2.3.1版本源碼

一、SpringBoot啟動(dòng)的時(shí)候加載主配置類,通過@EnableAutoConfiguration注解開啟了自動(dòng)配置功能 。

二、@EnableAutoConfiguration作用:

1、 點(diǎn)擊該注解進(jìn)入可以發(fā)現(xiàn),它利用AutoConfigurationImportSelector.class 選擇器給SpringBoot導(dǎo)入一些組件。導(dǎo)入哪些組件呢?可以點(diǎn)擊選擇器進(jìn)入查看selectImports()方法的內(nèi)容,該方法最終會(huì)返回一個(gè)configurations

2、selectImports方法調(diào)用了getAutoConfigurationEntry()方法獲取自動(dòng)配置實(shí)體,在getAutoConfigurationEntry()方法中有一條代碼

List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

用于獲取候選的配置

其中getCandidateConfigurations()方法有一條代碼

List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());

從類路徑下得到一個(gè)資源,loadFactoryNames()方法中→loadSpringFactories()方法→classLoader.getResources("META-INF/spring.factories"),掃描所有jar包類路徑下的META-INF/spring.factories的文件

loadSpringFactories()方法通過如下代碼:

Enumeration<URL>urls=classLoader!=null?classLoader.getResources("META-INF/spring.factories")

得到META-INF/spring.factories文件的URL,然后把每一個(gè)URL遍歷,最終通過Propertiesproperties=PropertiesLoaderUtils.loadProperties(resource);把這些文件封裝成一個(gè)properties對(duì)象,然后從properties對(duì)象中獲取一些值,把每一個(gè)url獲取到的值添加到最終要返回的結(jié)果中。而這些返回結(jié)果就是我們要交給容器中的所有組件。其中factoryTypeName指的就是傳過來的Class的類名,而傳過來的class是從AutoConfigurationImportSelector類的getCandidateConfigurations()方法的this.getSpringFactoriesLoaderFactoryClass()中得到的,其返回值是EnableAutoConfiguration.class意思就是從properties中獲取到EnableAutoConfiguration.class類(類名)對(duì)應(yīng)的值,然后把他們添加在容器中。

在spring-boot-autoconfigure-2.3.1.RELEASE.jar!\META-INF\spring.factories文件中,我們可以找到EnableAutoConfiguration的值

所以相當(dāng)于把EnableAutoConfiguration值里面的這些組件加到了容器中。

簡而言之就是:將類路徑下\META-INF\spring.factories里面配置的所有EnableAutoConfiguration的值加入到了容器中。所以最終容器中會(huì)添加很多的類,這些就是自動(dòng)配置之源,自動(dòng)配置的開始 。 每一個(gè)xxxAutoConfiguration類(自動(dòng)配置類)都是容器中的一個(gè)組件,都加入到容器中,用他們來做自動(dòng)配置。

三、每一個(gè)自動(dòng)配置類進(jìn)行自動(dòng)配置功能

HttpEncodingAutoConfigurationHttp編碼自動(dòng)配置)自動(dòng)配置類為例解釋自動(dòng)配置原理

@Configuration(  //這是一個(gè)配置類,就類似配置文件一樣,也可以給容器中添加組件
    proxyBeanMethods = false
)
@EnableConfigurationProperties({ServerProperties.class})
//啟用指定類(ServerProperties.class)的EnableConfigurationProperties功能;
將配置文件中對(duì)應(yīng)的值和ServerProperties類綁定起來,并把ServerProperties加入到IOC容器中。
@ConditionalOnWebApplication( 
//底層使用的是Spring底層的Conditional注解,根據(jù)不同的條件,如果滿足指定的條件,
整個(gè)配置類里面的配置才會(huì)生效。ConditionalOnWebApplication:判斷當(dāng)前應(yīng)用是否是web應(yīng)用,如果是,當(dāng)前配置類生效。
    type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
//判斷當(dāng)前項(xiàng)目有沒有CharacterEncodingFilter這個(gè)類,(SpringMVC中進(jìn)行亂碼解決的過濾器),如果有,當(dāng)前配置類生效。
@ConditionalOnProperty(
//判斷配置文件中是否存在某個(gè)配置,server.servlet.encoding.enabled,
matchIfMissing = true表示,如果不存在判斷也是成立的。(即使配置文件中不配置server.servlet.encoding.enabled,也是默認(rèn)生效的)
    prefix = "server.servlet.encoding",
    value = {"enabled"},
    matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
	
	private final Encoding properties;//properties屬性已經(jīng)和SpringBoot的配置文件映射了。
	public HttpEncodingAutoConfiguration(ServerProperties properties) {
	//只有一個(gè)有參構(gòu)造器的情況下,參數(shù)的值就會(huì)從容器中拿
	        this.properties = properties.getServlet().getEncoding();
	    }
	
    @Bean//給容器中添加一個(gè)組件,這個(gè)組件的某些值需要從properties中獲取。
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));
              //需要使用什么編碼就從Encoding類的properties屬性中獲取
        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));
        return filter;
    }

簡而言之:xxxAutoConfiguration自動(dòng)配置類就是根據(jù)當(dāng)前不同條件判斷,決定這個(gè)配置類是否生效。

那如果這些判斷都成功了,配置類生效了,接下來怎么辦呢?

一旦這個(gè)配置類生效, 接下來這個(gè)配置類會(huì)通過@Bean注解給容器中添加各種組件,這些組件的屬性是從對(duì)應(yīng)的xxxProperties類中獲取的,而這個(gè)類里面的每一個(gè)屬性又是和配置文件綁定的

ServerProperties.class類

  	@ConfigurationProperties(//從配置文件中獲取指定的值,和ServerProperties類的屬性進(jìn)行綁定
	    prefix = "server",
	    ignoreUnknownFields = true
 	)
     	public class ServerProperties {

所以說,我們?cè)谂渲梦募袘?yīng)該配置什么,就按照她的旨意,根據(jù) prefix = "server"我們可以知道,在配置文件中可以配server這個(gè)屬性。而server屬性里面能配置什么值,就看ServerProperties.class類中有哪些屬性。

ServerProperties中有的這些屬性,都可以在配置文件中配置。

例如:server.port server.address

四、由此我們可以知道,所有能在配置文件中配置的屬性都是在xxxProperties類中封裝著,

配置文件能配置就可以參照某一個(gè)功能對(duì)應(yīng)的這個(gè)xxxProperties類。

精髓:

1)、SpringBoot啟動(dòng)會(huì)加載大量的自動(dòng)配置類xxxAutoConfiguration

2)、我們看我們需要的功能有沒有SpringBoot寫好的自動(dòng)配置類

3)、我們?cè)賮砜催@些自動(dòng)配置類到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了)如果沒有,我們就需要自己寫配置類。

4)、給容器中自動(dòng)配置類添加組件的時(shí)候,會(huì)從xxxPropertiess類中獲取某些屬性,我們就可以在配置文件中指定這些屬性的值

自動(dòng)配置中最重要的兩種類:

xxxAutoConfiguration:自動(dòng)配置類給容器中添加組件

xxxProperties:封裝配置文件中相關(guān)的屬性

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

相關(guān)文章

  • Java實(shí)現(xiàn)簡單文字驗(yàn)證碼以及人機(jī)驗(yàn)證

    Java實(shí)現(xiàn)簡單文字驗(yàn)證碼以及人機(jī)驗(yàn)證

    人機(jī)驗(yàn)證技術(shù)的發(fā)展也在不斷進(jìn)化,從最初的簡單驗(yàn)證碼到現(xiàn)在的人工智能驅(qū)動(dòng)的高級(jí)驗(yàn)證系統(tǒng),下面這篇文章主要介紹了Java實(shí)現(xiàn)簡單文字驗(yàn)證碼以及人機(jī)驗(yàn)證的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • Java 初識(shí)CRM之項(xiàng)目思路解析

    Java 初識(shí)CRM之項(xiàng)目思路解析

    本篇文章意在幫助大家了解CRM的一些基本概念,介紹相關(guān)業(yè)務(wù),后文也將會(huì)將基于筆者所在公司的業(yè)務(wù)詳細(xì)闡述CRM各模塊,感興趣的朋友快來看看吧
    2021-11-11
  • 教你如何把Eclipse創(chuàng)建的Web項(xiàng)目(非Maven)導(dǎo)入Idea

    教你如何把Eclipse創(chuàng)建的Web項(xiàng)目(非Maven)導(dǎo)入Idea

    這篇文章主要介紹了教你如何把Eclipse創(chuàng)建的Web項(xiàng)目(非Maven)導(dǎo)入Idea,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Mybatis框架中Interceptor接口的使用說明

    Mybatis框架中Interceptor接口的使用說明

    這篇文章主要介紹了Mybatis框架中Interceptor接口的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Nett分布式分隔符解碼器邏輯源碼剖析

    Nett分布式分隔符解碼器邏輯源碼剖析

    這篇文章主要為大家介紹了Nett分布式分隔符解碼器邏輯源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java設(shè)計(jì)模式之迭代器模式

    Java設(shè)計(jì)模式之迭代器模式

    這篇文章介紹了Java設(shè)計(jì)模式之迭代器模式,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • maven為MANIFEST.MF文件添加內(nèi)容的方法

    maven為MANIFEST.MF文件添加內(nèi)容的方法

    這篇文章主要介紹了maven為MANIFEST.MF文件添加內(nèi)容的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能

    JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot+Spring?Data?JPA整合H2數(shù)據(jù)庫的示例代碼

    SpringBoot+Spring?Data?JPA整合H2數(shù)據(jù)庫的示例代碼

    H2數(shù)據(jù)庫是一個(gè)開源的關(guān)系型數(shù)據(jù)庫,本文重點(diǎn)給大家介紹SpringBoot+Spring?Data?JPA整合H2數(shù)據(jù)庫的示例代碼,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • java中Unsafe的使用講解

    java中Unsafe的使用講解

    這篇文章主要介紹了java中Unsafe的使用講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論

简阳市| 梓潼县| 嵊泗县| 育儿| 平果县| 越西县| 遵化市| 上思县| 湖南省| 岑溪市| 阆中市| 河间市| 江孜县| 宜黄县| 平罗县| 上林县| 石狮市| 偏关县| 沙河市| 萨迦县| 合山市| 铜陵市| 三穗县| 唐海县| 台湾省| 独山县| 石台县| 绥棱县| 余江县| 德江县| 山阴县| 湘潭市| 老河口市| 房产| 南丹县| 和田市| 桦南县| 顺平县| 司法| 青冈县| 原平市|