Spring Boot常见注解
- [1. @AutoConfiguration](#1. @AutoConfiguration)
-
- [1.1 自动配置](#1.1 自动配置)
- [1.2 `before` 和 `after` 属性详解](#1.2
before和after属性详解)
- [2. @ConditionalOnClass](#2. @ConditionalOnClass)
- [3. @ConditionalOnBean](#3. @ConditionalOnBean)
- [4. @ConditionalOnSingleCandidate](#4. @ConditionalOnSingleCandidate)
- [5. @ConditionalOnMissingBean](#5. @ConditionalOnMissingBean)
- [6. @Import](#6. @Import)
- 总结
1. @AutoConfiguration
1.1 自动配置
@AutoConfiguration 是 Spring Boot 3.x 新增的注解,等价于 @Configuration 加上自动注册功能 。它的主要作用是标记自动配置类,并通过 spring.factories 或 xxx.AutoConfiguration.imports 文件进行注册。
解释:
- @AutoConfiguration 自动标记该类为配置类,无需手动注册。
- 配合 @ConditionalOnProperty 等条件注解,实现按需加载。
1.2 before 和 after 属性详解
@AutoConfiguration注解中的before、after属性是用于控制自动配置类加载顺序的重要属性。
Spring Boot自动配置类可能需要特定的加载顺序:
- 某些配置必须在其他配置之前执行。
- 某些配置依赖于其他配置创建的bean。
after 属性
含义 :当前自动配置类在指定类之后加载。
java
@AutoConfiguration(after = {
DataSourceAutoConfiguration.class,
TransactionManagerCustomizationAutoConfiguration.class
})
public class DataSourceTransactionManagerAutoConfiguration {
// 这个配置需要在 数据源(DataSource)和 定制事务管理器配置 之后加载。
// 因为这个配置类的方法中需要使用 DataSource和其他的bean
}
DataSourceTransactionManagerAutoConfiguration 这个自动配置类在 【spring-boot-jdbc-4.0.0.jar 中的 META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports】 中进行自动配置。


before 属性
含义 :当前自动配置类在指定类之前加载
java
@AutoConfiguration(before = {
TransactionAutoConfiguration.class
})
public class DataSourceTransactionManagerAutoConfiguration {
// 这个配置需要在 TransactionTemplate创建之前加载,
// 因为TransactionTemplate需要用到 DataSourceTransactionManager
}
2. @ConditionalOnClass
当指定的类存在于 类路径(Classpath) 中时,才创建被注解的Bean或配置类。主要用于 检查第三方库是否存在,以便决定是否启用相关功能。
示例
java
// 基本用法
@AutoConfiguration(before = TransactionAutoConfiguration.class,
after = { DataSourceAutoConfiguration.class, TransactionManagerCustomizationAutoConfiguration.class})
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class, TransactionManager.class}) // 确保在类路径(Classpath)中存在
public class DataSourceTransactionManagerAutoConfiguration {
// 当类路径中存在 DataSource ... 时加载
}
3. @ConditionalOnBean
当Spring容器中 已存在指定的Bean 时,才创建被注解的Bean。用于 Bean之间的依赖关系,确保某些Bean只有在其他Bean存在时才创建。
示例
java
// 基本用法:按类型检查
@Configuration
public class MyConfiguration {
@Bean
@ConditionalOnBean(DataSource.class)
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
// 只有当DataSource bean存在时才创建JdbcTemplate
return new JdbcTemplate(dataSource);
}
}
4. @ConditionalOnSingleCandidate
@ConditionalOnSingleCandidate 当容器中 存在且只有一个指定类型的 Bean 实例 ,或者 有多个同类型 Bean 但其中一个是 @Primary 标记的 时,条件成立。
示例
java
@AutoConfiguration(before = TransactionAutoConfiguration.class,
after = { DataSourceAutoConfiguration.class, TransactionManagerCustomizationAutoConfiguration.class })
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class, TransactionManager.class }) // 确保在类路径(Classpath)中存在
public final class DataSourceTransactionManagerAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnSingleCandidate(DataSource.class) // 只有当容器中只有一个DataSource(或有一个primary)时条件成立
static class JdbcTransactionManagerConfiguration {
// 省略...
}
}
5. @ConditionalOnMissingBean
当Spring容器中 不存在指定的Bean 时,才创建被注解的Bean。用于 提供默认Bean配置,允许用户自定义Bean来覆盖默认实现。
示例
java
// 基本用法:默认配置
@AutoConfiguration(before = TransactionAutoConfiguration.class,
after = { DataSourceAutoConfiguration.class, TransactionManagerCustomizationAutoConfiguration.class })
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class, TransactionManager.class }) // 确保在类路径(Classpath)中存在
public final class DataSourceTransactionManagerAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnSingleCandidate(DataSource.class) //
static class JdbcTransactionManagerConfiguration {
// 框架提供的默认事务管理器
@Bean
@ConditionalOnMissingBean(TransactionManager.class) // 允许用户自定义同名Bean来覆盖
DataSourceTransactionManager transactionManager(Environment environment, DataSource dataSource,
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
DataSourceTransactionManager transactionManager = createTransactionManager(environment, dataSource);
transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize(transactionManager));
return transactionManager;
}
}
}
6. @Import
将其他配置类 导入 到当前配置类中。
使用场景:模块化配置、组合多个配置类、条件导入。
示例
java
// 1. 基本用法:主配置类,导入其他配置类
// 备注:PooledDataSourceConfiguration 是在 DataSourceAutoConfiguration 类内部声明的类。
@Configuration
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) // 允许用户自定义同名Bean来覆盖
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.OracleUcp.class})
protected static class PooledDataSourceConfiguration {
// 省略这里面的内容
}
// 2. 被导入的配置类
@Configuration
@ConditionalOnClass(HikariDataSource.class) // 确保在类路径(Classpath)中存在
@ConditionalOnMissingBean(DataSource.class) // 允许用户覆盖
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
matchIfMissing = true)
static class Hikari {
@Bean
@ConfigurationProperties("spring.datasource.hikari")
HikariDataSource dataSource(DataSourceProperties properties) {
return new HikariDataSource();
}
}
总结
| 注解 | 作用 | 使用场景 | 示例 |
|---|---|---|---|
| @ConditionalOnClass | 检查类路径中是否存在指定类 | 第三方库依赖 | @ConditionalOnClass(RedisClient.class) |
| @ConditionalOnBean | 检查容器中是否存在指定Bean | Bean依赖关系 | @ConditionalOnBean(DataSource.class) |
| @ConditionalOnMissingBean | 检查容器中是否不存在指定Bean | 提供默认配置,允许覆盖 | @ConditionalOnMissingBean |
| @ConditionalOnSingleCandidate | 容器中只有一个该类型Bean,或有多个但有一个是@Primary | 在单实例或多实例但有主实例时创建 | |
| @Import | 导入其他配置类 | 模块化配置,组合配置 | @Import({ConfigA.class, ConfigB.class}) |