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})
相关推荐
星辰烈龙2 小时前
黑马程序员Java基础8
java·开发语言
毕设源码-郭学长2 小时前
【开题答辩全过程】以 公司考勤系统为例,包含答辩的问题和答案
java
SimonKing2 小时前
镜像拉不下来怎么办?境内Docker镜像状态在线监控来了
java·后端·程序员
a程序小傲2 小时前
华为Java面试被问:SQL执行顺序
java·后端·sql·华为·面试
码上成长2 小时前
长耗时接口异步改造总结
前端·git·后端
中文很快乐2 小时前
java后端好习惯---新手养成记
java·开发语言·开发好习惯·踩坑日志·新手养成
Acc1oFl4g2 小时前
Java安全之SpEL表达式注入入门学习
java·学习·安全
风华同学2 小时前
【系统移植篇】系统烧写
java·开发语言·前端
武哥聊编程2 小时前
【从0带做】基于Springboot3+Vue3的生态养殖管理系统
java·学习·vue·毕业设计·springboot