学透Spring Boot 003 —— Spring 和 Spring Boot 常用注解(附面试题和思维导图)
这是 学透 Spring Boot 专栏 的第三篇,欢迎关注我,与我一起学习和探讨 Spring Boot 相关知识,学透 Spring Boot。
从面试题说起
今天我们通过一道和Spring Boot有关的常见面试题入手。
面试题:说说
Spring Boot中有哪些常用注解?
Spring Boot 项目中我们常用的几个注解有:
@SpringBootApplication:这个注解一般定义在我们项目的启动类上,表示这是项目的入口@EnableAutoConfiguration:这个注解用来启用 Spring Boot 的自动配置机制,这样就可以根据项目的依赖自动配置 Spring 应用程序@ConfigurationProperties:这个注解可以把指定的前缀配置项的值绑定到某个JavaBean上@SpringBootTest:该注解可以更轻松地测试 Spring Boot 应用程序,而不需要必须手动创建应用程序上下文或配置。
是的,到这里就结束了!
因为网上很多 Java 八股文,罗列的是 Spring 的常用注解,而
不是 Spring Boot 的注解。
面试时你可以放心大胆的这么回答,如果面试官质疑,我们再补充其它的 Spring 注解就可以了,并说明其中的区别,这样可以体现我们对 Spring 的理解。
Spring Boot 常用注解详解
@SpringBootApplication
这是一个组合注解,用于 Spring Boot 应用程序主类,表示这是 Spring Boot 应用程序的入口点。
@SpringBootApplication
public class SkybootApplication {public static void main(String[] args) {SpringApplication.run(SkybootApplication.class, args);}
}
点击这个注解,我们进入到它的注解定义,就可以看到它其实由@SpringBootConfiguration,@EnableAutoConfiguration,@EnableAutoConfiguration三个注解组成的!
@Target@Retention等这几个是元注解
其它三个才是重点,他们
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}),@Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)})
public @interface SpringBootApplication {
@SpringBootConfiguration
这个注解其实是就是Spring 提供的@Configuration 注解的Spring Boot版本!标注一个类作用Spring Boot应用的配置类。
@Configuration
public @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;
}
@EnableAutoConfiguration
这个注解用于启用 Spring Boot 的自动配置机制,这也是 Spring Boot 最强大的特性之一!
这里只是相当于开关的作用,后续我们会有专门的章节介绍这个注解,从而深入学习Spring Boot的自动配置机制!
@ConfigurationProperties
我们在application.properties定义一些配置,可以通过这个注解把指定前缀的配置加载到某个bean上。
app.name=skyboot
app.duration=10
通过这个注解
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String name;private Integer duration;
常见的Spring Boot就这几个,其它的一些不常用的比如
@ConditionalOnClass会在自动配置原理章节介绍。
Spring 的核心注解
@Configuration
指定一个类作为配置类。比如我们经常用它来定义数据库数据源,这样一个DataSource对象就注入到Spring 容器中去了。
@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("username");dataSource.setPassword("password");return dataSource;}
}
@ComponentScan
这个注解用于指定 Spring 容器扫描组件的基本包路径。
我们可以通过它配置一个扫描路径,但是没有必要,因为 @SpringBootApplication 默认已经包含这个注解了,默认是并将应用程序主类所在的包及其子包作为默认的扫描范围。
package com.mt.skyboot;@SpringBootApplication
@ComponentScan(basePackages = "com.mt.skyboot")
public class SkybootApplication {
Spring Web 的注解
@Controller
用来标识一个类作为 Spring MVC 中的控制器(MVC中的C),处理客户端发起的 HTTP 请求,并返回相应的视图或数据。
@Controller
public class WebController {@GetMapping("/user")public ModelAndView getUser() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("user"); // 渲染user.jspmodelAndView.addObject("name", "兰亭序咖啡"); // 向页面传递数据return modelAndView;}
}
@RestController
现在很多项目都是前后端分离,很多时候只需要开发 REST API。这时候这个注解就非常有用了。
这样可以直接访问 http://localhost:8080/getAllStudents,默认返回的是json数组。
@RestController
public class StudentController {@GetMapping("/getAllStudents")public List<Student> getAllStudents() {return studentService.getStudents();}
}
@RequestMapping
这个注解用于在控制器类或方法上指定处理 HTTP 请求的路径。
这样可以直接访问 http://localhost:8080/student/getAllStudents。
@RequestMapping("/student")
@RestController
public class StudentController {@GetMapping("/getAllStudents")public List<Student> getAllStudents() {return studentService.getStudents();}
}
@GetMapping
用于将 HTTP GET 请求映射到特定的处理器方法。
@GetMapping("/hello")
public String hello(){return "<h1>兰亭序咖啡的Spring Boot专栏</h1>";
}
是 @RequestMapping 的简便写法!
@RequestMapping(path = "/hello", method = RequestMethod.GET)
public String hello(){return "<h1>兰亭序咖啡的Spring Boot专栏</h1>";
}
另外类似的注解
@PostMapping@PutMapping@DeleteMapping
Spring Bean 的注解
@Component
被 @Component 注解标识的类将会由 Spring 容器自动扫描并进行实例化,成为 Spring 应用程序中的一个 Bean。
@Component
public class EmailService {// 发送邮件方法
}
这个注解是一个泛化的概念,包括了
@Controller、@Service、@Repository等更具体的注解。当一个类不符合以上三种类型的特定类时,可以使用 @Component 注解来标识它。
@Controller
用于标识一个类作为 Spring MVC 控制器。
@Controller
public class ApiController {@GetMapping("/api/data")@ResponseBodypublic String getData() {return "{\"name\": \"John\", \"age\": 30}"; // 返回 JSON 数据}
}
@RestController
结合 @Controller 和 @ResponseBody,用于创建 RESTful 风格的控制器。
和前面的 @Controller 对比,作用是一样的,但是更简洁!
@RestController
public class ApiController {@GetMapping("/api/data")public String getData() {return "{\"name\": \"John\", \"age\": 30}"; // 返回 JSON 数据}
}
@Service
在项目中通常会有一些业务逻辑需要处理,例如用户管理、订单处理、商品管理等。@Service 注解可以用于标识这些业务逻辑处理类。
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}
}
@Repository
这个注解用于标识数据访问层(DAO 层)中的类,表示这些类负责与数据库进行交互,执行数据访问操作。
@Repository
public class ProductRepository {public List<Product> findAllProducts() {// 执行查询操作,返回所有产品的数据列表}public void saveProduct(Product product) {// 执行插入操作,保存产品数据到数据库}
}
Spring IoC 注解
@Autowired
用于自动装配 Bean,通常与构造函数、Setter 方法或字段一起使用。
@Controller
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users")public String getUsers() {// 调用 UserService 中的方法来获取用户数据userService.getAllUsers();return "users";}
}
@Qualifier
与@Autowired 一起使用,通常用于解决多个实现同一接口或父类的类的依赖注入问题。
public interface PaymentProcessor {void processPayment(double amount);
}
@Component
@Qualifier("paypal")
public class PaypalPaymentProcessor implements PaymentProcessor {@Overridepublic void processPayment(double amount) {System.out.println("Processing payment via PayPal: $" + amount);}
}
@Component
@Qualifier("creditCard")
public class CreditCardPaymentProcessor implements PaymentProcessor {@Overridepublic void processPayment(double amount) {System.out.println("Processing payment via Credit Card: $" + amount);}
}
这个接口有两个实现类,这时候需要使用 @Qualifier 指定使用哪个实现类。
@Service
public class PaymentService {@Autowired@Qualifier("paypal") // 指定注入 PaypalPaymentProcessor 类型的 Beanprivate PaymentProcessor paymentProcessor;public void processPayment(double amount) {paymentProcessor.processPayment(amount);}
}
扩展知识点
@Controller、@Service、@Repository和@Component的区别
@Controller、@Service、@Repository都可以直接用@Component替换- 本质上没什么区别,但是用特定的注解标识特定的类,这样代码更容易维护,可读性也更好
@Component
public @interface Repository {@AliasFor(annotation = Component.class)String value() default "";
}
@Autowired、@Inject、@Resource的区别
Spring中除了 @Autowired 注解之外,还有其他几个用于依赖注入的注解:
- @Autowired: 这个注解是
Spring框架提供的,是Spring 中最常用的依赖注入注解之一。- 它可以用于自动装配 Bean,通过类型匹配进行依赖注入。
- 可以与
@Qualifier注解一起使用,用于解决多个同类型 Bean的注入歧义性。
- @Inject: 这个注解是
JSR-330 规范中定义的依赖注入注解,在 Java EE 和 Spring 中都可以使用。- 与
@Autowired注解类似,@Inject 注解也可以用于自动装配 Bean,通过类型匹配进行依赖注入。 - 它是 Spring 的一个替代方案,可以与 @Qualifier 注解一起使用,用于解决多个同类型 Bean 的注入歧义性。
- 与
- @Resource: 这个注解是
Java EE 规范中定义的依赖注入注解,也可以在 Spring 中使用。- @Resource 注解可以通过名称匹配进行依赖注入,也可以指定 Bean 的名称进行注入。
- 与 @Autowired 和 @Inject 注解不同,@Resource注解不支持 @Qualifier 注解,因此在解决多个同类型 Bean 的注入歧义性时不太方便。
思维导图
最后附上思维导图

相关文章:
学透Spring Boot 003 —— Spring 和 Spring Boot 常用注解(附面试题和思维导图)
这是 学透 Spring Boot 专栏 的第三篇,欢迎关注我,与我一起学习和探讨 Spring Boot 相关知识,学透 Spring Boot。 从面试题说起 今天我们通过一道和Spring Boot有关的常见面试题入手。 面试题:说说 Spring Boot 中有哪些常用注解…...
新能源汽车充电桩常见类型及充电桩站场的智能监管方案
随着新能源汽车市场的迅猛发展,充电桩作为支持其运行的基础设施,也呈现出多样化的类型。这些充电桩不仅在外形和功能上存在差异,更在充电速度、充电方式以及使用场景等方面展现出独特的优势。 一、充电桩类型及区别 1、慢充桩(交…...
让工作自动化起来!无所不能的Python
文章目录 前言一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书赠书活动 前言 随着我国企业数字化和信息化的深入…...
Facebook轮播广告是什么?投放过程中有哪些需要注意的吗?
轮播广告是Facebook广告形式中的一种,可以把3—5个广告合并到一个可滚动的广告单元中。轮播广告会出现在新鲜事即News Feed中,是独立站卖家常用的一种广告形式 为什么选择轮播广告? 转化率更高:相较于单图广告,轮播广…...
3、jvm基础知识(三)
如何判断堆上的对象没有被引用? 常见的有两种判断方法:引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1。 引用计数法的优点是实现简单,缺点有两点࿱…...
leetcode414-Third Maximum Number
这道题目求第三大数,如果第三大数不存在则返回最大数,且该数字最大值不超过2^31-1。从这个提示上就可以看出这个数字是用int类型表示的。我们当然可以通过排序的方式先给数组排序然后很容易的就能求解。但是有没有什么更好的办法呢?对于数组来…...
解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:`timescale 1ns/1ns
解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:timescale 1,一直走下来,在modelsim中出现了下面问题2,rtl文件、tb文件2.1,rtl代码2.2,tb测试2.3&a…...
vue使用elementui组件的的对话框;使用ref
1.第一步,先在父组件中引用,设置ref的值 <el-dialog :visible.sync"dialogEditVisible"append-to-body width"1000px" title"编辑":close-on-click-modal"false"><dialog-edit v-if"dialogEditV…...
第十四届蓝桥杯(八题C++ 题目+代码+注解)
目录 题目一(日期统计 纯暴力): 代码: 题目二(01串的熵 模拟): 代码: 题目三(治炼金属): 代码: 题目四(飞机降落 深度…...
HTTP协议格式详解之报头(HTTP header)、请求正文(body)
在之前文章中我们已经介绍了HTTP的首行信息,HTTP协议格式详解之首行信息解析-CSDN博客这篇文章中我们继续介绍HTTP协议的报头部分。 一、报头(HTTP header) a)请求头部(Request Headers): Host:指定服务器…...
[yolox]ubuntu上部署yolox的ncnn模型
首先转换pytorch->onnx->param模型,这个过程可以查资料步骤有点多,参考blog.51cto.com/u_15660370/6408303,这里重点讲解转换后部署。 测试环境: ubuntu18.04 opencv3.4.4(编译过程省略,参考我其他博客) 安装…...
YOLOv9改进策略 :IoU优化 | 提出一种新的Shape IoU,更加关注边界框本身的形状和尺度,对小目标检测也很友好
💡💡💡本文改进:一种新的Shape IoU方法,该方法可以通过关注边界框本身的形状和尺度来计算损失,解决边界盒的形状和规模等固有属性对边界盒回归的影响。 💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点 《YOLOv9魔术师专栏》将从以下各个方向进…...
如何使用KST指标进行多头交易,Anzo Capital一个条件设置
在之前的文章中,我们进行分享了以下知识:什么是KST指标,以及如何进行计算KST指标。有聪明的投资者就在后台进行咨询Anzo Capital昂首资本了,我们知道这些知识有什么用呢? 当然有用了,只要理解背后的逻辑知…...
【QT进阶】第十三章QT动画类的使用QAbstractAnimation
❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️专栏目录:【零基础学QT】文章导航篇 ❤️专栏资料:https://pan.baidu.com/s/192A28BTIYFHmixRcQwmaHw 提取码:qtqt ❤️点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过…...
【机器学习】揭秘无监督学习:机器如何自我学习发现数据奥秘
无监督学习:全面解析 引言 在机器学习的众多分支中,无监督学习因其在未标记数据上发现隐藏模式的能力而独树一帜。它不依赖于事先标记的输出,而是通过分析数据本身的结构和分布来揭示内在的关系和分类。本文深入探讨无监督学习的核心概念、…...
鸿蒙(HarmonyOS)ArkTs语言基础教程(大纲)
鸿蒙(HarmonyOS)ArkTs语言基础教程 简介 ArkTS 是鸿蒙生态的应用开发语言。它在保持 TypeScript(简称 TS)基本语法风格的基础上,对 TS 的动态类型特性施加更严格的约束,引入静态类型。同时,提…...
掌握未来商机:如何利用会话式AI赢在起跑线
AI智能助手:提升工作效率的秘密武器 在这个信息爆炸的时代,内容策略成为了品牌与用户之间沟通的重要桥梁。一个有效的内容策略能够帮助品牌提升知名度,建立与目标受众的深度连接,并最终实现转化目标。内容策略不仅涉及内容的创作与…...
软考高级架构师:数据传输控制方式:程序控制方式、程序中断方式、DMA方式、通道方式、IO处理机
作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…...
大模型之路2:继续趟一条小路
继续趟一条小路,可谓是充满了曲折,当然,必不可少的还是坑。 吐槽 看过的喷友,其实你看完以后,大概率也就是和我一起骂骂街,因为....我也的确没理清楚。 我也不知道做错了什么,就是运行不过去…...
打造安全医疗网络:三网整体规划与云数据中心构建策略
医院网络安全问题涉及到医院日常管理多个方面,一旦医院信息管理系统在正常运行过程中受到外部恶意攻击,或者出现意外中断等情况,都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等,…...
【综述型文章】人工智能驱动的生物医学多模态数据融合与分析中的挑战
论文总结1、作者总结了挑战:1)数据的挑战-meta元学习和transfering learning迁移学习;2)生物医学模型的可解释性--基于网络结构的可解释性(将通路先验信息等加入到网络结构中,约束网络学习参数)…...
避坑指南:Unity物体闪烁效果Material内存泄漏问题排查(附Shader优化方案)
Unity物体闪烁效果的性能陷阱与工业级解决方案 在游戏开发中,物体闪烁效果是一种常见的视觉反馈手段,用于提示玩家可交互对象、危险区域或特殊状态。然而,许多开发者在使用传统实现方式时,往往会掉入Material内存泄漏的陷阱&#…...
AI编程助手太烧钱?试试这个‘外挂’:心灵宝石MCP服务在Cursor中的安装与长期使用心得
深度解析Cursor IDE中的MCP服务:心灵宝石的高效部署与实战技巧 作为一名全栈开发者,我几乎每天都要与代码编辑器打交道。从早期的Sublime Text到VS Code,再到如今集成了AI能力的Cursor,工具链的进化让开发效率不断提升。但随之而来…...
RKNN模型量化全解析:如何用1.5.2版本工具链提升瑞芯微3588芯片推理效率
RKNN模型量化实战指南:1.5.2版本工具链在RK3588芯片的深度优化 边缘计算时代的模型效率革命 当无人机需要在毫秒间识别障碍物,当零售摄像头要同时追踪上百个顾客行为,传统云端AI的响应速度已无法满足需求。这正是边缘AI芯片大显身手的舞台——…...
OpenClaw语音交互方案:nanobot镜像对接语音输入输出
OpenClaw语音交互方案:nanobot镜像对接语音输入输出 1. 为什么需要语音交互能力 作为一个长期使用OpenClaw的技术爱好者,我一直在思考如何让这个强大的自动化工具更加"人性化"。传统的命令行和文本交互方式虽然高效,但对于不擅长…...
Qwen3-ASR-1.7B开源ASR教程:适配国产昇腾/寒武纪平台的移植可行性分析
Qwen3-ASR-1.7B开源ASR教程:适配国产昇腾/寒武纪平台的移植可行性分析 1. 项目背景与模型介绍 「清音听真」是基于Qwen3-ASR-1.7B语音识别引擎的高精度转录平台。作为0.6B版本的跨代升级,这个1.7B参数的模型在复杂语音场景处理能力上实现了显著提升。 …...
别再死记硬背了!用一次完整的网页访问,帮你彻底搞懂HCIA/HCIP里的TCP/IP和OSI模型
从输入网址到页面加载:用真实场景拆解TCP/IP与OSI模型 想象一下这个场景:你在浏览器地址栏输入"www.baidu.com",按下回车键,不到一秒就看到了熟悉的搜索页面。这看似简单的操作背后,隐藏着一场精密的网络协议…...
TranslucentTB:打造高效透明任务栏的终极指南
TranslucentTB:打造高效透明任务栏的终极指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB 是一款专为 Wind…...
NaViL-9B开源镜像免配置教程:无需下载权重,5分钟跑通图文问答
NaViL-9B开源镜像免配置教程:无需下载权重,5分钟跑通图文问答 1. 快速了解NaViL-9B NaViL-9B是由专业研究机构开发的原生多模态大语言模型,它不仅能像普通AI那样进行文字对话,还能看懂图片内容。想象一下,你上传一张…...
Phi-4-Reasoning-Vision实操手册:官方SYSTEM PROMPT精准适配教程
Phi-4-Reasoning-Vision实操手册:官方SYSTEM PROMPT精准适配教程 1. 工具概览 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。这个工具严格遵循官方SYSTEM PROMPT规范ÿ…...
