学透Spring Boot 003 —— Spring 和 Spring Boot 常用注解(附面试题和思维导图)

这是 学透 Spring Boot 专栏 的第三篇,欢迎关注我,与我一起学习和探讨 Spring Boot 相关知识,学透 Spring Boot。

从面试题说起

今天我们通过一道和Spring Boot有关的常见面试题入手。

面试题:说说 Spring Boot 中有哪些常用注解?

Spring Boot 项目中我们常用的几个注解有:

  1. @SpringBootApplication:这个注解一般定义在我们项目的启动类上,表示这是项目的入口
  2. @EnableAutoConfiguration:这个注解用来启用 Spring Boot 的自动配置机制,这样就可以根据项目的依赖自动配置 Spring 应用程序
  3. @ConfigurationProperties:这个注解可以把指定的前缀配置项的值绑定到某个JavaBean上
  4. @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 的注入歧义性时不太方便。

思维导图

最后附上思维导图
在这里插入图片描述

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

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

相关文章

13.Python图形用户界面

我们之前的程序运行结果都被输出到命令提示符&#xff08;终端&#xff09;窗口&#xff0c;界 面比较简陋。本章讲解如何将其输出到图形界面。 1 Python中的图形用户界面开发库 注Qt是一个跨平台的C应用程序开发框架&#xff0c;被广泛用于开发GUI 程序&#xff0c;也可用于开…

OSPF协议详解

静态缺点 1、中大型复杂网络----配置量大 2、不能实时收敛 动态-----可以实时收敛 IGP----内部网关路由协议 RIP OSPF EIGRP ISIS EGP----外部网关路由协议 BGP IGP &#xff08;选路佳 占用资源 收敛快&#xff09;----一个协议好需满足这三个 距离矢量 DV RIP…

node.js的模块化 与 CommonJS规范

一、node.js的模块化 (1)什么是模块化&#xff1f; 将一个复杂的程序文件依据一定的规则拆分成为多个文件的过程就是模块化 在node.js中&#xff0c;模块化是指把一个大文件拆分成独立并且相互依赖的多个小模块&#xff0c;将每个js文件被认为单独的一个模块&#xff1b;模块…

HDLbits 刷题 -- Alwaysblock2

学习&#xff1a; For hardware synthesis, there are two types of always blocks that are relevant: Combinational: always (*)Clocked: always (posedge clk) Clocked always blocks create a blob of combinational logic just like combinational always blocks, but…

基于ArgoCD和Testkube打造GitOps驱动的Kubernetes测试环境

本文介绍了一项新工具&#xff0c;可以基于Gitops手动或者自动实现Kubernetes集群应用测试&#xff0c;确保集群的健康状态与Git仓库定义的一致。原文: GitOps-Powered Kubernetes Testing Machine: ArgoCD Testkube 简介&#xff1a;GitOps 云原生测试面临的挑战 现代云原生应…

[蓝桥杯 2014 省 A] 波动数列

容我菜菲说一句&#xff0c;全网前排题解都是rubbish&#xff0c;当然洛谷某些也是litter 不好意思&#xff0c;最近背单词背了很多垃圾的英文&#xff0c;正题开始 [蓝桥杯 2014 省 A] 波动数列 题目描述 输入格式 输入的第一行包含四个整数 n , s , a , b n,s,a,b n,s,a…

iPhone设备中定位应用程序崩溃问题的日志分析技巧

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

蓝桥杯刷题day13——玩游戏【算法赛】

一、问题描述 小 A 和小 B 两个人在海边找到了 n 个石子&#xff0c;准备开始进行一些游戏&#xff0c;具体规则如下&#xff1a;小 B 首先将 n 个石子分成若干堆&#xff0c;接下来从小 A 开始小 A 和小 B 轮流取石子&#xff0c;每次可以任选一堆石子取走任意个&#xff0c;…

Linux中JMeter的使用

Linux中JMeter的使用 Linux版本JMeter安装 # 1、下载、安装JMeter 如果有安装包直接上传即可 wget -c https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.1.tgz # 解压 tar -zxvf apache-jmeter-5.4.1.tgz -C /usr/local/sjdwz_test cd /usr/local/sjdwz_t…

数据分析之Tebleau可视化:折线图、饼图、环形图

