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

作用:标记启动类,包含三个核心功能:

  1. @Configuration:这是一个配置类。
  2. @EnableAutoConfiguration:开启自动配置(如自动配置数据库连接池)。
  3. @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) { ... }
@EntityJPA 实体类标记@Entity public class User { @Id private Long id; ... }
@JpaRepositorySpring 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:“这个方法要保证事务!”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIGC与数字媒体实验室解决方案分享

第1部分 概述 1.1 建设目标 1.深度融合AIGC技术&#xff0c;培养能够驾驭新质生产力的数字媒体人才 通过引入前沿的AIGC技术&#xff0c;确保学生能够接触到最先进的人工智能应用。教学内容理论和实践结合&#xff0c;让学生在实际操作中熟练掌握AIGC工具&#xff0c;生成高…

讯联云库项目开发日志(二)AOP参数拦截

目录 利用AOP实现参数拦截: 一、​​HTTP请求进入Controller​&#xff08;发送邮件验证码&#xff09; 二、AOP切面触发 1. 切面拦截&#xff08;GlobalOperactionAspect.class&#xff09; method.getAnnotation()​​ null interceptor 判断​​ 2.参数校验注解 3. 参…

用OBD部署OceanBase社区版的避坑指南

以下是用OBD黑屏部署 OceanBase社区版时容易碰到的几个问题及解决思路&#xff0c;供大家参考。 一、 遇坑步骤&#xff1a;用yaml文件部署集群&#xff1a; obd cluster deploy obtest -c mini-single-example.yaml 报错&#xff1a; Package oceanbase-ce-4.2.1.8-108000…

无锡哲讯科技:引领芯片封装SAP系统的智能化革命

芯片封装行业的数字化转型 在全球半导体产业高速发展的今天&#xff0c;芯片封装作为产业链的关键环节&#xff0c;直接影响着芯片的性能、可靠性和成本。随着5G、人工智能、物联网等技术的普及&#xff0c;市场对芯片的需求激增&#xff0c;封装企业面临着效率提升、良率优…

从海洋生物找灵感:造个机器人RoboPteropod,它能在水下干啥?

大家好&#xff01;在如今人类对水下环境探索不断深入的时代&#xff0c;从水下考古到珊瑚礁考察&#xff0c;各种任务都离不开水下机器人的助力。但传统水下机器人尺寸较大&#xff0c;在狭窄的水下空间施展不开。今天&#xff0c;我们就来认识一款受海洋小生物启发而设计的仿…

区块链blog1__合作与信任

&#x1f342;我们的世界 &#x1f33f;不是孤立的&#xff0c;而是网络化的 如果是单独孤立的系统&#xff0c;无需共识&#xff0c;而我们的社会是网络结构&#xff0c;即结点间不是孤立的 &#x1f33f;网络化的原因 而目前并未发现这样的理想孤立系统&#xff0c;即现实中…

Linux服务之lvs+keepalived nginx+keepalived负载均衡实例解析

目录 一.LVSKeepAlived高可用负载均衡集群的部署 二.NginxKeepAlived高可用负载均衡集群的部署 一.LVSKeepAlived高可用负载均衡集群的部署 实验环境 主keepalived&#xff1a;192.168.181.10 lvs &#xff08;7-1&#xff09; 备keepalived&#xff1a;192.168.181.10…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ |搭建项目框架

&#x1f5a4; 一个专注于「Vue3 TailwindCSS」的 50 天极简开发挑战&#xff0c;探索组件边界&#xff0c;打磨技术锋芒。 &#x1f389; 欢迎来到 50 个小项目的第一天&#xff01;今天我们将从零开始搭建一个 Vue3 项目&#xff0c;并引入 Tailwind CSS v4&#xff0c;为后…

Android 中 网络图片加载库 Glide 简介

Glide 是一个功能强大且广泛使用的图片加载库,适用于 Android 应用程序。它提供了简单易用的 API,用于从网络、本地存储或资源中加载图片,并支持图片的缓存、转换、占位图、动画等功能。 一、Glide 主要特点 简单易用 提供简洁的 API,一行代码即可加载图片。 支持多种数据…

07 web 自动化之 Unittest 应用:测试报告装饰器断言

