Spring Spring Boot 常用注解整理
Spring & Spring Boot 常用注解整理
- 先理解核心概念:什么是注解(Annotation)?
- 第一部分:IOC(控制反转)和 DI(依赖注入)
- 1. @Component
- 2. @Service, @Repository, @Controller
- 3. @Autowired
- 4. @Qualifier
- 第二部分:Spring MVC(处理 HTTP 请求)
- 1. @RestController vs @Controller
- 2. @GetMapping / @PostMapping
- 3. @PathVariable 和 @RequestParam
- 第三部分:配置相关注解
- 1. @Configuration 和 @Bean
- 2. @Value
- 第四部分:Spring Boot 核心注解
- @SpringBootApplication
- 第五部分:数据库和事务
- 1. @Entity 和 @Id
- 2. @Transactional
- 第六部分:AOP(面向切面编程)
- 1. @Aspect 和 @Before
- 总结:注解的核心作用
先理解核心概念:什么是注解(Annotation)?
类比:注解就像代码里的“便利贴”,用来告诉 Spring 框架:“这个类/方法/变量有什么特殊用途”。
作用:简化配置,让框架自动帮你处理一些事情(比如创建对象、管理依赖、处理请求等)。
第一部分:IOC(控制反转)和 DI(依赖注入)
核心思想:把对象的创建和管理交给 Spring 容器,而不是自己手动 new
对象。
注解 | 说明 | 示例 |
---|---|---|
@Component | 通用组件标记,被扫描的类会纳入 Spring 容器管理 | @Component public class MyComponent { ... } |
@Service | 标记服务层组件,属于@Component 的特化形式 | @Service public class UserService { ... } |
@Repository | 标记数据访问层组件(DAO层),具有数据库异常转译功能 | @Repository public class UserDao { ... } |
@Controller | 标记控制器组件(Web层) | @Controller public class UserController { ... } |
@Autowired | 自动注入依赖,默认按类型匹配 | @Autowired private UserService userService; |
@Qualifier | 按名称指定注入的 Bean | @Autowired @Qualifier("userServiceImplA") private UserService service; |
@Primary | 标记首选的 Bean(存在多个同类型 Bean 时优先注入) | @Bean @Primary public DataSource primaryDataSource() { ... } |
@Scope | 定义 Bean 的作用域(singleton/prototype等) | @Component @Scope("prototype") public class MyPrototypeBean { ... } |
1. @Component
作用:告诉 Spring:“这个类交给你管理,我需要的时候找你要实例”。
代码示例:
@Component // 贴上这个标签,Spring 就会自动创建 MyComponent 的实例(Bean)
public class MyComponent {public void hello() {System.out.println("Hello from MyComponent!");}
}
使用场景:通用的工具类、第三方库的适配类等。
2. @Service, @Repository, @Controller
本质:它们都是 @Component
的“马甲”,用途相同,只是名字不同,为了代码可读性。
@Service
:标记业务逻辑层(如处理用户注册、订单支付)。@Repository
:标记数据访问层(如操作数据库)。@Controller
:标记 Web 控制器(处理 HTTP 请求)。
代码对比:
@Service
public class UserService { // 业务逻辑层public void registerUser(String name) { ... }
}@Repository
public class UserDao { // 数据访问层public User findUserById(Long id) { ... }
}@Controller
public class UserController { // 处理 HTTP 请求@GetMapping("/users")public String listUsers() { ... }
}
3. @Autowired
作用:让 Spring 自动帮你“注入”依赖的 Bean(类似找人借东西,不用自己造)。
代码示例:
@Service
public class UserService {@Autowired // Spring 会自动找一个 UserDao 的 Bean 注入到这里private UserDao userDao;public User findUser(Long id) {return userDao.findUserById(id); // 直接使用 userDao,不需要 new UserDao()}
}
原理:Spring 会在容器中查找匹配类型的 Bean,自动赋值给 userDao
。
4. @Qualifier
问题场景:如果有多个同类型的 Bean,Spring 不知道注入哪一个。
解决:用 @Qualifier
指定 Bean 的名字。
代码示例:
// 定义两个数据源
@Component("mysqlDataSource")
public class MySQLDataSource implements DataSource { ... }@Component("postgresDataSource")
public class PostgresDataSource implements DataSource { ... }// 使用时指定名称
@Service
public class DataService {@Autowired@Qualifier("mysqlDataSource") // 明确告诉 Spring 注入名为 "mysqlDataSource" 的 Beanprivate DataSource dataSource;
}
第二部分:Spring MVC(处理 HTTP 请求)
注解 | 说明 | 示例 |
---|---|---|
@RestController | 组合注解(@Controller + @ResponseBody ),用于 REST API | @RestController public class ApiController { ... } |
@RequestMapping | 映射 HTTP 请求路径,可指定 method | @RequestMapping(value="/users", method=RequestMethod.GET) |
@GetMapping | 简化 GET 请求映射(同理有@PostMapping 、@PutMapping 等) | @GetMapping("/{id}") public User getUser(@PathVariable Long id) |
@PathVariable | 绑定 URL 路径中的变量 | @GetMapping("/users/{id}") public User getById(@PathVariable Long id) |
@RequestParam | 绑定请求参数(支持默认值、是否必传等) | @GetMapping("/search") public List<User> search(@RequestParam(defaultValue = "") String keyword) |
@RequestBody | 将请求体内容反序列化为 Java 对象(如 JSON) | @PostMapping public User create(@RequestBody User user) { ... } |
@ResponseBody | 将方法返回值序列化为响应体(如 JSON) | 已内置在@RestController 中 |
@ExceptionHandler | 处理控制器内的特定异常 | @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleException() { ... } |
@CrossOrigin | 允许跨域请求 | @CrossOrigin(origins = "http://example.com") |
1. @RestController vs @Controller
@Controller
:传统 MVC 控制器,返回视图(如 JSP 页面)。@RestController
:专门用于 REST API,直接返回 JSON 数据(内部包含@ResponseBody
)。
代码对比:
// 传统 Controller(返回视图名,由模板引擎渲染)
@Controller
public class OldController {@GetMapping("/hello")public String hello() {return "hello-page"; // 对应 src/main/resources/templates/hello-page.html}
}// REST Controller(返回 JSON)
@RestController
public class ApiController {@GetMapping("/user")public User getUser() {return new User(1, "Alice"); // 自动转换为 JSON:{ "id": 1, "name": "Alice" }}
}
2. @GetMapping / @PostMapping
作用:简化 HTTP 请求映射,替代 @RequestMapping(method=RequestMethod.GET)
。
代码示例:
@RestController
public class UserController {// 处理 GET 请求:http://localhost:8080/users@GetMapping("/users")public List<User> listUsers() {return userService.getAllUsers();}// 处理 POST 请求:http://localhost:8080/users@PostMapping("/users")public User createUser(@RequestBody User user) { // @RequestBody 表示接收 JSON 数据return userService.saveUser(user);}
}
3. @PathVariable 和 @RequestParam
@PathVariable
:从 URL 路径中获取变量(如/users/123
中的123
)。@RequestParam
:从 URL 参数中获取值(如/search?keyword=java
中的keyword
)。
代码示例:
@GetMapping("/users/{id}") // URL 模板:{id} 是占位符
public User getUserById(@PathVariable Long id) { // 获取路径中的 idreturn userService.findById(id);
}@GetMapping("/search")
public List<User> searchUsers(@RequestParam String keyword) { // 获取参数 ?keyword=xxxreturn userService.search(keyword);
}
第三部分:配置相关注解
注解 | 说明 | 示例 |
---|---|---|
@Configuration | 标记类为配置类(替代 XML 配置文件) | @Configuration public class AppConfig { ... } |
@Bean | 声明方法返回的对象作为 Bean 加入容器 | @Bean public DataSource dataSource() { return new HikariDataSource(); } |
@Value | 注入配置文件中的值 | @Value("${db.url}") private String dbUrl; |
@PropertySource | 加载指定 properties 文件 | @Configuration @PropertySource("classpath:custom.properties") |
@ConfigurationProperties | 批量绑定配置文件属性到对象(需配合@EnableConfigurationProperties ) | @Component @ConfigurationProperties(prefix="app") public class AppConfig { private String name; ... } |
@Profile | 指定 Bean 生效的环境 | @Bean @Profile("dev") public DataSource devDataSource() { ... } |
1. @Configuration 和 @Bean
作用:替代 XML 配置文件,手动定义 Bean。
代码示例:
@Configuration // 告诉 Spring:“这是一个配置类”
public class AppConfig {@Bean // 这个方法返回的对象会被 Spring 管理public DataSource dataSource() {return new HikariDataSource(); // 手动创建一个数据源}
}
2. @Value
作用:从配置文件(如 application.properties
)中读取值。
示例:
# application.properties
app.name=My Awesome App
database.url=jdbc:mysql://localhost:3306/mydb
@Component
public class AppConfig {@Value("${app.name}") // 注入 app.name 的值private String appName;@Value("${database.url}") // 注入数据库 URLprivate String dbUrl;
}
第四部分:Spring Boot 核心注解
注解 | 说明 | 示例 |
---|---|---|
@SpringBootApplication | 启动类注解(包含@Configuration +@EnableAutoConfiguration +@ComponentScan ) | @SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } |
@EnableAutoConfiguration | 启用自动配置机制(通常已包含在@SpringBootApplication 中) | 显式使用:@SpringBootApplication @EnableAutoConfiguration |
@ConditionalOnProperty | 根据配置属性条件化创建 Bean | @Bean @ConditionalOnProperty(name="feature.enabled", havingValue="true") public FeatureBean featureBean() { ... } |
@SpringBootApplication
作用:标记启动类,包含三个核心功能:
@Configuration
:这是一个配置类。@EnableAutoConfiguration
:开启自动配置(如自动配置数据库连接池)。@ComponentScan
:自动扫描当前包及子包下的组件(@Component
,@Service
等)。
代码示例:
@SpringBootApplication // 一切从这里开始
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args); // 启动 Spring Boot 应用}
}
第五部分:数据库和事务
注解 | 说明 | 示例 |
---|---|---|
@Transactional | 声明事务管理(可加在类或方法上) | @Transactional public void updateUser(User user) { ... } |
@Entity | JPA 实体类标记 | @Entity public class User { @Id private Long id; ... } |
@JpaRepository | Spring Data JPA 的仓库接口 | public interface UserRepository extends JpaRepository<User, Long> { ... } |
1. @Entity 和 @Id
作用:标记 JPA 实体类(对应数据库表)和主键字段。
代码示例:
@Entity // 告诉 Spring:“这是一个数据库表对应的实体类”
public class User {@Id // 标记为主键private Long id;private String name;// 省略 getter/setter
}
2. @Transactional
作用:声明事务,确保方法内的数据库操作要么全部成功,要么全部回滚。
代码示例:
@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;@Transactional // 开启事务public void placeOrder(Order order) {orderRepository.save(order); // 保存订单// 如果这里抛出异常(如库存不足),整个事务会回滚,订单不会被保存}
}
第六部分:AOP(面向切面编程)
核心思想:在不修改原有代码的情况下,统一处理日志、权限、事务等横切关注点。
注解 | 说明 | 示例 |
---|---|---|
@Aspect | 声明切面类 | @Aspect @Component public class LoggingAspect { ... } |
@Pointcut | 定义切入点表达式 | @Pointcut("execution(* com.example.service.*.*(..))") public void serviceMethods() {} |
@Before | 前置通知 | @Before("serviceMethods()") public void logBefore(JoinPoint jp) { ... } |
1. @Aspect 和 @Before
代码示例:
@Aspect // 告诉 Spring:“这是一个切面类”
@Component
public class LoggingAspect {// 定义切入点:拦截所有 Service 层的方法@Pointcut("execution(* com.example.service.*.*(..))")public void serviceMethods() {}// 前置通知:在方法执行前打印日志@Before("serviceMethods()")public void logBefore(JoinPoint joinPoint) {String methodName = joinPoint.getSignature().getName();System.out.println("准备执行方法:" + methodName);}
}
总结:注解的核心作用
场景 | 常用注解 | 类比解释 |
---|---|---|
管理对象 | @Component , @Service 等 | 告诉 Spring:“这个类归你管!” |
依赖注入 | @Autowired , @Qualifier | 告诉 Spring:“我需要这个,帮我拿!” |
处理 HTTP 请求 | @RestController , @GetMapping | 告诉 Spring:“这个方法是处理某个 URL 的!” |
读取配置 | @Value , @ConfigurationProperties | 告诉 Spring:“把配置文件的值给我!” |
事务管理 | @Transactional | 告诉 Spring:“这个方法要保证事务!” |
相关文章:

