chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度盤點(diǎn)一遍自動(dòng)裝配原理(下)

jf_78858299 ? 來源:Java知音 ? 作者: Object ? 2023-04-07 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

主程序(重要)

//@SpringBootApplication 標(biāo)注,是一個(gè)SpringBoot應(yīng)用
@SpringBootApplication
public class SpringbootdemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootdemoApplication.class, args);
    }
}

再寫SpringBoot項(xiàng)目的時(shí)候,總要寫這么一個(gè)主程序,這個(gè)主程序最大的特點(diǎn)就是其類上放了一個(gè)@SpringBootApplication注解,這也正是SpringBoot項(xiàng)目啟動(dòng)的核心,也是我們要研究的重點(diǎn)。

注意:之后的分析可能會(huì)深入源碼,源碼是一層一層嵌套的,所以光靠文字說明會(huì)比較難以理解,最好是自己在IDE環(huán)境下跟著一步一步跟著點(diǎn)下去。當(dāng)然也可以繞過這一部分直接看結(jié)論。

點(diǎn)開@SpringBootApplication,可以發(fā)現(xiàn)它是一個(gè)組合注解,主要是由這么幾個(gè)注解構(gòu)成的。

@SpringBootConfiguration//核心
@EnableAutoConfiguration//核心
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

我們首先要研究的就是核心的兩個(gè)注解 @SpringBootConfiguration@EnableAutoConfiguration ,逐個(gè)進(jìn)行分析。

@SpringBootConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

可以看到SpringBootConfiguration其實(shí)就攜帶了一個(gè)@Configuration注解,這個(gè)注解我們?cè)偈煜げ贿^了,他就代表自己是一個(gè)Spring的配置類。所以我們可以認(rèn)為:@SpringBootConfiguration = @Configuration

@EnableAutoConfiguration

顧名思義,這個(gè)注解一定和自動(dòng)配置相關(guān),點(diǎn)進(jìn)去看源代碼之后可以發(fā)現(xiàn),其內(nèi)部就包含了這么兩個(gè)注解。

@AutoConfigurationPackage //自動(dòng)配置包
@Import(AutoConfigurationImportSelector.class)//自動(dòng)配置導(dǎo)入選擇

來看看@Import(AutoConfigurationImportSelector.class)中的內(nèi)容:

它幫我們導(dǎo)入了AutoConfigurationImportSelector,這個(gè)類中存在一個(gè)方法可以幫我們獲取所有的配置,代碼如下。

/*
  所有的配置都存放在configurations中,
  而這些配置都從getCandidateConfiguration中獲取,
  這個(gè)方法是用來獲取候選的配置。
*/
List

getCandidateConfigurations():

這個(gè)方法可以用來獲取所有候選的配置,那么這些候選的配置又是從哪來的呢?

/*獲取候選的配置*/
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                + "are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

實(shí)際上它返回了一個(gè)List,這個(gè)List是由 loadFactoryNames() 方法返回的,其中傳入了一個(gè)getSpringFactoriesLoaderFactoryClass(),我們可以看看這個(gè)方法的內(nèi)容。

protected Class? getSpringFactoriesLoaderFactoryClass() {
    return EnableAutoConfiguration.class;
}

我們看到了一個(gè)眼熟的詞 —— EnableAutoConfiguration ,也就是說,它實(shí)際上返回的就是標(biāo)注了這個(gè)類的所有包。標(biāo)注了這個(gè)類的包不就是@SpringBootApplication嗎?

所以我們可以得出結(jié)論:它兜兜轉(zhuǎn)轉(zhuǎn)繞了這么多地方,就是為了將啟動(dòng)類所需的所有資源導(dǎo)入。

我們接著往下看,它其中還有這么一條語句,是一條斷言:

Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                + "are using a custom packaging, make sure that file is correct.");

