2017-09-14 43 views
6

我知道Spring Boot有很多@Conditional註釋,例如@ConditionalOnBean@ConditionalOnClass,@ConditionalOnProperty,ConditionalOnWebApplication。但我不知道這是如何工作的?條件註釋如何在Spring Boot中起作用?

例如:

@Configuration  
@ConditionalOnClass(MyBean.class) 
public class MyConfiguration{ 
    // omitted  
} 

我瞭解,MyConfiguration將只有MyBean在我的類路徑被加載。但是,如果MyBean類不在我的類路徑中,編譯器達到@ConditionalOnClass(MyBean.class)一行,它將如何編譯和運行,是否會拋出編譯器錯誤?只要我在eclipse中添加這樣的代碼,我就會收到編譯時錯誤。對不起,如果這是太基本的問題,但我不知道我錯過了什麼理解。

回答

6

春天引導被編譯,有很多可選的依賴關係;所以當編譯Spring Boot時,MyBean.class位於類路徑中。

現在,您的應用程序在其類路徑中可能沒有MyBean.class,但它在運行時不會失敗。這是因爲處理@ConditionalOnClass註釋的基礎結構實際上會讀取配置的字節碼,並且只會在該MyBean.class存在時才加載它們。見@ConditionalOnClass javadoc

現在自動配置是一個廣泛的主題,你可以學習more about this in this talk

+0

您的解釋和鏈接非常有幫助。非常感謝 –

0

您通常使用Optional依賴關係:

<dependency> 
    <groupId>org.freemarker</groupId> 
    <artifactId>freemarker</artifactId> 
    <optional>true</optional> 
</dependency> 
1

作爲Spring Boot Documentation說:

的@ConditionalOnClass和@ConditionalOnMissingClass註解 允許基於存在或特定類的不存在 被包括配置。由於使用ASM解析註釋元數據 的事實,您實際上可以使用value屬性來引用 真實類,即使該類可能實際上並不出現在正在運行的應用程序類路徑的 上。如果您希望使用字符串值指定類名稱,也可以使用名稱屬性 。

因此,他們使用字節碼操作庫ASM能夠在運行時分析類名,即使這些類不再在類路徑中。由於Spring是開源的,你甚至可以去看看annotation reading code

相關問題