Spring Spring Boot 常用注解整理
Spring & Spring Boot 常用注解整理 先理解核心概念:什么是注解(Annotation)?第一部分:IOC(控制反转)和 DI(依赖注入)1. Component2. Service, Repository, Controll…...

c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能
# financial_建筑行业 建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能 # 开发背景 软件是给岳阳客户定制开发一款建筑行业流水账财务软件。提供工程签证单、施工日志、人员出勤表等信息记录。 # 财务管理系统功能描述 1.可以自行设置记账科目,做凭…...

让 Cursor 教我写 MCP Client
文章目录 1. 写在最前面2. 动手实现一个 MCP Client2.1 How 天气查询 Client2.1.1 向 Cursor 提问的艺术2.1.2 最终成功展示2.1.3 client 的代码 3. MCP 协议核心之一总结3.1 SSE vs WebSocket 4. 碎碎念5. 参考资料 1. 写在最前面 学习了 MCP Server 的实现后,刚好…...

反射, 注解, 动态代理
文章目录 单元测试什么是单元测试咱们之前是如何进行单元测试的? 有啥问题 ?现在使用方法进行测试优点Junit单元测试的使用步骤删除不需要的jar包总结 反射认识反射、获取类什么是反射反射具体学什么?反射第一步:或者Class对象 获…...