這個(gè)斷言的意思是,configurations必須非空,否則就打印一段話,No auto configuration classes found in META-INF/spring.factories,我們把這個(gè)邏輯反過來想想。如果這個(gè)集合不為空,是不是就代表找到了這個(gè)spring.factories并且會(huì)去加載這個(gè)文件中的內(nèi)容呢?

帶著這個(gè)疑問,我們首先找到spring.factories這個(gè)文件:

圖片

可以看到里面包含了很多自動(dòng)配置屬性:

圖片

我們可以隨便找一個(gè)自動(dòng)配置點(diǎn)進(jìn)去,比如WebMvcAutoConfiguration

圖片

這里放了所有關(guān)于WebMvc的配置,如視圖解析器、國際化等等。

分析到這里,我們就可以得出一個(gè)完整的結(jié)論了:

當(dāng)我們的SpringBoot項(xiàng)目啟動(dòng)的時(shí)候,會(huì)先導(dǎo)入AutoConfigurationImportSelector,這個(gè)類會(huì)幫我們選擇所有候選的配置,我們需要導(dǎo)入的配置都是SpringBoot幫我們寫好的一個(gè)一個(gè)的配置類,那么這些配置類的位置,存在與META-INF/spring.factories文件中,通過這個(gè)文件,Spring可以找到這些配置類的位置,于是去加載其中的配置。

圖片

看到這里,可能有些同學(xué)會(huì)存在疑問,spring.factories中存在那么多的配置,每次啟動(dòng)時(shí)都是把它們?nèi)考虞d嗎?這顯然是不現(xiàn)實(shí)的。

這其實(shí)也是我在看源碼的時(shí)候存在疑問的地方,因?yàn)槠渲杏幸粋€(gè)注解并不常用,我們點(diǎn)開一個(gè)配置類就可以看到。

圖片

@ConditionalOnXXX:如果其中的條件都滿足,該類才會(huì)生效。

所以在加載自動(dòng)配置類的時(shí)候,并不是將spring.factories的配置全量加載進(jìn)來,而是通過這個(gè)注解的判斷,如果注解中的類都存在,才會(huì)進(jìn)行加載。

所以就實(shí)現(xiàn)了:我們?cè)趐om.xml文件中加入stater啟動(dòng)器,SpringBoot自動(dòng)進(jìn)行配置。完成開箱即用。

結(jié)論

SpringBoot所有自動(dòng)配置類都是在啟動(dòng)的時(shí)候進(jìn)行掃描并加載,通過spring.factories可以找到自動(dòng)配置類的路徑,但是不是所有存在于spring,factories中的配置都進(jìn)行加載,而是通過@ConditionalOnClass注解進(jìn)行判斷條件是否成立(只要導(dǎo)入相應(yīng)的stater,條件就能成立),如果條件成立則加載配置類,否則不加載該配置類。

在這里貼一個(gè)我認(rèn)為的比較容易理解的過程:

  • SpringBoot在啟動(dòng)的時(shí)候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值
  • 將這些值作為自動(dòng)配置類導(dǎo)入容器 , 自動(dòng)配置類就生效 , 幫我們進(jìn)行自動(dòng)配置工作;
  • 以前我們需要自己配置的東西 , 自動(dòng)配置類都幫我們解決了
  • 整個(gè)J2EE的整體解決方案和自動(dòng)配置都在springboot-autoconfigure的jar包中;
  • 它將所有需要導(dǎo)入的組件以全類名的方式返回 , 這些組件就會(huì)被添加到容器中 ;
  • 它會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類 (xxxAutoConfiguration), 就是給容器中導(dǎo)入這個(gè)場景需要的所有組件 , 并配置好這些組件 ;
  • 有了自動(dòng)配置類 , 免去了我們手動(dòng)編寫配置注入功能組件等的工作;

摘自https://blog.kuangstudy.com/index.php/archives/630/


圖片

約定大于配置

