SpringBoot自动配置原理

概述

SpringBoot 核心能力之一就是自动配置,SpringBoot之所以可以快速集成Spring组件,是因为它具备自动配置的能力。

本文将探索 org.springframework.boot.autoconfigure 和 org.springframework.boot.autoconfigure.condition 包中的相关注解,这些是实现SpringBoot自动配置的一线工作者。

@SpringBootApplication

我们使用此 @SpringBootApplication注解 来标记 Spring Boot 应用程序的主类:


@SpringBootApplication
class VehicleFactoryApplication {

    public static void main(String[] args) {
              SpringApplication.run(VehicleFactoryApplication.class, args);
    }
}

点击@SpringBootApplication 注解会发现其封装了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注释。

@EnableAutoConfiguration

@EnableAutoConfiguration,顾名思义,启用自动配置。这意味着 Spring Boot 在其 Classpath 上查找自动配置 bean 并自动应用它们。

请注意,我们必须将此 annotation 与 @Configuration一起使用:


@Configuration
@EnableAutoConfiguration
class VehicleFactoryConfig {

}

条件配置

@ConditionalOnClass 和 @ConditionalOnMissingClass

使用这两个注解,可以实现在指定 class 存在/不存在 的时候自动装配bean。


@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoconfiguration {
    //...
}

@ConditionalOnBean 和 @ConditionalOnMissingBean

当我们想根据特定 bean 的存在与否来定义条件时,我们可以使用这些注解:


@Bean
@ConditionalOnBean(name = "dataSource")
LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    // ...
}

@ConditionalOnProperty

通过这个注解,我们可以对 properties 的值设置条件装配:


@Bean
@ConditionalOnProperty(
    name = "usemysql", 
    havingValue = "local"
)
DataSource dataSource() {
    // ...
}

@ConditionalOnResource

通过这个注解,我们可以对 resource 的值设置条件装配:


@ConditionalOnResource(resources = "classpath:mysql.properties")
Properties additionalProperties() {
    // ...
}

@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication

通过这些注释,我们可以根据当前应用程序是否是 Web 应用程序来创建条件装配:


@ConditionalOnWebApplication
HealthCheckController healthCheckController() {
    // ...
}

@ConditionalExpression

我们可以在更复杂的情况下使用这个注解。当 SPEL 表达式被评估为true时, Spring 将使用标记的定义:


@Bean
@ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
DataSource dataSource() {
    // ...
}

@Conditional

对于更复杂的条件,我们可以创建一个评估自定义条件的类。我们告诉 Spring 将此自定义条件与 @Conditional一起使用


@Conditional(HibernateCondition.class)
Properties additionalProperties() {
    //...
}
    

总结

本文阐述了SpringBoot 自动配置原理以及常见的装配bean手段,并提供了在不同使用场景的最佳实践参考。

引用

  • https://www.baeldung.com/spring-boot-annotations
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值