vue vite 无法热更新问题
一、在vue页面引入组件CustomEmployeesDialog,修改组件CustomEmployeesDialog无法热更新 引入方式: import CustomEmployeesDialog from ../dialog/customEmployeesDialog.vue 目录结构: 最后发现是引入import时,路径大小写与目…...
【CustomPagination:基于Vue 3与Element Plus的高效二次封装分页器】
CustomPagination:基于Vue 3与Element Plus的高效二次封装分页器 在现代Web应用开发中,分页是处理大量数据列表时不可或缺的功能。Element Plus等UI库提供了基础的分页组件,但在大型项目中,为了追求极致的用户体验和视觉统一&…...
kafka connect 大概了解
kafka connect Introduction Kafka Connect is the component of Kafka that provides data integration between databases, key-value stores, search indexes, file systems, and Kafka brokers. kafka connect 是一个框架,用来帮助集成其他系统的数据到kafka…...
UniApp 在华为三折叠屏中的适配问题与最佳解决方案(rpx 实战指南)
随着折叠屏设备的普及,如华为 Mate Xs、Mate X3 等多形态设备越来越常见,开发者在 UniApp 项目中遇到的适配问题也变得复杂。本文将聚焦一个关键问题:在三折叠屏设备上,使用 px 单位造成页面显示异常,并给出最推荐的解…...

