JAVA面试|spring boot常用注解(springboot有什么注解)
liuian 2025-07-27 21:58 29 浏览
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应用的通用基石。
相关推荐
- 搭建一个20人的办公网络(适用于20多人的小型办公网络环境)
-
楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...
- 笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)
-
1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...
- 汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)
-
使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...
- xpsp3安装版系统下载(windowsxpsp3安装教程)
-
xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...
- 没有备份的手机数据怎么恢复
-
手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。 2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。 3、...
- 电脑怎么激活windows11专业版
-
win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...
- 华为手机助手下载官网(华为手机助手app下载专区)
-
华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...
- 光纤线断了怎么接(宽带光纤线断了怎么接)
-
宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...
- win7旗舰版和专业版区别(win7旗舰版跟专业版)
-
1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...
- 万能连接钥匙(万能wifi连接钥匙下载)
-
1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...
- 雨林木风音乐叫什么(雨林木风是啥)
-
雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...
- aics6序列号永久序列号(aics6破解序列号)
-
关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...
- 手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)
-
答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...
- 一周热门
- 最近发表
- 标签列表
-
- 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)
