Spring Spring Boot 常用注解整理

news2025/5/15 23:35:40

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" 的 Bean
    private 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) {  // 获取路径中的 id
    return userService.findById(id);
}

@GetMapping("/search")
public List<User> searchUsers(@RequestParam String keyword) {  // 获取参数 ?keyword=xxx
    return 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}")  // 注入数据库 URL
    private 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 {
    @Autowired
    private 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.coloradmin.cn/o/2376439.html

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

相关文章

c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能

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

让 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 的实现后&#xff0c;刚好…

反射, 注解, 动态代理

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

vue vite 无法热更新问题

一、在vue页面引入组件CustomEmployeesDialog&#xff0c;修改组件CustomEmployeesDialog无法热更新 引入方式&#xff1a; import CustomEmployeesDialog from ../dialog/customEmployeesDialog.vue 目录结构&#xff1a; 最后发现是引入import时&#xff0c;路径大小写与目…

深度学习中的查全率与查准率:如何实现有效权衡

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…

Windows玩游戏的时候,一按字符键就显示桌面

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

Gemini 2.5 Flash和Pro预览版价格以及上下文缓存的理解

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

vue2 头像上传+裁剪组件封装

背景&#xff1a;最近在进行公司业务开发时&#xff0c;遇到了头像上传限制尺寸的需求&#xff0c;即限制为一寸证件照&#xff08;宽295像素&#xff0c;高413像素&#xff09;。 用到的第三方库&#xff1a; "vue-cropper": "^0.5.5" 完整组件代码&…

AI-02a5a5.神经网络-与学习相关的技巧-权重初始值

权重的初始值 在神经网络的学习中&#xff0c;权重的初始值特别重要。实际上&#xff0c;设定什么样的权重初始值&#xff0c;经常关系到神经网络的学习能否成功。 不要将权重初始值设为 0 权值衰减&#xff08;weight decay&#xff09;&#xff1a;抑制过拟合、提高泛化能…

【springcloud学习(dalston.sr1)】Eureka单个服务端的搭建(含源代码)(三)

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

Node.js数据抓取技术实战示例

Node.js常用的库有哪些呢&#xff1f;比如axios或者node-fetch用来发送HTTP请求&#xff0c;cheerio用来解析HTML&#xff0c;如果是动态网页的话可能需要puppeteer这样的无头浏览器。这些工具的组合应该能满足大部分需求。 然后&#xff0c;可能遇到的难点在哪里&#xff1f;…

windows10 安装 QT

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

WordPress 和 GPL – 您需要了解的一切

如果您使用 WordPress&#xff0c;GPL 对您来说应该很重要&#xff0c;您也应该了解它。查看有关 WordPress 和 GPL 的最全面指南。 您可能听说过 GPL&#xff08;通常被称为 WordPress 的权利法案&#xff09;&#xff0c;但很可能并不完全了解它。这是有道理的–这是一个复杂…

C++书本摆放 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析

目录 C++书本摆放 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、 推荐资料 1、C++资料 2、Scratch资料 3、Python资料 C++书本摆放 2024年信息素养大赛 C++复赛真题 一、题目要求 1、编程实现 中科智慧科技…

RabbitMQ 核心概念与消息模型深度解析(一)

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

论文阅读笔记——双流网络

双流网络论文 视频相比图像包含更多信息&#xff1a;运动信息、时序信息、背景信息等等。 原先处理视频的方法&#xff1a; CNN LSTM&#xff1a;CNN 抽取关键特征&#xff0c;LSTM 做时序逻辑&#xff1b;抽取视频中关键 K 帧输入 CNN 得到图片特征&#xff0c;再输入 LSTM&…

LabVIEW在电子电工教学中的应用

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

Vue3 怎么在ElMessage消息提示组件中添加自定义icon图标

1、定义icon组件代码&#xff1a; <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName" :fill"color"/></svg> </template><script> export default defineComponen…

生活破破烂烂,AI 缝缝补补(附提示词)

写在前面&#xff1a;​【Fire 计算器】已上线&#xff0c;快算算财富自由要多少​ 现实不总温柔&#xff0c;愿你始终自渡。 请永远拯救自己于水火之中。 毛绒风格提示词&#xff08;供参考&#xff09;&#xff1a; 1. 逼真毛绒风 Transform this image into a hyperrealist…

张 。。 通过Token实现Loss调优prompt

词编码模型和 API LLM不匹配,采用本地模型 理性中性案例(针对中性调整比较合理) 代码解释:Qwen2模型的文本编码与生成过程 这段代码展示了如何使用Qwen2模型进行文本的编码和解码操作。 模型加载与初始化 from transformers import AutoModelForCausalLM, AutoTokenizer