1.折线图的绘制 方法一&#xff1a; 拖入订单日期和销售金额&#xff0c;自动生成一个折线图 方法二&#xff1a; 选中订单日期和销售金额&#xff08;摁住ctrl可以选择多个纬度&#xff09; 点击右边的智能推荐&#xff0c;选择折线图 2.双线图的绘制、双轴的设置 方法一&…

【Jmeter+Influxdb+Grafana性能监控平台安装与部署】

JmeterInfluxdbGrafana性能监控平台安装与部署 前言Influxdb安装与连接Jmeternfluxdb下载&#xff08;winodws&#xff09;Grafana安装与配置 前言 我们在性能测试过程中&#xff0c;在需要较大并发时&#xff0c;为了尽量避免使用GUI界面来节省资源&#xff0c;通常使用命令行…

python+vue访客预约登记系统-数据可视化echart大屏

为了系统的完整&#xff0c;必须要有可行性分析的&#xff0c;系统的可行性关系到生存问题&#xff0c;分析其意义可否利用本系统来弥补线下管理模式中的不足之处等&#xff0c;通过本系统来减少工作量&#xff0c;使管理者与用户的工作和管理效率更高。对此体现出更多的意义和…

基于深度学习的端到端自动驾驶的最新进展:调研综述

基于深度学习的端到端自动驾驶的最新进展&#xff1a;调研综述 附赠自动驾驶学习资料和量产经验&#xff1a;链接 论文链接&#xff1a;https://arxiv.org/pdf/2307.04370.pdf 调研链接&#xff1a;https://github.com/Pranav-chib/ 摘要 本文介绍了基于深度学习的端到端自…

一次生产docker MTU=1500问题排查解决

和业务方进行联调&#xff0c;业务方调用我方服务&#xff0c; 我方服务部署在虚拟机的docker容器中 提供grpc服务&#xff0c; 通过公网vip lvs到宿主机端口 联调发现 ping 和 telnet我方端口都正常&#xff0c; 但是通过grpc协议调用不通&#xff0c;一直超时 在容器上和lv…

构建安全高效的用户登录系统:登录流程设计与Token验证详解

在当今数字化时代&#xff0c;用户登录系统是几乎所有在线服务的基础。然而&#xff0c;随着网络安全威胁的不断增加&#xff0c;设计一个安全可靠的登录系统变得至关重要。本文将深入探讨用户登录流程的设计原则以及Token验证的实现方式&#xff0c;带您了解如何构建安全高效的…

基于DCT和扩频的音频水印嵌入提取算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ......................................................................... N 10; %嵌入一…

RTOS中临界区嵌套保护的实现原理(基于RT-Thread)

0 前言 什么是临界区&#xff08;临界段&#xff09;&#xff1f; 裸机编程中由于不涉及线程和线程切换&#xff0c;因此没有临界区这一个概念。在RTOS中由于存在线程切换等场景&#xff0c;便有了临界区这个概念。简单来说&#xff0c;临界区就是不允许被中断的代码区域。什么…

在 Three.js 中,`USDZExporter` 类用于将场景导出为 USDZ 格式,这是一种用于在 iOS 平台上显示增强现实(AR)内容的格式。

demo 案例 在 Three.js 中&#xff0c;USDZExporter 类用于将场景导出为 USDZ 格式&#xff0c;这是一种用于在 iOS 平台上显示增强现实&#xff08;AR&#xff09;内容的格式。下面是关于 USDZExporter 的入参、出参、方法和属性的讲解&#xff1a; 入参 (Parameters): sc…

HTTP和HTTPS谁传输数据更安全?

1.HTTP HTTP在传输数据时&#xff0c;通常都是明文传输&#xff0c;也就是传输的数据没有进行加密。在这种情况下&#xff0c;如果传输的是一些敏感数据&#xff0c;比如某银行卡密码&#xff0c;就很容易被别人截获到&#xff0c;这就对我们的个人利益产生了威胁。 HTTP传输数…

Mysql数据库故障排查与优化

目录 前言 一、Mysql数据库的单实例故障 1.故障一——拒绝连接数据库 1.1故障内容 1.2问题分析 1.3解决方法 2.故障二——密码错误 2.1故障内容 2.2问题分析 2.3解决方法 3.故障三——数据库处理较慢 3.1故障内容 3.2问题分析 3.3解决方法 4.故障四——数据库表…