開箱即用的原理說完了,約定大于配置就比較好理解了。其實(shí)約定大于配置就是開箱即用中那些自動(dòng)配置的細(xì)節(jié)。說的具體點(diǎn)就是: 我們的配置文件(.yml)應(yīng)該放在哪個(gè)目錄下,配置文件的命名規(guī)范,項(xiàng)目啟動(dòng)時(shí)掃描的Bean,組件的默認(rèn)配置是什么樣的(比如SpringMVC的視圖解析器)等等等等這一系列的東西,都可以被稱為約定 ,下面就來一點(diǎn)一點(diǎn)地說一下SpringBoot中的“約定”。

maven目錄結(jié)構(gòu)的約定

我們可以去Spring的官網(wǎng)查看一下官方文檔,看看文檔中描述的目錄結(jié)構(gòu)是怎樣的。

Config locations are searched in reverse order. By default, the configured locations are classpath:/,classpath:/config/,file:./,file:./config/. The resulting search order is the following:

  • file:./config/
  • file:./
  • classpath:/config/
  • classpath:/

也就是說,spring的配置文件目錄可以放在

  • /config
  • /(根目錄)
  • resource/config/
  • resource/

這四個(gè)路徑從上到下存在優(yōu)先級(jí)關(guān)系。

SpringBoot默認(rèn)配置文件的約定

SpringBoot默認(rèn)可以加載以下三種配置文件:

  • application.yml
  • application.yaml
  • application.properties

建議使用前兩種作為項(xiàng)目的配置文件。

項(xiàng)目啟動(dòng)時(shí)掃描包范圍的約定

SpringBoot的注解掃描的默認(rèn)規(guī)則是SpringBoot的入口類所在包及其子包。

若入口類所在的包是cn.objectspace.demo那么自動(dòng)掃描包的范圍是cn.objectspace.demo包及其下面的子包,如果service包和dao包不在此范圍,則不會(huì)自動(dòng)掃描。


SpringBoot自動(dòng)配置類如何讀取yml配置

從更細(xì)節(jié)的角度去理解自動(dòng)配置

上文中我們闡述了一些SpringBoot自動(dòng)配置的原理,我們是從全局的角度去看自動(dòng)配置的整個(gè)過程。比如從哪個(gè)地方開始進(jìn)行裝配流程、如何找到裝配的包等。

那么現(xiàn)在將自己的視角貼近SpringBoot,來聊聊application.yml中我們配置的東西,是如何配置到一個(gè)個(gè)的配置類中的。

yml配置文件中可以配置那些東西

首先要知道這個(gè)問題的答案,我們應(yīng)該習(xí)慣springboot的配置方式。在上文中我們闡述了SpringBoot總是將所有的配置都用JavaConfig的形式去呈現(xiàn)出來,這樣能夠使代碼更加優(yōu)雅。

那么yml中配置的東西,必然是要和這種配置模式去進(jìn)行聯(lián)系的,我們?cè)赼pplication.yml中配置的東西,通常是一些存在與自動(dòng)配置類中的屬性,那么這些自動(dòng)配置類,在啟動(dòng)的時(shí)候是怎么找到的呢?

如果你還記得上文的描述,那么你可以很明確地知道:spring.factories!沒錯(cuò),就是它,所以這個(gè)問題我們似乎得到了答案——只要存在與spring.factories中的,我們都可以在application.yml中進(jìn)行配置。

當(dāng)然,這并不意味著不存在其中的我們就不能配置,這些配置類我們是可以進(jìn)行自定義的,只要我們寫了配置類,我們就可以在yml中配置我們需要的屬性值,然后在配置類中直接讀取這個(gè)配置文件,將其映射到配置類的屬性上。那么就牽扯出我們的問題了:配置類是如何去讀取yml配置文件中的信息的呢?

@ConfigurationProperties

要明白這個(gè)問題。我們就首先要去了解這個(gè)注解有什么作用。

