Spring Boot常见注解

Spring Boot常见注解

  • [1. @AutoConfiguration](#1. @AutoConfiguration)
    • [1.1 自动配置](#1.1 自动配置)
    • [1.2 `before` 和 `after` 属性详解](#1.2 beforeafter 属性详解)
  • [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.factoriesxxx.AutoConfiguration.imports 文件进行注册。

解释

  • @AutoConfiguration 自动标记该类为配置类,无需手动注册。
  • 配合 @ConditionalOnProperty 等条件注解,实现按需加载。

1.2 beforeafter 属性详解

@AutoConfiguration注解中的beforeafter属性是用于控制自动配置类加载顺序的重要属性。

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})
相关推荐
雨中飘荡的记忆33 分钟前
深度详解Spring Context
java·spring
Tao____37 分钟前
JAVA开源物联网平台
java·物联网·mqtt·开源·ruoyi
yqd6661 小时前
SpringSecurity的使用
java·spring
仙俊红1 小时前
Java Map 家族核心解析
java·开发语言
一嘴一个橘子2 小时前
springMvc 接收参数、cookie、header
java
code_li2 小时前
聊聊支付宝架构
java·开发语言·架构
CC.GG3 小时前
【Linux】进程概念(五)(虚拟地址空间----建立宏观认知)
java·linux·运维
以太浮标4 小时前
华为eNSP模拟器综合实验之- AC+AP无线网络调优与高密场景
java·服务器·华为
Mr__Miss4 小时前
JAVA面试-框架篇
java·spring·面试
小马爱打代码4 小时前
SpringBoot:封装 starter
java·spring boot·后端