网站Logo Ilren 小记

Spring Boot 常用注解详解

jack
10
2021-05-07

引言

Spring Boot 作为当今 Java 领域最流行的框架之一,其强大的自动配置和约定优于配置的理念极大地简化了 Spring 应用的开发。注解(Annotation)作为 Spring Boot 的核心特性之一,为开发者提供了声明式编程的能力。本文将全面介绍 Spring Boot 开发中最常用的注解,帮助您快速掌握 Spring Boot 开发的精髓。

详细解析

一、启动类注解

Spring Boot 应用的入口类需要通过注解声明启动逻辑。

注解

作用

@SpringBootApplication

启动类核心注解,是以下三个注解的组合:
-@SpringBootConfiguration:声明当前类是配置类(等价于@Configuration);
-@EnableAutoConfiguration:开启自动配置(关键功能,让 Spring Boot 自动加载符合条件的 Bean);
-@ComponentScan:扫描当前包及子包下的@Component及其衍生注解(如@Service)标记的类,注册为 Bean。

二、依赖注入(IOC)注解

Spring 的核心是 IOC(控制反转),以下注解用于声明 Bean注入 Bean

1. 声明 Bean 的注解(标记类/方法为可被 IOC 管理的组件)

注解

作用

@Component

通用组件标记(所有被 IOC 管理的类的基础注解)。

@Service

标记业务层(Service 层)组件(等价于@Component,语义更明确)。

@Controller

标记 Web 控制器组件(等价于@Component,语义更明确)。

@Repository

标记数据访问层(DAO 层)组件(等价于@Component,语义更明确,Spring 会自动处理数据访问异常)。

@Configuration

标记配置类(通常用于声明@Bean方法),等价于传统 Spring 的 XML 配置文件。

@Bean

声明一个 Bean(标注在方法上,方法返回值会被注册到 IOC 容器)。

2. 注入 Bean 的注解(从 IOC 容器中获取 Bean)

注解

作用

@Autowired

Spring 原生注入注解(默认按类型注入,可配合@Qualifier按名称指定)。

@Resource

JSR-250 标准注解(默认按名称注入,无名称时按类型注入,来自javax.annotation)。

@Qualifier

配合@Autowired使用,指定注入的 Bean 名称(解决同类型多 Bean 的歧义问题)。

@Primary

标记同类型 Bean 中的“主选” Bean(当@Autowired遇到多 Bean 时优先选择它)。

@Lazy

标记 Bean 为延迟加载(默认 IOC 启动时创建 Bean,@Lazy会在首次使用时创建)。

@Scope

指定 Bean 的作用域(如singleton(默认单例)、prototype(多例)、request(HTTP 请求作用域)等)。

三、配置管理注解

Spring Boot 通过application.properties/application.yml管理配置,以下注解用于读取或绑定配置。

注解

作用

@Value

读取单个配置属性(支持 SpEL 表达式),如@Value("${server.port}")。

@ConfigurationProperties

批量绑定配置到 Java 对象(适用于复杂配置,如prefix="spring.datasource"绑定一组属性)。

@PropertySource

加载自定义配置文件(默认加载application.properties,可用此注解加载其他文件,如@PropertySource("classpath:my-config.properties"))。

@EnableConfigurationProperties

启用@ConfigurationProperties标记的类(通常配合@Configuration使用)。

四、Web 开发注解

Spring Boot 内置 Spring MVC,以下注解用于处理 HTTP 请求、响应和参数。

1. 控制器与请求映射

注解

作用

@RestController

RESTful 控制器(等价于@Controller + @ResponseBody,返回数据直接序列化为 JSON/XML)。

@Controller

传统 MVC 控制器(需配合@ResponseBody返回数据,或返回视图)。

@RequestMapping

通用请求映射(可标记类或方法,指定 URL 路径、请求方法等,如@RequestMapping("/user"))。

@GetMapping

@RequestMapping(method = RequestMethod.GET)的简写(处理 GET 请求)。

@PostMapping

处理 POST 请求(类似@GetMapping)。

@PutMapping

处理 PUT 请求。

@DeleteMapping

处理 DELETE 请求。

2. 请求参数与响应

注解

作用

@RequestBody

将请求体(如 JSON)反序列化为 Java 对象(用于 POST/PUT 等带请求体的请求)。

@RequestParam

读取 URL 中的查询参数(如@RequestParam("username") String name)。

@PathVariable

读取 URL 路径中的占位符(如@GetMapping("/user/{id}")配合@PathVariable("id") Long userId)。

@ResponseBody

将返回值序列化为 JSON/XML(通常配合@Controller使用,@RestController已内置此注解)。

@ResponseStatus

设置响应状态码(如@ResponseStatus(HttpStatus.CREATED)返回 201 状态码)。

@CrossOrigin

解决跨域问题(标记类或方法,指定允许的源、方法等)。

五、条件装配注解(自动配置核心)

Spring Boot 的自动配置依赖条件装配,以下注解用于控制 Bean 是否被加载。

注解

作用

@Conditional

通用条件装配(需自定义Condition接口实现,很少直接使用)。

@ConditionalOnClass

当类路径中存在指定类时,才加载当前 Bean(如@ConditionalOnClass(DataSource.class))。

@ConditionalOnMissingClass

当类路径中不存在指定类时,才加载当前 Bean。

@ConditionalOnBean

当 IOC 容器中存在指定 Bean 时,才加载当前 Bean。

@ConditionalOnMissingBean

当 IOC 容器中不存在指定 Bean 时,才加载当前 Bean(用于提供默认实现)。

@ConditionalOnProperty

当配置文件中存在指定属性且值符合条件时,才加载当前 Bean(如@ConditionalOnProperty(prefix="redis", name="enable", havingValue="true"))。

@ConditionalOnResource

当类路径中存在指定资源(如文件)时,才加载当前 Bean。

六、功能启用注解(@Enable 系列)

以下注解用于开启 Spring Boot 的扩展功能。

注解

作用

@EnableAutoConfiguration

开启自动配置(@SpringBootApplication已包含此注解)。

@EnableScheduling

开启任务调度(支持@Scheduled注解)。

@EnableAsync

开启异步方法支持(配合@Async使用)。

@EnableCaching

开启缓存支持(配合@Cacheable、@CachePut等注解)。

@EnableTransactionManagement

开启声明式事务支持(配合@Transactional使用)。

@EnableFeignClients

开启 Feign 客户端(用于微服务远程调用)。

七、其他常用注解

注解

作用

@Transactional

声明事务(标记方法或类,支持事务隔离级别、传播行为等配置)。

@Valid/@Validated

开启参数校验(配合javax.validation约束注解,如@NotBlank、@Max)。

@Profile

标记 Bean 仅在指定环境(如dev、prod)中生效(通过spring.profiles.active配置)。

@Import

手动导入其他配置类或 Bean(类似 XML 中的<import>)。

@Aspect

标记 AOP 切面类(配合@Pointcut、@Before等实现切面编程)。

动物装饰