深度学习中的查全率与查准率:如何实现有效权衡
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...
Docker从0到1:入门指南
目录 什么是DockerDocker的核心概念 容器(Container)镜像(Image)镜像层(Image Layers)Dockerfile仓库(Repository)数据卷(Volume)网络(Network) Docker架构Docker安装Docker基本命令实际应用场景Docker生态系统最佳实践常见问题 什么是Docker Docker是一个开源的应用容器引擎…...

Windows玩游戏的时候,一按字符键就显示桌面
最近打赛伯朋克 2077 的时候,不小心按错键了,导致一按字符键就显示桌面。如下: 一开始我以为是输入法的问题(相信打游戏的人都知道输入法和奔跑键冲突的时候有多烦),但是后来解决半天发现并不是。在网上搜…...

Gemini 2.5 Flash和Pro预览版价格以及上下文缓存的理解
Gemini 2.5 Flash和Pro预览版价格 Gemini 2.5 Flash 预览版就是 Google 的最新 AI 大模型,能处理巨量内容。可以免费体验,但有次数和功能上的限制;付费层级才开放全部高级功能。价格也比传统 API 略有不同,尤其在“思考预算”“上…...

vue2 头像上传+裁剪组件封装
背景:最近在进行公司业务开发时,遇到了头像上传限制尺寸的需求,即限制为一寸证件照(宽295像素,高413像素)。 用到的第三方库: "vue-cropper": "^0.5.5" 完整组件代码&…...
unity 鼠标更换指定图标
1.准备两张图 要求图片导入设置如下 将 Texture Type 改为 Cursor 确保 Read/Write Enabled 已勾选 取消勾选 Generate Mip Maps 将 Filter Mode 设为 Point (保持清晰边缘) 将 Compression 设为 None (无压缩) 2.创建脚本,把脚本挂到场景中 ,该…...

AI-02a5a5.神经网络-与学习相关的技巧-权重初始值
权重的初始值 在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。 不要将权重初始值设为 0 权值衰减(weight decay):抑制过拟合、提高泛化能…...

【springcloud学习(dalston.sr1)】Eureka单个服务端的搭建(含源代码)(三)
该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一) 这篇文章主要介绍单个eureka服务端的集群环境是如何搭建的。 通过前面的文章【springcloud学习(dalston.sr1)】…...

