<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                SpringBoot項目無需各種配置文件,一個main方法,就能把項目啟動起來。那么我們看看SpringBoot是如何進行自動配置和啟動的。 SpringBoot通過main方法啟動SpringApplication類的靜態方法run()來啟動項目。 ![](https://img.kancloud.cn/27/b7/27b7acab2376c88a7f2db446ceb1e155_613x236.png) 根據注釋的意思,run方法從一個使用了默認配置的指定資源啟動一個SpringApplication并返回ApplicationContext對象,這個默認配置如何指定呢? ![](https://img.kancloud.cn/17/01/170135de72ff393f4aa93a68229ccc38_920x251.png) ***** 這個默認配置來源于@SpringBootApplication注解,這個注解是個復合注解,里面還包含了其他注解。 ![](https://img.kancloud.cn/6a/db/6adbc4e0f84194f40841eecd8e7b4338_964x333.png) 其中有三個注解是比較重要的: @SpringBootConfiguration:這個注解的底層是一個@Configuration注解,意思被@Configuration注解修飾的類是一個IOC容器,支持JavaConfig的方式來進行配置; @ComponentScan:該注解的功能開啟組件掃描,可以自動掃描指定包路徑下的Spring注解。@Controller/@Service/@Component/@Repository等注解加載到IOC容器中; @EnableAutoConfiguration:這個注解表明啟動自動裝配,里面包含連個比較重要的注解@AutoConfigurationPackage和@Import。 ![](https://img.kancloud.cn/73/42/7342bcaca606738e233d4ca047471aa8_720x254.png) @AutoConfigurationPackage和@ComponentScan一樣,也是將主配置類所在的包及其子包里面的組件掃描到IOC容器中,但是區別是@AutoConfigurationPackage掃描@Enitity、@MapperScan等第三方依賴的注解,@ComponentScan只掃描@Controller/@Service/@Component/@Repository這些常見注解。所以這兩個注解掃描的對象是不一樣的。 @Import(AutoConfigurationImportSelector.class)是自動裝配的核心注解,AutoConfigurationImportSelector.class中有個selectImports方法。 ***** 接著我們來看下AutoConfigurationImportSelector這個類的selectImports方法 ![](https://img.kancloud.cn/ee/40/ee400426f64967f4ad60454968a03ccf_976x241.png) selectImports方法還調用了getCandidateConfigurations方法 ![](https://img.kancloud.cn/a6/c3/a6c311d0648c510b524e499d87ed7a5f_937x525.png) getCandidateConfigurations方法中,我們可以看下斷言,說找不到**META-INF/spring.factories**,由此可見,這個方法是用來找META-INF/spring.factories文件的 ![](https://img.kancloud.cn/fa/54/fa5467108d23cb91569029bfe9076117_1123x353.png) ![](https://img.kancloud.cn/48/90/4890b24b3cfd3268dcc858deb2140af5_1060x265.png) ![](https://img.kancloud.cn/09/c4/09c41c4ae296cfb3ac12e401702766ed_1210x605.png) 我們可以定位到這個方法所在的類處于spring-boot-autoconfigure-*.jar包中,* ![](https://img.kancloud.cn/c3/2e/c32eb5704392ccd3be6c3400e99a7f72_484x285.png) *其中spring.factories文件是一組組的key=value的形式,包含了key為EnableAutoConfiguration的全類名,value是一個*AutoConfiguration類名的列表,以逗號分隔。 ![](https://img.kancloud.cn/eb/0a/eb0a8749ba75f2fa538781e7d8b497f0_1406x734.png) **最終**,@EnableAutoConfiguration注解通過@SpringBootApplication注解被間接的標記在了SpringBoot的啟動類上,SpringApplicaton.run方法的內部就會執行selectImports方法,進而找到所有JavaConfig配置類全限定名對應的class,然后將所有自動配置類加載到IOC容器中。 ***** 那么這些類是如何獲取默認屬性值的呢?以我們熟悉的**RedisAutoConfiguration**為例,它是springboot集成redis的自動配置類 ![](https://img.kancloud.cn/f5/e0/f5e0011939e4e0dd3fe313b54da98c3a_766x362.png) 該類上開啟了@EnableConfigurationProperties({RedisProperties.class})注解,最終找到了RedisProperties類。 ![](https://img.kancloud.cn/53/3a/533a480f862d7b9df6b6b9430a2c1924_768x638.png) 至此,我們大致可以了解。在全局配置的屬性如:server.port等,通過@ConfigurationProperties注解,綁定到對應的XxxxProperties配置實體類上封裝為一個bean,然后再通過@EnableConfigurationProperties注解導入到Spring容器中。 此處還有一個問題:* 我們有些配置類不需要導入,例如不需要Redis,他會不會給我們導入呢? 答案是:不會 決定配置類是否生效的一個重要因素就是@Conditional注解 只有符合要求才能決定配置類是否生效 **下面附上一個常用條件注解** ~~~text @ConditionalOnBean(上下文中存在某個對象時,才會實例化一個Bean) @ConditionalOnMissingBean(上下文中不存在某個對象時,才會實例化一個Bean) @ConditionalOnClass(某個class位于類路徑,才會實例化一個Bean) @ConditionalOnMissingClass(某個class類路徑上不存在的時候,才會實例化一個Bean) @ConditionalOnExpression(當表達式為true的時候,才會實例化一個Bean) @ConditionalOnNotWebApplication(不是web應用) ~~~ ***** **總結:** 1.SpringBoot啟動的時候通過@EnableAutoConfiguration注解找到META-INF/spring.factories文件中的所有自動配置類,并對其加載,這些自動配置類都是以AutoConfiguration結尾來命名的。 2.這些以AutoConfiguration結尾來命名的類實際上就是一個JavaConfig形式的IOC容器配置類,通過以Properties結尾命名的類中取得在全局配置文件中配置的屬性,如server.port。 *Properties類的含義:封裝配置文件的相關屬性。 *AutoConfiguration類的含義:自動配置類,添加到IOC容器中。 推薦閱讀:https://www.cnblogs.com/krock/p/15142384.html
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看