Spring Boot參考教程(五)Spring Boot配置使用之配置類用法
4.2. SpringBoot配置使用之配置類使用
Spring Boot的大部分自動配置都可以滿足應用要求,但如果想精確的控制應用,或者想覆蓋自動配置,使用配置類是另一種很好的選擇,強調一下,Spring Boot主要使用配置文件和配置類來做配置。
1. 啟動類
在創建Spring Boot工程的時候會根據工程打包的選擇方式,自動生成兩個類,一個用於本地啟動和以打成jar包方式啟動,一個是以War包方式啟動的兩個最重要的配置類。筆者稱為啟動類。
代碼如下:
(1)jar啟動類:
關於SpringApplication我們可以做一些定制,如下簡單演示:
SpringApplication app = newSpringApplication(MySpringConfiguration.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
上述代碼是以代碼的方式關閉Spring Boot的banner顯示。
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
通過上面代碼可以跟其他的Application進行父子上下文的關聯,不再測試。
2war啟動類
實際上方式基本相似代碼如下:
@SpringBootApplication()
public classHelloworldApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilderconfigure(SpringApplicationBuilder application) {
returnapplication.sources(HelloworldApplication.class);
}
主要是繼承SpringBootServletInitializer後重寫configure()方法而方法中內容跟jar啟動是的main方法一致。
具體可自行研究。
示例如下:
2. 配置首頁
在應用中配置應用的首頁有多種方式,有一種是在web.xml中配置,使用welcome元素配置首頁,在Spring Boot中如何配置,演示如下:
編寫代碼:
編寫簡單測試主頁:
啟動測試:
3. 配置Bean
開發中肯定會有場景需要自定義Bean並加入IOC容器中,可以使用@Component註解,當無法使用註解時可使用如下方法,在類上加入@Configuration,在方法上加入註解@Bean,測試代碼如下:創建實體bean
創建配置類,在類上加入註解@Configuration,創建配置方法在方法上加入註解@Bean即可:
測試代碼:
啟動訪問測試:
4. 條件化配置Bean
開發時會遇到場景:有些bean的初始化需要依賴其他Bean或根據條件來決定要不要初始化。Spring Boot提供多種條件註解滿足需求,事實上Spring Boot應用的自動裝配很大一部分Bean是根據條件註解實現的。
具體註解和介紹如下:
1. @ConditionalOnBean:Spring容器中是否存在對應的實例。可以通過實例的類型、類名、註解、昵稱去容器中查找(可以配置從當前容器中查找或者父容器中查找或者兩者一起查找)這些屬性都是數組,通過"與"的關系進行查找。
2. @ConditionalOnClass: 類加載器中是否存在對應的類。可以通過Class指定(value屬性)或者Class的全名指定(name屬性)。如果是多個類或者多個類名的話,關系是"與"關系,也就是說這些類或者類名都必須同時在類加載器中存在。
3. @ConditionalOnExpression:判斷SpEL表達式是否成立。
4. @ConditionalOnJava: 指定Java版本是否符合要求。內部有2個屬性value和range。value表示一個枚舉的Java版本,range表示比這個老或者新於等於指定的Java版本(默認是新於等於)。內部會基於某些jdk版本特有的類去類加載器中查詢,比如如果是jdk9,類加載器中需要存在java.security.cert.URICertStoreParameters;如果是jdk8,類加載器中需要存在java.util.function.Function;如果是jdk7,類加載器中需要存在java.nio.file.Files;如果是jdk6,類加載器中需要存在java.util.ServiceLoader。
5. @ConditionalOnMissingBean:Spring容器中是否缺少對應的實例。可以通過實例的類型、類名、註解、昵稱去容器中查找(可以配置從當前容器中查找或者父容器中查找或者兩者一起查找)這些屬性都是數組,通過"與"的關系進行查找。還多了2個屬性ignored(類名)和ignoredType(類名),匹配的過程中會忽略這些bean。
6. @ConditionalOnMissingClass:跟ConditionalOnClass的處理邏輯一樣,只是條件相反,在類加載器中不存在對應的類。
7. @ConditionalOnNotWebApplication:應用程序是否是非Web程序,沒有提供屬性,只是一個標識。會從判斷Web程序特有的類是否存在,環境是否是Servlet環境,容器是否是Web容器等。
8. @ConditionalOnProperty:應用環境中的屬性是否存在。提供prefix、name、havingValue以及matchIfMissing屬性。prefix表示屬性名的前綴,name是屬性名,havingValue是具體的屬性值,matchIfMissing是個boolean值,如果屬性不存在,這個matchIfMissing為true的話,會繼續驗證下去,否則屬性不存在的話直接就相當於匹配不成功。
9. @ConditionalOnResource:是否存在指定的資源文件。只有一個屬性resources,是個String數組。會從類加載器中去查詢對應的資源文件是否存在。
10. @ConditionalOnSingleCandidate:Spring容器中是否存在且只存在一個對應的實例。只有3個屬性value、type、search。跟ConditionalOnBean中的這3種屬性值意義一樣。
11. @ConditionalOnWebApplication:應用程序是否是Web程序,沒有提供屬性,只是一個標識。會從判斷Web程序特有的類是否存在,環境是否是Servlet環境,容器是否是Web容器等。
下面只做兩個註解的測試:
測試註解1:@ConditionalOnBean/@ConditionalOnClass
以下測試同時適用於上述兩個註解:
創建兩個實體類如下:
在配置文件中加入配置:
configbean.value1=value1
configbean.value2=value2
configbean.value3=value3
configbean.value4=value4
配Bean:首先測試對ConffigBean1不進行配置初始化
測試類:
啟動訪問,測試結果:
修改代碼加入配置ConfigBean1的配置代碼:
重啟後測試,訪問結果:
測試註解2: @ConditionalOnExpression
修改代碼:
在application.properties中加入配置:
configbean.configbean1.configornot=true
configbean.configbean2.configornot=false
註:上配置及註解表明,配置ConfigBean1不進行配置ConfigBean2
啟動測試:
測試顯示configbean1初始化成功,configbean2未進行初始化.
關於條件化配置bean有更復雜,更精確的配置使用方式,在後面章節,<整合mybatis+第三方數據源>中會演示。
5. 配置靜態資源
關於SpringBoot靜態資源的配置上文4.1.1中已介紹使用配置文件進行配置的方法,但使用配置文件進行配置有個缺點,就是會覆蓋默認的靜態資源配置,若想保留默認配置可使用如下方式進行配置。
代碼如下,不再測試:
<實例代碼>
Github:https://github.com/chunyuding/SpringBoot-Demo
https://github.com/chunyuding/SpringBoot-Demo.git
碼雲:https://gitee.com/dingchunyu/SpringBoot-Demo
https://gitee.com/dingchunyu/SpringBoot-Demo.git
<推薦書籍>
百度雲:http://pan.baidu.com/s/1qYA0Nxi
Spring Boot參考教程(五)Spring Boot配置使用之配置類用法