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