在SpringBoot中可以通過@Configuration對某個類注解將該類申明為配置類,以此在代替先前spring版本中配置xml中的功能,並且增加了可讀性與維護性。並且在注解類中的類方法中可以通過@Bean對該類方法返回的對象注入到Spring容器中,其方法名也是該對象在spring容器中的對象名。
//簡單的配置類及對象注入到spring容器中。
@Configuration
public class DemoConfiguration {
@Bean()
public String demoObj(){
return "demoObj";
}
//底層采用DefaultParameterNameDiscoverer類,可獲取到容器中bean-name為demoObj的對象
@Bean()
public String demoObj2(String demoObj){
return "demoObj2"
}
}
然而我們在自定義配置類往往需要有更大的靈活性,以適應不同場景下的不同裝配規則,當然SpringBoot也有考慮到這一點,也為我們提供了一系列的關於Configuration的條件類注解,以助於我們更好的編寫出靈活的裝備類。比如我們可以根據在classpath中是否具有某個類而決定是否進行裝配,又或者說可以根據容器中是否已經具有某個bean后而決定是否進行裝配等。以下將列出在Configuration中經常伴隨着使用的條件注解。
條件配置注解 | 注解說明 |
---|---|
@ConditionalOnBean | 當Spring容器中具有某個Bean時才進行裝配 |
@ConditionalOnClass | 當classpath中存在某個對象時才進行裝配 |
@ConditionalOnCloudPlatform | 當處於SpringCloud環境時才進行裝配 |
@ConditionalOnExpression | 當SpEL表達式返回true時才進行裝配 |
@ConditionalOnJava | 當java版本為指定的版本時才進行裝配 |
@ConditionalOnJndi | 當有通過JNDI加載資源時才進行裝配 |
@ConditionalOnMissingBean | 當Spring容器中不具有某個Bean時才進行裝配 |
@ConditionalOnMissingClass | 當classpath中不存在某個對象時才進行裝配 |
@ConditionalOnNotWebApplication | 當不是處於WebApp環境時才進行裝配 |
@ConditionalOnProperty | 在Environment下具有某個配置信息時才進行裝配 |
@ConditionalOnResource | 當classpath下具有某個資源信息(全路徑)時才進行裝配 |
@ConditionalOnSingleCandidate | 指定的class類在spring容器中只存在一個時才進行裝配 |
@ConditionalOnWebApplication | 當處於WebApp環境時才進行裝配 |
@ConditionalOnRepositoryType | 當特定類型的spring Data JPA啟用的時候才進行裝配 |
以上注解信息分別在spring包spring-boot-autoconfigure-2.0.1.RELEASE.jar中的org.springframework.boot.autoconfigure.condition路徑中。該注解即可以注釋在類配置上,也可以注釋在類方法上以便對整個裝配范圍的顆粒度做更好的選擇
但是需要注意的是,JAVA在進行編譯時會有編譯期的檢查,所以在使用了@ConditionalOnClass和@ConditionalOnMissingClass的時候編譯時需要確保所指定的class在classpath中存在,否則會報編譯期的異常。而在外部引用時不需要確保其class是否存在於classpath。因為jvm是按需讀取class,當遇到遇到的class時才會調用classloader進行讀取存入方法區中。而如果讀取不到其會被@ConditionalOnClass與@ConditionalOnMissingClass對應的處理類感知到,並且使該注解下的配置類不進行具體的裝配從而起到效果。
有時候單單只使用配置條件類注解仍然無法滿足某些特定的需求,比如說需要按照某個加載順序進行裝配類加載,這時候就需要配置順序類對配置類進行注解來達到這種效果。
順序配置注解 | 注解說明 |
---|---|
@AutoConfigureAfter | 在某個配置類裝配后才進行裝配 |
@AutoConfigureBefore | 在某個配置類裝配前先提前裝配 |
@AutoConfigureOrder | 定義裝配順序,其值越低配置優先級越高 |
需要注意的是該注解類只能作用於配置類上以調整裝配的執行順序。