Spring Boot筆記 -- 配置


打包運行
    使用插件:spring-boot-maven-plugin打成jar包,直接執行jar就可以運行
POM文件
    父項目依賴:spring-boot-starter-parent -> spring-boot-dependencies
    spring boot的版本仲裁:以後我們導入依賴默認是不需要寫版本的;沒有在dependencies裏面管理的依賴自然需要聲明版本號
    spring-boot-starter-web:
        sping boot starter: spring boot的場景啓動器,幫我們導入web的依賴
        spring boot將所有的功能場景都抽離出來,做成一個個的starters(啓動器),只需要在項目裏面引入依賴

resources文件夾中的目錄結構
    static:保存所有的靜態資源,js,css,img
    templates:保存所有的模版頁面(spring boot默認jar包使用嵌入式的tomcat,默認不支持JSP頁面)可以使用模版引擎(freemarker, thymeleaf)
    application.properties: Spring boot應用的配置文件,可以修改一些默認的配置項
        比如配置 'server.port=8081' 來改變端口號

配置文件
    配置文件名是固定的
    application.properties
    application.yml
    YAML文件以數據爲中心的標記語言
    YAML語法:
        k:(空格)v 表示一對鍵值對
        以空格的縮進來控制層級 關係,屬性的值大小寫敏感
        值的寫法:
            字面量:普通的值(數字,字符串,布爾)
                字符串默認不需要加引號;
                    如果加雙引號不會轉譯特殊字符:"\n" -> 換行
                    如果加單引號會轉譯特殊字符:'\n' -> '\n'
            對象以Map的形式表示
                縮進寫法:
                    user:
                        name: 'dog'
                        age: 13
                行內寫法:user: {name: 'dog', age: 13}
            數組(List. Set)
                縮進寫法:
                    list:
                        - 1
                        - 2
                        - 3
                行內寫法:list: [1, 2, 3]


@ConfigurationProperties     和     @value("") 的區別
    批量注入配置文件中的屬性            一個個的指定
    支持鬆散綁定                      不支持鬆散綁定
    不支持spEL                       支持spEL
    支持JSR303數據校驗(@Validated)    不支持
    支持                             不支持複雜類型封裝(比如map,list)

    如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value
    如果說,我們專門編寫一個javaBean來配置文件進行映射,我們就使用@ConfigurationProperties

@ConfigurationProperties : 默認從全局配置文件中獲取值
@PropertySource 和  @ImportResource
    @PropertySource : 加載指定的配置文件
    @ImportResource : 導入Spring 的配置文件,讓配置文件裏面的內容生效



springBoot推薦給容器添加組件的方式,推薦使用全註解的方式
    1. 配置類  ======  spring配置文件
    2. 使用@Bean給容器中添加組件



配置文件的佔位符
    1. 隨機數 ${random.value} ${random.uuid} ${random.long}
    2. 佔位符並可以指定默認值 ${person.name:zhangsan}




Profile是Spring對不同環境提供不同配置功能的支持,可以通過激活、指定參數等方式快速切換環境。

    多Profile文件
        我們在主配置文件編寫的時候,文件名可以是 application-{profile}.properties/yml
        默認使用application.properties的配置

        激活指定profile
        在配置文件中指定 spring.profiles.active=dev

    yml支持多文檔塊的方式

    命令行個參數

    虛擬機參數
    -Dspring.profiles.active=dev


配置文件的加載位置
    Spring boot 啓動會掃描以下位置的application.properties或者application.yml文件作爲spring boot的默認配置文件
    file: ./config/
    file: ./
    classpath: /config/
    classpath: /
    以上是按照優先級從高優先級到低優先級, 每個配置文件中的屬性有互補配置

    我們可以通過spring.config.location來改變默認的配置文件位置
    項目打包好以後 我們可以使用命令行參數的形式,啓動項目的時候指定配置文件的新位置


外部配置加載順序
    命令行參數
    jar包外包的application-{profile}.propertes的配置文件

自動配置原理:
    1. spring boot啓動的時候加載主配置類,開啓類自動配置功能@EnableAutoConfiguration
    2. @EnableAutoConfiguration的作用
        EnableAutoConfigurationImportSelector 利用這個選擇器給容器導入一些組件
        可以查看selectImports方法的內容
        List<String> configurations = getCandidateConfigrations(annotationMetadata, attributes)獲取候選的配置

        SpringFactoriesLoader.loadFactoryNames) 掃描jar包類路徑下 META_INF/Spring.factories
        把掃描到的這些文件的內容封裝成properties對象
        從properties中獲取到EnableAutoConfiguration.class類對應的值,然後把他們添加到容器中
        將類路徑下 META/INF/spring.factories裏面配置的所有的EnableAutoConfiguration值加入到了容器中
        每一個這樣的xxxAutoConfiguration類都是容器中的一個組件,都加入到容器中,用他們來做自動配置
        每一個自動配置類進行自動配置功能
        以 HttpEncodingAutoConfiguration爲例解釋自動配置原理:
            @Configuration // 表示這是一個配置類,以前編寫的配置文件一樣,也可以給容器添加組件
            @EnableConfigurationProperties(HttpEncodingProperties.class)
            @ConditionalOnWebApplication
            @ConditionalOnClass(CharacterEncodingFilter.class)
            @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
            public class HttpEncodingAutoConfiguration {
        根據當前不同的條件判斷,決定配置是否生效,如果生效就@Bean 給容器中添加一個組件
        一旦配置生效,這個配置類就給容器中添加各種組件

    3. 精髓
        1)spring boot啓動會加載大量的自動配置類
        2)我們看我們需要的功能有沒有spring boot默認寫好的自動配置類
        3)我們在來看這個自動配置類中到底配置了哪些組件,只要我們要用的組件有 我們就不需要在配置了
        4)給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性,我們就可以在配置文件中指定這些屬性的值

    4. @Conditional派生註解
        作用: 必須是@Conditional指定的添加成立,纔給容器中添加組件,配置文件中的屬性才生效
            @ConditionalOnBean // 判斷容器中是否存在組件
             @ConditionalJava // 系統的java版本是否符合要求
             @ConditionalOnProperty
             @ConditionalOnResource
             @ConditionalOnWebAppliaction
    5. 我們怎麼知道哪些配置類生效了
        在配置文件中配置debug=true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章