JAVA面试|spring boot常用注解(springboot有什么注解)
liuian 2025-07-27 21:58 5 浏览
Spring Boot的核心就是通过注解简化配置,让开发者更专注于业务逻辑。下面是一些最常用、最核心的注解,用通俗的方式解释它们的作用和典型使用场景:
一、核心启动与配置
1. @SpringBootApplication
作用:超级核心注解!标记在Spring Boot应用的主类(包含main方法的类)上。它是三个关键注解的组合:
@SpringBootConfiguration:表明这个类是一个Spring Boot的配置类(基于@Configuration)。
@EnableAutoConfiguration:开启Spring Boot的魔法-自动配置!根据你引入的jar包依赖(如spring-boot-starter-web,
spring-boot-starter-data-jpa),Spring Boot会自动配置应用所需的基础组件(如Web服务器、数据库连接池等)。
@ComponentScan:启动组件扫描。告诉Spring从当前类所在的包及其子包下扫描带有@Component,@Service,@Repository, @Controller, @RestController等注解的类,并自动将它们注册为 Spring容器管理的Bean。
场景:每个Spring Boot应用都必须有一个类标注它,这是应用的入口点。例如:
@SpringBootApplication
public class MyAwesomeApplication {
public static void main(String[] args) {
SpringApplication.run(
MyAwesomeApplication.class, args); // 启动应用
}
}
二、定义Bean(组件)
这些注解告诉Spring:“请管理这个类的实例(Bean),并在需要的地方自动注入它们。”
1. @Component
作用:通用组件标记。标注一个类,表示它是一个Spring管理的组件(Bean)。Spring在扫描时会创建它的实例放入容器。
场景:适用于那些不属于Controller、Service、Repository层,但又需要被Spring管理的工具类、辅助类、自定义组件等。例如:一个通用的邮件发送工具类EmailSender。
2. @Service
作用:标记业务逻辑层(Service层)的组件。本质上它也是 @Component的一种特化,语义上更清晰,表明这个类包含业务逻辑。
场景:定义处理核心业务规则的Service类。例如:UserService(处理用户注册、登录、查询等业务)、OrderService(处理订单创建、支付、查询等业务)。
3. @Repository
作用:标记数据访问层(DAO层)的组件。本质上也是@Component 的特化。它有一个额外的好处:它会自动将数据访问层抛出的特定异常(如JDBC的SQLException)转换为Spring统一的数据访问异常(DataAccessException),使异常处理更一致。
场景:定义访问数据库的DAO接口实现类。通常与JPA、MyBatis 等ORM框架结合使用。例如:UserRepository(定义用户数据的增删改查操作)、ProductRepository。
4. @Controller
作用:标记Web层的控制器组件(传统MVC)。处理 HTTP请求,协调模型(Model)和视图(View)。通常需要配合@RequestMapping 等注解使用。返回的结果通常是一个视图名(如JSP、Thymeleaf模板名),由视图解析器解析渲染。
场景:在需要返回HTML页面(服务器端渲染)的Web应用中定义控制器。例如:处理页面跳转、表单提交的控制器。
5. @RestController
作用:@Controller +@ResponseBody的组合体!专门用于构建 RESTful Web服务。标注的类下的所有方法默认会将返回值直接序列化成JSON/XML写入HTTP响应体,而不是解析为视图名。
场景:现代前后端分离应用的主流控制器注解。定义提供API接口的控制器。例如:提供用户管理、订单管理等API的 UserController, OrderController。
6. @Configuration
作用:标记一个类为配置类。这个类的作用类似于传统的XML配置文件(如applicationContext.xml)。在这个类内部,你可以使用@Bean注解来显式地定义和配置Spring Bean。
场景:
需要手动配置一些第三方库的Bean(Spring Boot自动配置不满足需求时)。
定义一些复杂的Bean,需要编写初始化代码。
替代XML配置文件。例如:
@Configuration
public class MyAppConfig {
@Bean // 告诉Spring这个方法的返回值是一个需要管理的Bean
public MySpecialService mySpecialService() {
return new MySpecialServiceImpl(someDependency()); // 可以在这里进行复杂的构造或配置
}
}
7. @Bean
作用:用在@Configuration类的方法上。告诉Spring:这个方法返回的对象应该被注册为Spring应用上下文中的一个Bean。方法名通常作为Bean的名称。
场景:当你想显式地、编程式地创建和配置一个Bean实例时使用。常用于配置数据源(DataSource)、事务管理器 (
PlatformTransactionManager)、第三方库的组件等。例如在配置类中配置一个RestTemplate Bean:
@Configuration
public class RestConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
三、依赖注入
这些注解告诉Spring:“请在这个地方自动给我一个合适类型的Bean实例。”
1. @Autowired
作用:自动装配(注入)依赖。Spring会自动在容器中查找匹配类型(或名称)的Bean,并将其注入到标注了@Autowired的位置(构造器、字段、Setter方法、普通方法)。
场景:非常非常常用! 当你的Bean(如Service)需要依赖另一个 Bean(如Repository)时使用。例如:
@Service
public class UserService {
private final UserRepository userRepository; // 依赖
@Autowired // 构造器注入 (推荐方式)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 或者字段注入 (不推荐,容易导致循环依赖等问题)
// @Autowired
// private UserRepository userRepository;
// 或者Setter方法注入
// @Autowired
// public void setUserRepository(UserRepository userRepository) {
// this.userRepository = userRepository;
// }
}
注意:Spring 4.3以后,如果类只有一个构造器,@Autowired可以省略。
2. @Qualifier
作用:配合@Autowired使用,解决自动装配时的歧义性。当容器中存在多个相同类型的Bean时,用@Qualifier指定要注入的Bean 的具体名称。
场景:定义了多个同类型Bean时。例如有两个DataSource Bean,一个用于主库 (@Primary),一个用于从库。在需要注入从库的地方:
@Autowired
@Qualifier("secondaryDataSource") // 指定Bean的名称
private DataSource dataSource;
3. @Primary
作用:标记一个Bean为首选Bean。当存在多个相同类型的Bean 且没有明确指定@Qualifier时,Spring会优先注入带有@Primary注解的那个。
场景:定义了多个同类型Bean,但希望其中一个作为默认注入项时。例如,配置主数据源:
@Configuration
public class DataSourceConfig {
@Bean
@Primary // 标记为主数据源
public DataSource primaryDataSource() { ... }
@Bean
public DataSource secondaryDataSource() { ... }
}
4. @Value
作用:注入属性值。主要用于注入外部配置文件(如
application.properties/application.yml)中定义的属性值,也可以注入简单的字面量(字符串、数字等)或SpEL表达式。
场景:
读取配置文件中的配置项(数据库连接、服务端口、开关标志等)。
注入简单的常量。
例如:
@Service
public class MyService {
@Value("${app.page.size}") // 注入配置文件中的 app.page.size 属性
private int pageSize;
@Value("Hello World") // 直接注入字符串
private String greeting;
@Value("#{systemProperties['user.home']}") // 使用SpEL注入系统属性
private String userHome;
}
在application.properties中:app.page.size=20
四、Web开发(Controller层)
1. @RequestMapping
作用:映射HTTP请求到控制器方法。可以定义在类上(表示类中所有方法的公共路径前缀)或方法上(指定具体的URL路径、HTTP 方法等)。它是其他更具体注解(如@GetMapping, @PostMapping)的基础。
场景:定义API或页面的访问路径和处理逻辑。例如:
@RestController
@RequestMapping("/api/users") // 类级别的路径前缀
public class UserController {
@RequestMapping(method = RequestMethod.GET) // 老式写法,等同于 @GetMapping
public List<User> getAllUsers() { ... }
@RequestMapping(value = "/{id}", method = RequestMethod.GET) // 老式写法,等同于 @GetMapping("/{id}")
public User getUserById(@PathVariable Long id) { ... }
}
2. @GetMapping,@PostMapping,@PutMapping, @DeleteMapping, @PatchMapping
作用:@RequestMapping的快捷特化注解。分别对应HTTP的GET, POST,PUT, DELETE, PATCH方法。它们内部已经指定了method属性,使代码更简洁清晰。
场景:现代RESTful控制器方法的标准写法。明确指定方法处理的HTTP动作。例如:
@RestController
@RequestMapping("/api/products")
public class ProductController {
@GetMapping // 等同于 @RequestMapping(method=GET)
public List<Product> listProducts() { ... }
@PostMapping // 等同于 @RequestMapping(method=POST)
public Product createProduct(@RequestBody Product product) { ... }
@GetMapping("/{id}") // GET /api/products/123
public Product getProduct(@PathVariable Long id) { ... }
@PutMapping("/{id}") // PUT /api/products/123
public Product updateProduct(@PathVariable Long id, @RequestBody Product product) { ... }
@DeleteMapping("/{id}") // DELETE /api/products/123
public void deleteProduct(@PathVariable Long id) { ... }
}
3. @PathVariable
作用:将URL路径模板中的变量绑定到方法参数。
场景:处理RESTful风格的URL,其中包含动态ID或其他标识符。例如上面getProduct(@PathVariable Long id)中的id就是从 URL /products/{id}中提取的。
4. @RequestParam
作用:将HTTP请求参数(通常是查询字符串?key=value&key2=value2)绑定到方法参数。可以指定参数名称(如果与变量名不同)、是否必需、默认值。
场景:获取URL查询参数或表单提交(
application/x-www-form-urlencoded)的参数。例如:
@GetMapping("/search")
public List<Product> searchProducts(
@RequestParam String keyword, // 必需参数
@RequestParam(value = "page", defaultValue = "1") int page, // 可选参数,默认值1
@RequestParam(value = "size", required = false, defaultValue = "10") Integer size) { // 可选参数,默认值10
...
}
5. @RequestBody
作用:将HTTP请求体(通常是JSON或XML)绑定到方法参数对象。 Spring会根据请求的Content-Type头(如application/json)使用合适的消息转换器(如Jackson)进行反序列化。
场景:接收前端通过POST/PUT/PATCH请求发送的JSON/XML数据。 例如创建或更新资源时:
@PostMapping
public User createUser(@RequestBody User newUser) { // 将请求体JSON自动转换为User对象
return userService.save(newUser);
}
6. @ResponseBody
作用:将控制器方法的返回值直接写入HTTP响应体(而不是视图)。 通常由合适的消息转换器(如Jackson)序列化成JSON/XML。
场景:在@Controller注解的类中,某个方法需要返回数据(如 AJAX请求响应)而不是视图名时使用。注意:@RestController已经包含了@ResponseBody语义,所以其下的所有方法都默认有该行为,无需再单独标注。
7. @RestControllerAdvice/@ControllerAdvice
作用:定义全局的、应用于多个控制器的增强处理(如异常处理、数据绑定增强、模型属性增强)。@RestControllerAdvice是 @ControllerAdvice + @ResponseBody的组合,专用 RESTful服务,其内部方法返回值会直接写入响应体。
场景:统一异常处理(最重要、最常用)。集中处理整个应用中控制器抛出的异常,返回结构化的错误信息(JSON)。例如:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(
ResourceNotFoundException.class) // 处理特定异常
@ResponseStatus(HttpStatus.NOT_FOUND) // 设置响应状态码
public ErrorResponse handleResourceNotFound(ResourceNotFoundException ex) {
return new ErrorResponse("NOT_FOUND", ex.getMessage());
}
@ExceptionHandler(Exception.class) // 处理所有其他异常
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse handleGeneralException(Exception ex) {
return new ErrorResponse("INTERNAL_ERROR", "An unexpected error occurred");
}
}
五、配置与属性
1. @ConfigurationProperties
作用:将一组相关的配置属性(通常来自
application.properties/.yml)绑定到一个类型安全的Java Bean 上。 支持嵌套属性、验证等。
场景:管理复杂的外部配置。 避免在代码中到处使用@Value注入大量单个属性。例如配置数据库连接池、邮件服务器参数、第三方服务密钥等。需要结合@
EnableConfigurationProperties或在配置类上用@Bean注册。
定义配置类:
@ConfigurationProperties(prefix = "app.mail") // 绑定所有以 app.mail 开头的属性
@Data // Lombok 注解,生成getter/setter等
public class MailProperties {
private String host;
private int port;
private String username;
private String password;
private boolean sslEnabled = true; // 默认值
}
application.properties:
app.mail.host=smtp.example.com
app.mail.port=587
app.mail.username=admin@example.com
app.mail.password=secret
# app.mail.sslEnabled 没配置,使用默认值 true
启用并注入:
@Configuration
@
EnableConfigurationProperties(MailProperties.class) // 启用这个配置属性类
public class AppConfig {
// 也可以在其他地方 @Autowired MailProperties mailProperties;
}
2. @PropertySource
作用:指定自定义的属性文件(非默认的
application.properties/.yml)的位置,将其加载到Spring的 Environment中。
场景:将配置拆分到多个文件中,或者加载特定环境、模块的配置。例如:
@Configuration
@PropertySource("
classpath:config/database.properties") // 加载类路径下的 database.properties
@PropertySource("
file:/etc/myapp/secrets.properties") // 加载文件系统上的配置文件
public class DatabaseConfig {
// 可以使用 @Value 或 @ConfigurationProperties 读取这些文件中的属性
}
六、数据访问与事务
1. @Transactional
作用:声明式事务管理。标注在类或方法上,表示该方法/类中的所有public方法需要在事务上下文中执行。Spring会自动管理事务的开启、提交、回滚(通常在Service层方法上使用)。
场景:确保数据库操作的原子性。当一组数据库操作需要作为一个整体(要么全部成功,要么全部失败)时使用。例如转账操作:扣钱和加钱必须在同一个事务中。
七、条件化配置 (理解自动配置原理)
1. @ConditionalOn...系列(如@ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty)
作用:Spring Boot自动配置的基石!这些是条件注解。它们标注在配置类或@Bean方法上,只有当满足特定条件(如某个类在 classpath中存在、容器中不存在某个Bean、某个属性有特定值)时,才会生效对应的配置或创建对应的Bean。
场景:理解自动配置如何按需工作。例如,spring-boot-autoconfigure中的配置类大量使用它们:
@ConditionalOnClass(DataSource.class):只有当 DataSource 类在classpath 中(即你引入了JDBC或数据库驱动相关的starter)时,自动配置数据库相关的Bean才生效。
@ConditionalOnMissingBean(DataSource.class): 只有当容器中还没有DataSource类型的Bean时(即你自己没有手动配置),Spring Boot才会自动配置一个默认的数据源。
@ConditionalOnProperty(name = "app.feature.enabled", havingValue = "true"):只有当配置文件中有 app.feature.enabled=true 时,这个配置/Bean才生效。
八、总结
这些注解构成了Spring Boot开发的基础。掌握它们,你就能:
启动应用 (@SpringBootApplication)
定义组件 (@Component, @Service, @Repository, @Controller, @RestController, @Configuration, @Bean)
注入依赖 (@Autowired, @Qualifier, @Primary, @Value)
处理Web请求(@RequestMapping, @GetMapping等, @PathVariable, @RequestParam, @RequestBody, @ResponseBody, @RestControllerAdvice)
管理配置 (@ConfigurationProperties, @PropertySource)
控制事务 (@Transactional)
理解自动配置 (@ConditionalOn...)
记住,Spring Boot的哲学是“约定优于配置”。这些注解大部分都有合理的默认行为,让你用最少的配置完成大部分工作。随着深入,你会接触到更多特定场景的注解(如Spring Data JPA的@Entity, @Repository;Spring Security 的@EnableWebSecurity, @PreAuthorize 等),但上面列出的这些是构建Spring Boot应用的通用基石。
相关推荐
- 快速上手maven
-
Maven的作用在开发过程中需要用到各种各样的jar包,查找和下载这些jar包是件费时费力的事,特别是英文官方网站,可以将Maven看成一个整合了所有开源jar包的合集,我们需要jar包只需要从Mav...
- Windows系统——配置java环境变量
-
怎么配置java环境变量呢?首先是安装好jdk然后我的电脑右键选择属性然后选择左侧高级系统设置高级然后点环境变量然后在用户变量或系统变量中配置,用户变量指的是只有当前用户可用,系统变量指的是系统中...
- ollama本地部署更改默认C盘,Windows配置环境变量方法
-
ollama是一个大语言模型(LLM——LargeLanguageModel),本地电脑安装网上也要很多教程,看上去非常简单,一直下一步,然后直接就可以使用了。但是我在实操的时候并不是这样,安装完...
- # Windows 环境变量 Path 显示样式更改
-
#怎样学习Java##Windows环境变量Path显示样式更改##1、传统Path环境变量显示:```---》键盘上按【WIN+I】打开系统【设置】---》依次点击---》【系统...
- 如何在Windows中创建用户和系统环境变量
-
在Windows中创建环境变量之前您应该了解的事情在按照本指南中所示的任何步骤创建指向文件夹、文件或其他任何内容的用户和系统变量之前,您应该了解两件事。第一个也是最重要的一个是了解什么是环境变量。...
- Windows 中的环境变量是什么?
-
Windows中的环境变量是什么?那么,Windows中的环境变量是什么?简而言之,环境变量是描述应用程序和程序运行环境的变量。所有类型的程序都使用环境变量来回答以下问题:我安装的计算机的名称是什么...
- 【Python程序开发系列】谈一谈Windows环境变量:系统和用户变量
-
这是我的第350篇原创文章。一、引言环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操作...
- 系统小技巧:还原Windows10路径环境变量
-
有时,我们在Windows10的“运行”窗口中执行一些命令或运行一些程序,这时即便没有指定程序的具体路径,只输入程序的名称(如notepad.exe),便可以迅速调用成功。这是因为Windows默认...
- Windows10系统的“环境变量”在哪里呢?
-
当我们在操作系统是Windows10的电脑里安装了一些软件,要通过配置环境变量才能使用软件时,在哪里能找到“环境变量”窗口呢?可以按照下面的步骤找到“环境变量”。说明:下面的步骤和截图是在Window...
- 系统小技巧:彻底弄懂Windows 10环境变量
-
每当我们进行系统清理时,清理软件总能自动找到Windows的临时文件夹之所在,然后加以清理,即便是我们重定向了TEMP目录也是如此。究其原因,是因为清理软件会根据TEMP环境变量来判断现有临时文件夹的...
- MySQL 5.7 新特性大全和未来展望
-
本文转自微信公众号:高可用架构作者:杨尚刚引用美图公司数据库高级DBA,负责美图后端数据存储平台建设和架构设计。前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存...
- MySQL系列-源码编译安装(v8.0.25)
-
一、前言生产环境建议使用二进制安装法,其优点是部署简单、快速、方便,并且相对"yum/rpm安装"方法能更方便地自定义文件存放的目录结构,方便用脚本批量部署,方便日后运维管理。在生产...
- MySQL如何实时同步数据到ES?试试这款阿里开源的神器!
-
前几天在网上冲浪的时候发现了一个比较成熟的开源中间件——Canal。在了解了它的工作原理和使用场景后,顿时产生了浓厚的兴趣。今天,就让我们跟随我的脚步,一起来揭开它神秘的面纱吧。简介canal翻译为...
- 技术老兵十年专攻MySQL:编写了763页核心总结,90%MySQL问题全解
-
MySQL是开放源码的关系数据库管理系统,由于性能高、成本低、可靠性好,成为现在最流行的开源数据库。MySQL学习指南笔记领取方式:关注、转发后私信小编【111】即可免费获得《MySQL进阶笔记》的...
- Mysql和Hive之间通过Sqoop进行数据同步
-
文章回顾理论大数据框架原理简介大数据发展历程及技术选型实践搭建大数据运行环境之一搭建大数据运行环境之二本地MAC环境配置CPU数和内存大小查看CPU数sysctl machdep.cpu...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
飞牛OS入门安装遇到问题,如何解决?
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)