SpringBoot之Configuration



  在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 定義裝配順序,其值越低配置優先級越高

  需要注意的是該注解類只能作用於配置類上以調整裝配的執行順序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM