学透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:继续趟一条小路
继续趟一条小路,可谓是充满了曲折,当然,必不可少的还是坑。 吐槽 看过的喷友,其实你看完以后,大概率也就是和我一起骂骂街,因为....我也的确没理清楚。 我也不知道做错了什么,就是运行不过去…...
打造安全医疗网络:三网整体规划与云数据中心构建策略
医院网络安全问题涉及到医院日常管理多个方面,一旦医院信息管理系统在正常运行过程中受到外部恶意攻击,或者出现意外中断等情况,都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等,…...
imu测试--UDP、PTP
imu测试–UDP、PTP UDP 服务器端口: nc -lu -p 52340;客服端: nc -u 192.168.101.175 52340列出linux所以的开放端口 sudo netstat -tulpn或者$ sudo ss -tulpn状态列显示端口是否处于侦听状态(LISTEN)。 在上面的命令中,标志ÿ…...
软考 系统架构设计师系列知识点之云原生架构设计理论与实践(13)
接前一篇文章:软考 系统架构设计师系列知识点之云原生架构设计理论与实践(12) 所属章节: 第14章. 云原生架构设计理论与实践 第3节 云原生架构相关技术 14.3.2 云原生微服务 1. 微服务发展背景 过去开发一个后端应用最为直接的方…...
2024多功能知识付费源码下载
多功能知识付费源码下载实现流量互导多渠道变现 源码介绍 资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档…...
计算机网络——33多点访问协议
多点访问协议 多路访问链路和协议 两种类型的链路(一个子网内部链路连接形式) 点对点 拨号访问的PPP以太网交换机和主机之间的点对点链路 广播 传统以太网HFC上行链路802.11无线局域网 多路访问协议 单个共享的广播型链路 2个过更多结点同时传送&am…...
基于神经网络的人脸识别系统的设计与实现
基于神经网络的人脸识别系统的设计与实现 摘要: 随着计算技术的快速发展,人脸识别已成为身份验证、安全监控等领域的关键技术。本文旨在设计并实现一个基于神经网络的人脸识别系统,该系统能够自动地从输入图像中检测和识别出人脸。论文首先介…...
远控桌面多任务并发文件保密传输
远程桌面文件传输是一个重要的功能,大多数远控都是用的桌面程序模式,利用系统自带复制粘贴拖拽文件拷贝功能,做一个ole调用对接,可以将很多控制权交给操作系统。 但我做的是浏览器版,浏览器是沙盒原理,为了…...
探索 ZKFair 的Dargon Slayer蓝图,解锁新阶段的潜力
在当前区块链技术的发展中,Layer 2(L2)解决方案已成为提高区块链扩容性、降低交易成本和提升交易速度的关键技术,但它仍面临一些关键问题和挑战,例如用户体验的改进、跨链互操作性、安全性以及去中心化程度。在这些背景…...
open Gauss 数据库-04 openGauss数据库日志管理指导手册
发文章是为了证明自己真的掌握了一个知识,同时给他人带来帮助,如有问题,欢迎指正,祝大家万事胜意! 目录 前言 openGauss 数据库日志管理 1 实验介绍 2 实验目的 3 系统日志 3.1 运行时日志 3.2 安装卸载时日志…...
Redis性能瓶颈与安全隐患排查验证纪实
在写《Redis怎样保证数据安全?》这篇文章,我是有对redis设置密码需要哪些步骤,设置密码的性能损耗有验证的。这就涉及到要对redis的配置做修改。 开始时我是打算采用直接使用redis配置文件的方式。所以我从redis官网下载了一个默认的配置文件…...
【C/C++】C语言实现顺序表
C语言实现顺序表 简单描述代码运行结果 简单描述 用codeblocks编译通过 源码参考连接 https://gitee.com/IUuaena/data-structures-c.git 代码 common.h #ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDED#define LIST_INIT_CAPACITY 100 //!< 线性表初始化长度 #def…...
网站建设及使用/百度怎么发帖子
一、简单说明 1.思路 把下载的data追加到文件的尾部,直到所有的数据下载完为止。 1.在连通了服务器的时候,创建一个空的文件到沙盒中NSFileManager(文件管理类) 2.创建写数据的文件句柄 3.在接收到服务器返回的数据后,把data写入到创建的空文…...
南阳手机网站推广/优化网站的软件下载
字符串的不可变性 定义一个字符串 String s "abcd";s中保存了string对象的引用。下面的箭头可以理解为“存储他的引用”。 使用变量来赋值变量 String s2 s;s2保存了相同的引用值,因为他们代表同一个对象。 字符串连接 s s.concat("ef"…...
有哪些网站可以做设计挣钱/谷歌google下载安卓版 app
幻灯片 41设d[i,j]为以j项结尾的i段和的最大值, 则需要枚举此段开头y和上一段结尾x, 即d[i,j]max{d[i-1,x] a[y..j]}每次需要枚举x<y<j,决策量为O(n2), 状态为O(nm), 共O(n3m)注意到如果a[j-1]也是本段的, 答案变成为d[i,j-1]a[j], 因此方程优化为d[i,j]max{d[i,j-1]a[j…...
企业做网站的注意事项/河北疫情最新情况
在家用领域当中,无线网络WI-FI成为了我们生活中必不可少的一环。大家在选购路由器的时候经常会看到有的产品会在详情页中标注双频WIFI等字眼,这是什么意思呢?你有了解过吗?其实双频WIFI指的是“支持两个不同频段的无线信号”&…...
做年报的网站/搜索引擎推广是什么意思
Linux命令--du 目录 一、用途 二、命令格式: 三、命令参数 四、实例 一、用途 Linux du命令是查看当前指定文件或目录(会递归显示子目录)占用磁盘空间大小 二、命令格式: du [选项][文件] 三、命令参数 -a或-all 显示目录中个别文件的大小。…...
保安网站建设/销售推广的方法都有哪些
安装时选择试用版,以后每天的剩余天数会减少,找到c盘->用户->administrator删除三个文件(.zend,.zend studio,.zs)即可,.zs往往是隐藏的,这时需要选择 组织->文件夹和搜索选项->查看->显示隐…...