返回介绍

3.1.3 掀开自动配置的神秘面纱

发布于 2025-04-21 21:10:07 字数 2354 浏览 0 评论 0 收藏

正如我们在 2.3.3 节里讨论的那样,Spring Boot 自动配置自带了很多配置类,每一个都能运用在你的应用程序里。它们都使用了 Spring 4.0 的条件化配置,可以在运行时判断这个配置是该被运用,还是该被忽略。

大部分情况下,表 2-1 里的 @ConditionalOnMissingBean 注解是覆盖自动配置的关键。Spring Boot 的 DataSourceAutoConfiguration 中定义的 JdbcTemplate Bean 就是一个非常简单的例子,演示了 @ConditionalOnMissingBean 如何工作:

@Bean
@ConditionalOnMissingBean(JdbcOperations.class)
public JdbcTemplate jdbcTemplate() {
  return new JdbcTemplate(this.dataSource);
}

jdbcTemplate() 方法上添加了 @Bean 注解,在需要时可以配置出一个 JdbcTemplate Bean。但它上面还加了 @ConditionalOnMissingBean 注解,要求当前不存在 JdbcOperations 类型( JdbcTemplate 实现了该接口)的 Bean 时才生效。如果当前已经有一个 JdbcOperations Bean 了,条件即不满足,不会执行 jdbcTemplate() 方法。

什么情况下会存在一个 JdbcOperations Bean 呢?Spring Boot 的设计是加载应用级配置,随后再考虑自动配置类。因此,如果你已经配置了一个 JdbcTemplate Bean,那么在执行自动配置时就已经存在一个 JdbcOperations 类型的 Bean 了,于是忽略自动配置的 JdbcTemplate Bean。

关于 Spring Security,自动配置会考虑几个配置类。在这里讨论每个配置类的细节是不切实际的,但覆盖 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 上添加 @EnableWebSecurity 注解,我们实际上间接创建了一个 WebSecurityConfiguration Bean。所以在自动配置时,这个 Bean 就已经存在了, @ConditionalOnMissingBean 条件不成立, SpringBootWebSecurityConfiguration 提供的配置就被跳过了。

虽然 Spring Boot 的自动配置和 @ConditionalOnMissingBean 让你能显式地覆盖那些可以自动配置的 Bean,但并不是每次都要做到这种程度。让我们来看看怎么通过设置几个简单的配置属性调整自动配置组件吧。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。