javascript
Spring Boot - 自动配置实例解读
文章目錄
- Pre
- 啟用 debug=true輸出自動配置
- HttpEncodingAutoConfiguration
- 什么情況下,Spring Boot 會自動裝配 HttpEncodingAutoConfiguration
- @EnableConfigurationProperties & ServerProperties
- 是否生效演示
- 原理流程圖
Pre
Spring Boot - 自動配置實現原理中我們說了自動裝配的原理,這里我們繼續接著說,用一個自動裝配的例子,來感受下Spring Boot 的魅力
啟用 debug=true輸出自動配置
我們新建一個SpringBoot的工程,在application.properties中 開啟屬性設置
debug=true啟動工程后,輸出的格式如下
============================ CONDITIONS EVALUATION REPORT ============================Positive matches:---**表示自動配置類啟用的** ----------------- ...省略...Negative matches:---**沒有匹配成功的自動配置類** ----------------- ...省略...我們找個看看吧
HttpEncodingAutoConfiguration
-
@Configuration(proxyBeanMethods = false)
標記了@Configuration Spring底層會給配置創建cglib動態代理。 作用:就是防止每次調用本類的Bean方法而重新創建對象,Bean是默認單例的
-
@EnableConfigurationProperties(ServerProperties.class)
啟用可以在配置類設置的屬性 對應的類
-
@ConditionalXXX 根據當前不同的條件判斷,決定這個配置類是否生效
@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必須是@Conditional指定的條件成立,才給容器中添加組件,配置配里面的所有內容才生效;
以前寫過一篇@Condition的,請移步 Spring - @Conditional全解
| @ConditionalOnJava | 系統的java版本是否符合要求 |
| @ConditionalOnBean | 容器中存在指定Bean; |
| @ConditionalOnMissingBean | 容器中不存在指定Bean; |
| @ConditionalOnExpression | 滿足SpEL表達式指定 |
| @ConditionalOnClass | 系統中有指定的類 |
| @ConditionalOnMissingClass | 系統中沒有指定的類 |
| @ConditionalOnSingleCandidate | 容器中只有一個指定的Bean,或者這個Bean是首選Bean |
| @ConditionalOnProperty | 系統中指定的屬性是否有指定的值 |
| @ConditionalOnResource | 類路徑下是否存在指定資源文件 |
| @ConditionalOnWebApplication | 當前是web環境 |
| @ConditionalOnNotWebApplication | 當前不是web環境 |
| @ConditionalOnJndi | JNDI存在指定項 |
什么情況下,Spring Boot 會自動裝配 HttpEncodingAutoConfiguration
我們來分析下 在滿足什么情況下,Spring Boot 會自動裝配 HttpEncodingAutoConfiguration
主要都在這里了
@Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(ServerProperties.class) @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @ConditionalOnClass(CharacterEncodingFilter.class) @ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)-
@Configuration:表示這是一個配置類,以前編寫的配置文件一樣,也可以給容器中添加組件
-
@ConditionalOnWebApplication:Spring底層@Conditional注解(Spring注解版),根據不同的條件,如果滿足指定的條件,整個配置類里面的配置就會生效; 判斷當前應用是否是web應用,如果是,當前配置類生效
-
@ConditionalOnClass:判斷當前項目有沒有這個類CharacterEncodingFilter;SpringMVC中進行亂碼解決的過濾器
-
@ConditionalOnProperty:判斷配置文件中是否存在某個配置 spring.http.encoding.enabled;如果不存在,判斷也是成立的 . 即使我們配置文件中不配置server.servlet.encoding.enabled=true,也是默認生效的
-
@EnableConfigurationProperties({ServerProperties.class}):將配置文件中對應的值和 ServerProperties綁定起來;并把 ServerProperties加入到 IOC 容器中并注冊. ConfigurationPropertiesBindingPostProcessor用于將@ConfigurationProperties的類和配置進行綁定
@EnableConfigurationProperties & ServerProperties
ServerProperties通過 @ConfigurationProperties 注解將配置文件與自身屬性綁定。
@ConfigurationProperties注解的作用就是把全局配置文件中的值綁定到實體類JavaBean上面(將配置文件中的值與ServerProperites綁定起來),而@EnableConfigurationProperties主要是把以綁定值JavaBean加入到spring容器中。
舉個例子: 我們在application.properties 聲明spring.application.name 是通過@ConfigurationProperties注解,綁定到對應的XxxxProperties配置實體類上,然后再通過@EnableConfigurationProperties注解導入到Spring容器中.
是否生效演示
我們知道了 Web環境 會生效
非web環境,我們搞一把
not match
加入
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>以debug=true的形式啟動
還記得另外一個屬性嗎?
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)我們設置成 false試試
重啟 沒有自動裝配,原因也在下方體現了
原理流程圖
總結
以上是生活随笔為你收集整理的Spring Boot - 自动配置实例解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot - 自动装配中的
- 下一篇: Spring Boot - 手把手教小师