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})
相关推荐
皮皮林5512 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河2 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
JavaGuide5 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
桦说编程5 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
格砸6 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
蝎子莱莱爱打怪7 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
躺平大鹅7 小时前
Java面向对象入门(类与对象,新手秒懂)
java
哈密瓜的眉毛美7 小时前
零基础学Java|第三篇:DOS 命令、转义字符、注释与代码规范
后端
用户60572374873087 小时前
AI 编码助手的规范驱动开发 - OpenSpec 初探
前端·后端·程序员