Node.js数据抓取技术实战示例
Node.js常用的库有哪些呢?比如axios或者node-fetch用来发送HTTP请求,cheerio用来解析HTML,如果是动态网页的话可能需要puppeteer这样的无头浏览器。这些工具的组合应该能满足大部分需求。 然后,可能遇到的难点在哪里?…...
[架构之美]Spring Boot集成MyBatis-Plus高效开发(十七)
[架构之美]Spring Boot集成MyBatis-Plus高效开发(十七) 摘要:本文通过图文代码实战,详细讲解Spring Boot整合MyBatis-Plus全流程,涵盖代码生成器、条件构造器、分页插件等核心功能,助你减少90%的SQL编写量…...

windows10 安装 QT
本地环境有个qt文件,这里是5.14.2 打开一个cmd窗口并指定到该文件根目录下 .\qt-opensource-windows-x86-5.14.2.exe --mirror https://mirrors.ustc.edu.cn/qtproject 执行上面命令 记住是文件名,记住不要傻 X的直接复制,是你的文件名 点击…...

WordPress 和 GPL – 您需要了解的一切
如果您使用 WordPress,GPL 对您来说应该很重要,您也应该了解它。查看有关 WordPress 和 GPL 的最全面指南。 您可能听说过 GPL(通常被称为 WordPress 的权利法案),但很可能并不完全了解它。这是有道理的–这是一个复杂…...
计算机网络:什么是计算机网络?它的定义和组成是什么?
计算机网络是指通过通信设备和传输介质,将分布在不同地理位置的计算机、终端设备及其他网络设备连接起来,实现资源共享、数据传输和协同工作的系统。其核心目标是使设备之间能够高效、可靠地交换信息。 关键组成部分 硬件设备 终端设备:如计算…...

C++书本摆放 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
目录 C++书本摆放 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、 推荐资料 1、C++资料 2、Scratch资料 3、Python资料 C++书本摆放 2024年信息素养大赛 C++复赛真题 一、题目要求 1、编程实现 中科智慧科技…...
在scala中使用sparkSQL读入csv文件
以下是使用 Spark SQL(Scala)读取 CSV 文件的完整代码示例: scala import org.apache.spark.sql.SparkSession import org.apache.spark.sql.types._object CSVReadExample {def main(args: Array[String]): Unit {// 创建SparkSessionval…...

RabbitMQ 核心概念与消息模型深度解析(一)
一、RabbitMQ 是什么 在当今分布式系统盛行的时代,消息队列作为一种至关重要的中间件技术,扮演着实现系统之间异步通信、解耦和削峰填谷等关键角色 。RabbitMQ 便是消息队列领域中的佼佼者,是一个开源的消息代理和队列服务器,基于…...

论文阅读笔记——双流网络
双流网络论文 视频相比图像包含更多信息:运动信息、时序信息、背景信息等等。 原先处理视频的方法: CNN LSTM:CNN 抽取关键特征,LSTM 做时序逻辑;抽取视频中关键 K 帧输入 CNN 得到图片特征,再输入 LSTM&…...
思路解析:第一性原理解 SQL:连接(JOIN)
目录 题目描述 🎯 应用第一性原理来思考这个 SQL 题目 ✅ 第一步:还原每个事件的本质单位 ✅ 第二步:如果一个表只有事件,如何构造事件对? ✅ 第三步:加过滤条件,只保留“同一机器、同一进…...
Java面向对象三大特性深度解析
Java面向对象三大特性封装继承多态深度解析 前言一、封装:数据隐藏与访问控制的艺术1.1 封装的本质与作用1.2 封装的实现方式1.2.1 属性私有化与方法公开化1.2.2 封装的访问修饰符 二、继承:代码复用与类型扩展的核心机制2.1 继承的定义与语法2.2 继承的…...

LabVIEW在电子电工教学中的应用
在电子电工教学领域,传统教学模式面临诸多挑战,如实验设备数量有限、实验过程存在安全隐患、教学内容更新滞后等。LabVIEW 作为一款功能强大的图形化编程软件,为解决这些问题提供了创新思路,在电子电工教学的多个关键环节发挥着重…...

Vue3 怎么在ElMessage消息提示组件中添加自定义icon图标
1、定义icon组件代码: <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName" :fill"color"/></svg> </template><script> export default defineComponen…...

生活破破烂烂,AI 缝缝补补(附提示词)
写在前面:【Fire 计算器】已上线,快算算财富自由要多少 现实不总温柔,愿你始终自渡。 请永远拯救自己于水火之中。 毛绒风格提示词(供参考): 1. 逼真毛绒风 Transform this image into a hyperrealist…...