Spring Boot自動配置非常靈活,就像我們買手抓餅一樣,套餐里的輔料是自動配置好的,但這或許不適合你的口味,你就只能自己配置手抓餅了嗎?當然不是,小吃店會讓你以菜單上已有的選項為基礎進行定制。下面以覆蓋Spring Security配置例子入手。
1.自動配置中使用的條件化注解表
image.png
2.自定義安全配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
}
3.開始揭開神秘面紗
覆蓋Spring Boot自動配置的安全配置時,最重要的一個類是SpringBootWebSecurityConfiguration。以下是其中的一個代碼片段:
@Configuration
@EnableConfigurationProperties
@ConditionalOnClass({ EnableWebSecurity.class })
@ConditionalOnMissingBean(WebSecurityConfiguration.class)
@ConditionalOnWebApplication
public class SpringBootWebSecurityConfiguration {
...
}
翻看源碼可知, SpringBootWebSecurityConfiguration上好幾個注解。看到@ConditionalOnClass注解后,我們知道Classpath里必須要有@EnableWebSecurity注解。
@ConditionalOnWebApplication 說 明 這 必 須 是 個 Web 應 用 程 序 。 @ConditionalOnMissingBean注解才是我們的安全配置類代替SpringBootWebSecurityConfiguration的關鍵所在。
@ConditionalOnMissingBean注解要求當下沒有WebSecurityConfiguration類型的Bean。雖然表面上我們并沒有這么一個Bean,但通過在SecurityConfig上添加@EnableWeb-Security注解,我們實際上間接創建了一個WebSecurityConfiguration Bean。所以在自動配置時,這個Bean就已經存在了, @ConditionalOnMissingBean條件不成立, SpringBootWebSecurityConfiguration提供的配置就被跳過了。所以我們成功顯示覆蓋了自動配置!!