<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 的精髓就是可以自動配置,減少了開發人員編寫配置文件的工作量,提高開發效率。 <br/> SpringBoot提供了哪些自動配置參考[官方文檔](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#appendix)。 <br/> SpringBoot能夠實現自動配置,是因為它通過一個過程最終找到了文件`META-INF/spring.factories`,并讀取該文件提供的配置插件來完成自動配置,在創建 SpringBoot 項目后,你可以如下圖查看提供了哪些自動配置。 ![](https://img.kancloud.cn/dc/fb/dcfbeea3f1f031abcc29a82970be7542_1857x429.jpg) <br/> 它的自動配置原理如下,通過啟動類上的`@SpringBootApplication`入口找到下面的過程: ``` 當SpringBoot啟動后,它通過下面的過程來加載自動配置 @SpringBootApplication -> @EnableAutoConfiguration -> @Import({AutoConfigurationImportSelector.class}) -> AutoConfigurationImportSelector.selectImports(...) -> getAutoConfigurationEntry(...) -> List<String> configurations = getCandidateConfigurations(...) ->getCandidateConfigurations(...)->SpringFactoriesLoader.loadFactoryNames(...) -> SpringFactoriesLoader.loadSpringFactories(...)-> classLoader.getResources("META-INF/spring.factories") -> AutoConfigurationImportSelector.getCandidateConfigurations(...)-> List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), -> protected Class<?> getSpringFactoriesLoaderFactoryClass() { return EnableAutoConfiguration.class; } 最終方法返回EnableAutoConfiguration.class,將該類的所有組件加入到容器中 -> META-INF/spring.factories -> # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\ ``` 找到`META-INF/spring.factories`文件中的自動配置組件,將這些組件加入到容器中,使得這些組件起作用。 <br/> 下面我們選取HttpEncodingAutoConfiguration這個自動配置組件來研究下,它的部分源碼如下: ```java // 配置類,與application.properties,或application.yml配置文件是同等效果 @Configuration( proxyBeanMethods = false ) // 將ServerProperties類中的相關配置加載到當前配置中 // 點擊ServerProperties.class進去后,你會看到很多待配置的屬性 // ServerProperties中屬性與配置文件中的屬性對應起來,并獲取配置文件中相應屬性的值 @EnableConfigurationProperties({ServerProperties.class}) // 底層是Spring的@Conditional注解,根據當前的應用程序是不是Web應用, // 是則讓HttpEncodingAutoConfiguration這個配置類生效,否則不讓生效 @ConditionalOnWebApplication( type = Type.SERVLET ) // 判斷當前項目中是否有CharacterEncodingFilter這個類,有則讓這個類生效 // CharacterEncodingFilter是我們在學習SpringMVC時用來處理中文亂碼的過濾器 @ConditionalOnClass({CharacterEncodingFilter.class}) // 判斷配置文件中是否存在server.servlet.encoding配置,它的默認值為enabled // 而matchIfMissing為true表示不論是否存在server.servlet.encoding配置 // 都讓HttpEncodingAutoConfiguration這個配置類生效 @ConditionalOnProperty( prefix = "server.servlet.encoding", value = {"enabled"}, matchIfMissing = true ) // 這個自動用一句話概括就是:根據條件來決定是否讓這個配置生效 public class HttpEncodingAutoConfiguration { private final Encoding properties; // 通過自身的構造器獲取ServerProperties,然后提供給自身 public HttpEncodingAutoConfiguration(ServerProperties properties) { this.properties = properties.getServlet().getEncoding(); } // 當上面的@ConditionalOnWebApplication、@ConditionalOnClass //、@ConditionalOnProperty三個條件都成立后。@Bean就會往容器中添加 // CharacterEncodingFilter組件,這個組件屬性的值從ServerProperties中獲取 @ConditionalOnMissingBean // 如果CharacterEncodingFilter還沒有被注入容器中,則將其注入并讓這個組件生效 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)); filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE)); return filter; } ``` ServerProperties的部分源碼如下,我們可以看到有許多的配置屬性: ```java @ConfigurationProperties( prefix = "server", ignoreUnknownFields = true ) public class ServerProperties { private Integer port; private InetAddress address; @NestedConfigurationProperty private final ErrorProperties error = new ErrorProperties(); private ServerProperties.ForwardHeadersStrategy forwardHeadersStrategy; private String serverHeader; private DataSize maxHttpHeaderSize = DataSize.ofKilobytes(8L); private Shutdown shutdown; ``` 總結如下: 在每個XXXAutoConfiguration類中,都會通過@EnableConfigurationProperties將相應的XXXProperties類加載到當前的XXXAutoConfiguration類中,而XXXProperties類上相應的屬性已與`application.properties`,或`application.yml`配置文件綁定,可以獲取配置文件中的屬性值。XXXAutoConfiguration使用@Bean和 @ConditionalOnMissingBean將它加入到容器中,所以最終可以讀取到配置文件中配置信息并使自身起作用。 <br/> SpringBoot的精髓就是可以自動配置,減少了開發人員編寫大量配置文件的工作量,提高開發效率。所以我們應該如下應用SpringBoot的自動配置: 1. SpringBoot啟動會加載大量的自動配置類; 2. 我們看我們需要的功能SpringBoot有沒有已經幫我們默認自動配置了; 3. 我們再來看這個自動配置類中到底配置了哪些組件,如果沒有我們要的配置組件,則再由我們自定義; 4. 給容器中的自動配置類添加組件的時候,會從XXXProperties類中獲取某些屬性,這些屬性我們就可以在`application.properties`或`application.yml`中進行指定; 5. 通過封裝XXXProperties類與配置文件進行綁定,然后加載到XXXAutoconfig類中讓這些屬性起作用。
                  <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>

                              哎呀哎呀视频在线观看