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})
相关推荐
东风破_3 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
微尘寒风3 小时前
【Git】的安装和使用
java·git
东风破_3 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
y = xⁿ4 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
东风破_4 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
侧耳倾听1114 小时前
jwt使用简介
java·jwt
顶点多余5 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手5 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神5 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_962066496 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库