Spring Boot自动配置非常灵活,就像我们买手抓饼一样,套餐里的辅料是自动配置好的,但这或许不适合你的口味,你就只能自己配置手抓饼了吗?当然不是,小吃店会让你以菜单上已有的选项为基础进行定制。下面以覆盖Spring Security配置例子入手。
1.自动配置中使用的条件化注解表
image.png2.自定义安全配置
@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提供的配置就被跳过了。所以我们成功显示覆盖了自动配置!!
网友评论