文章目录 一、常见的第三方库结合 unittest 生产 html 格式测试报告1、HtmlTestRunner2、BeatifulReport 二、装饰器 unittest.skip 强制跳过&条件跳过三、unittest的常用断言方法 一、常见的第三方库结合 unittest 生产 html 格式测试报告 1、HtmlTestRunner 官网下载 …

【Python 面向对象】

Python 的面向对象编程&#xff08;OOP&#xff09;通过类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;实现代码结构化&#xff0c;支持封装、继承和多态三大特性。以下是系统化指南&#xff1a; 一、类与对象基础 1. 定义类 class Dog:# 类属性&…

STM32F103_LL库+寄存器学习笔记23 - PWM波形输出及软件方式调整周期与占空比

导言 脉宽调制&#xff08;PWM&#xff09;是 STM32 定时器最常用的输出模式之一&#xff0c;广泛应用于电机驱动、LED 调光、伺服控制和功率管理等场景。本篇文章将以 TIM5 为例&#xff0c;从寄存器层面深入剖析 PWM 输出的原理与实现步骤。通过本篇博客&#xff0c;你不仅能…

堆(Heap)

1. 堆&#xff08;Heap&#xff09; 1.1. Python实现堆的插入、堆顶删除和排序 class MaxHeap:def __init__(self):# 初始化空堆&#xff0c;使用列表表示self.heap []def insert(self, val):# 插入元素并执行上浮self.heap.append(val)self._sift_up(len(self.heap) - 1)de…

Spring类

BeanDefinition BeanDefinition表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a; class&#xff0c;表示Bean类型scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等lazyInit&#xff1a;表示Bean是否是懒加载initMeth…

在vue中this.$emit有哪些作用,事件监控具体含义,以及这些子组件能封装哪些功能组件

this.$emit 的作用 this.$emit 的作用是触发一个自定义事件&#xff0c;并将数据传递给父组件。父组件可以通过 v-on&#xff08;或 &#xff09;监听这个事件&#xff0c;并在事件触发时执行相应的处理函数。 this.content 的作用 this.content 是子组件的 props&#xff0…

前端流行框架Vue3教程:16. 组件事件配合`v-model`使用

组件事件配合v-model使用 如果是用户输入&#xff0c;我们希望在获取数据的同时发送数据配合v-model 来使用&#xff0c;帮助理解组件间的通信和数据绑定。 &#x1f9e9; 第一步&#xff1a;创建子组件&#xff08;SearchComponent.vue&#xff09; 这个组件用于处理用户的搜…

《Navicat之外的新选择:实测支持国产数据库的SQLynx核心功能解析》

数据库工具生态的新变量 在数据库管理工具领域&#xff0c;Navicat长期占据开发者心智。但随着国产数据库崛起和技术信创需求&#xff0c;开发者对工具的兼容性、轻量化和本土化适配提出了更高要求。近期体验了一款名为SQLynx的国产数据库管理工具&#xff08;麦聪旗下产品&am…

AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。

​一、软件介绍 文末提供程序和源码下载 AgenticSeek开源的完全本地的 Manus AI。无需 API&#xff0c;享受一个自主代理&#xff0c;它可以思考、浏览 Web 和编码&#xff0c;只需支付电费。这款支持语音的 AI 助手是 Manus AI 的 100% 本地替代品 &#xff0c;可自主浏览网页…

vue3.0的name属性插件——vite-plugin-vue-setup-extend

安装 这个由于是在开发环境下的一个插件 帮助我们支持name属性 所以需要是-D npm i vite-plugin-vue-setup-extend -D在pasckjson中无法注释每个插件的用处 可以在vscode中下载一个JsonComments这样可以在json中添加注释方便日后维护和查阅API 引入 在vite.config.js中 im…

Linux基础 -- 在内存中使用chroot修复eMMC

Linux基础 – 在内存中使用chroot修复eMMC 概述 本教程将介绍如何在Linux系统中&#xff0c;使用chroot在内存中构建一个临时系统&#xff0c;并在不依赖原有系统的情况下修复eMMC&#xff08;如/dev/mmcblk2&#xff09;磁盘。该方法适用于嵌入式系统修复、磁盘清理以及离线…