我們可以自己嘗試在application.yml中去定義一些屬性,如下:

object: 
  name: Object
  blogurl: blog.objectspace.cn

我們現(xiàn)在自己定義一個(gè)類去讀取這個(gè)文件:

@Component
@ConfigurationProperties(prefix = "object")
public class TestConfig {
    private String name;
    private String blogUrl;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getBlogUrl() {
        return blogUrl;
    }
    public void setBlogUrl(String blogUrl) {
        this.blogUrl = blogUrl;
    }
}

然后我們?cè)跍y試類中輸出一下這個(gè)對(duì)象:

@SpringBootTest
class SpringbootdemoApplicationTests {
    @Autowired
    TestConfig testConfig;
    @Test
    void contextLoads() {
        System.out.println(testConfig.getName());
        System.out.println(testConfig.getBlogUrl());
    }

}

測試結(jié)果:

圖片

我們可以看到,在控制臺(tái)中輸出了我們?cè)趛ml中配置的屬性值,但是這些值我們沒有在任何地方顯式地對(duì)這個(gè)對(duì)象進(jìn)行注入。

所以@ConfigurationProperties這個(gè)注解,可以將yml文件中寫好的值注入到我們類的屬性中。

明白了它的作用,就能明白自動(dòng)配置類工作的原理了。

我們依舊是選取SpringMVC的自動(dòng)配置類,我們來看看其中有些什么東西。

圖片

點(diǎn)擊任意一個(gè)*Properties類中,look一下其中的內(nèi)容:

圖片

看到這里相信所有人都明白了,我們就拿mvc配置來舉例。

圖片

我們?cè)趛ml中配置的date-format,就可以通過@ConfigurationProperties映射到類中的dateFormat中,然后在通過自動(dòng)配置類,將這些屬性配置到配置類中。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2992

    瀏覽量

    114823
  • 開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    375

    瀏覽量

    41901
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    18218
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    15579
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    CYBT343026-01想要修改power,是每次開機(jī)都要設(shè)置一遍碼?

    CYBT343026-01的藍(lán)牙模塊。默認(rèn)用的是9dbm的tx power. 1. 如果想要修改該power,是每次開機(jī)都要設(shè)置一遍(wiced_bt_dev_set_adv_tx_power
    發(fā)表于 07-08 06:10

    個(gè)人認(rèn)為51匯編至少過一遍

    個(gè)人認(rèn)為51匯編至少過一遍?,F(xiàn)在網(wǎng)上百分之九十的單片機(jī)資料都是C 語言的,都適合初學(xué)者入門,我覺得這個(gè)不錯(cuò)的?,F(xiàn)在也越來越多的發(fā)燒友認(rèn)為沒必要再學(xué)匯編,直接學(xué)C語言,這當(dāng)然沒錯(cuò),可惜,如果你連單片機(jī)
    發(fā)表于 08-21 08:22

    主程序執(zhí)行一遍后單片機(jī)鎖存器怎么變化?

    例如點(diǎn)亮數(shù)碼管的程序最后行死循環(huán)去掉的話鎖存器是保持狀態(tài)使數(shù)碼管亮著還是執(zhí)行一遍主函數(shù)就滅了?#include***it dula=P2^6;***it wela=P2^7;void main
    發(fā)表于 10-19 18:25

    剛學(xué)STM32,按照個(gè)網(wǎng)上找的LED程序,自己寫了一遍,可是...

    剛學(xué)STM32,按照個(gè)網(wǎng)上找的LED程序,自己寫了一遍,可是無法編譯??!求大神幫忙解決一下,感激不盡。下面是我寫的程序。
    發(fā)表于 11-04 02:33

    只是為了積分,刷一遍主題

    只是為了積分,刷一遍主題
    發(fā)表于 10-11 11:14

    已經(jīng)跟著入門書籍學(xué)了一遍LabVIEW基礎(chǔ)知識(shí),現(xiàn)在該怎么練手呢

    小白剛起步,過了一遍基本知識(shí)后不知如何開展下步,大神們給指導(dǎo)個(gè)方向,或者下步需要用的學(xué)習(xí)資料也可以
    發(fā)表于 05-04 16:30

    IAP15W413AS灌程序要先用串口燒錄一遍

    IAP15W413AS灌程序要先用串口燒錄一遍然后在燒錄軟件中選擇下次用485燒錄,為何不能直接用485工具燒錄?是啥原因?。。?!
    發(fā)表于 06-26 18:35

    6678點(diǎn)擊ccml文件debug時(shí)當(dāng)前的out文件會(huì)給所有的core都下載一遍

    我的板子是EVM6678L的開發(fā)板,ccs5.3版本,現(xiàn)在有個(gè)問題,我開始還好好的,突然在次右鍵點(diǎn)擊ccml文件debug時(shí),當(dāng)前的out文件會(huì)給所有的core都下載一遍,在debug之前,我已經(jīng)選擇了只是用core0了,不知道為什么?望達(dá)人解答
    發(fā)表于 12-28 11:01

    怎么讓液晶把每種顏色都顯示一遍

    原子哥哥,我想讓液晶吧每種顏色都顯示一遍,可是有很多種顏色為顯示出來?#頭文件int main( void ){u16i ; 初始化; do {LCD_Clear( i );i++;delay_ms
    發(fā)表于 03-04 06:35

    請(qǐng)問在bootloader里面已經(jīng)包含的配置在app里面還需要在配置一遍嗎?

    請(qǐng)問大家在bootloader里面已經(jīng)包含的配置在app里面還需要在配置一遍么。。如果在app里面的配置和bootloader里面不樣呢。。望高手給予幫助。。
    發(fā)表于 04-22 03:26

    為什么任哲VC上的移植我只能運(yùn)行一遍?

    只顯示一遍MY,不是循環(huán)顯示。例12-2
    發(fā)表于 11-04 03:47

    英偉達(dá)AI機(jī)器人開發(fā)新技能 看一遍就能自學(xué)成才

    AI和機(jī)器學(xué)習(xí)已經(jīng)流行了很久,但我們通常需要輸入海量的學(xué)習(xí)樣本和已知結(jié)果來讓機(jī)器學(xué)習(xí)項(xiàng)新技能。英偉達(dá)的研究者為工業(yè)機(jī)器人開發(fā)了種新的學(xué)習(xí)方法,和我們?nèi)祟?b class='flag-5'>一樣,機(jī)器人能通過觀看其他人的操作直接進(jìn)行模仿,教
    發(fā)表于 05-23 02:25 ?2083次閱讀

    個(gè)深度學(xué)習(xí)模型能完成幾項(xiàng)NLP任務(wù)?

    對(duì)于機(jī)器翻譯、文本摘要、Q&A、文本分類等自然語言處理任務(wù)來說,深度學(xué)習(xí)的出現(xiàn)一遍刷新了state-of-the-art的模型性能記錄,給研究帶來諸多驚喜。但這些任務(wù)般都有各自的度
    的頭像 發(fā)表于 06-26 15:19 ?5117次閱讀

    自動(dòng)裝配線有哪些設(shè)計(jì)

    自動(dòng)裝配線輸送帶的實(shí)際操作中,裝配頭對(duì)裝配件釋放的力務(wù)必證實(shí)配件的恰當(dāng)聯(lián)接。自動(dòng)裝配線有哪些設(shè)
    發(fā)表于 08-10 14:37 ?1262次閱讀

    深度盤點(diǎn)一遍自動(dòng)裝配原理(上)

    Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。
    的頭像 發(fā)表于 04-07 11:18 ?1053次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>盤點(diǎn)</b><b class='flag-5'>一遍</b><b class='flag-5'>自動(dòng)</b><b class='flag-5'>裝配</b>原理(上)