学透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 {
    @Bean
    public 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.jsp
        modelAndView.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")
    @ResponseBody
    public 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 {
    @Autowired
    private 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 {
    @Autowired
    private 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 {
    @Override
    public void processPayment(double amount) {
        System.out.println("Processing payment via PayPal: $" + amount);
    }
}
@Component
@Qualifier("creditCard")
public class CreditCardPaymentProcessor implements PaymentProcessor {
    @Override
    public void processPayment(double amount) {
        System.out.println("Processing payment via Credit Card: $" + amount);
    }
}

这个接口有两个实现类,这时候需要使用 @Qualifier 指定使用哪个实现类。

@Service
public class PaymentService {
    @Autowired
    @Qualifier("paypal") // 指定注入 PaypalPaymentProcessor 类型的 Bean
    private 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 的注入歧义性时不太方便。

思维导图

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图解PyTorch中的torch.gather函数和 scatter 函数

前言 torch.gather在目前基于 transformer or query based 的目标检测中&#xff0c;在最后获取目标结果时&#xff0c;经常用到。 这里记录下用法&#xff0c;防止之后又忘了。 介绍 torch.gather 官方文档对torch.gather()的定义非常简洁 定义&#xff1a;从原tensor中获…

[Java基础揉碎]注解

目录 介绍 基本的Annotation介绍 1) Override:限定某个方法&#xff0c;是重写父类方法,该注解只能用于方法 2) Deprecated: 用于表示某个程序元素(类&#xff0c;方法等)已过时 3) SuppressWarnings:抑制编译器警告 四大元注解 ​编辑 Retention ​编辑​编辑 Docume…

【MySQL】MySQL故障排查与环境优化

案例 MySQL是目前企业最常见的数据库之一 日常维护管理的过程中&#xff0c;会遇到很多故障 mysql默认配置无法满足高性能要求 数据流向 MySQL常见的故障案例 故障一 故障现象&#xff1a; ERROR 2002 (HY000): Cant connect to local MySQL server through socket data/m…

【计算机网络】select/poll

多路转接 - select/poll 一、I/O 多路转接之 select1. select 接口2. select 的使用3. select 的优缺点 二、I/O 多路转接之 poll1. poll 接口2. poll 的使用3. poll 与 select 的对比 一、I/O 多路转接之 select 多路转接属于 IO 复用方式的一种。系统提供 select() 函数来实…

如何在 Mac 上恢复已删除的数据

如果您丢失了 Mac 上的数据&#xff0c;请不要绝望。恢复数据比您想象的要容易&#xff0c;并且有很多方法可以尝试。 在 Mac 上遭受数据丢失是每个人都认为永远不会发生在他们身上的事情之一......直到它发生。不过&#xff0c;请不要担心&#xff0c;因为您可以通过多种方法…

数据结构(六)——图的应用

6.4 图的应用 6.4.1 最小生成树 对于⼀个带权连通⽆向图G (V, E)&#xff0c;⽣成树不同&#xff0c;每棵树的权&#xff08;即树中所有边上的权值之和&#xff09;也可能不同。设R为G的所有⽣成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称为G的…

解析网约车微服务中台架构:打造智能高效的出行平台

随着互联网技术的不断发展&#xff0c;网约车行业已经成为了城市出行的重要方式之一。为了应对市场竞争和用户需求的不断变化&#xff0c;各大网约车平台纷纷采用了微服务中台架构&#xff0c;以构建智能高效的出行平台。本文将深入探讨网约车微服务中台架构的核心概念、关键特…

反序列化漏洞

常见的反序列化流量特征&#xff1a; 像这种st2 045、068、shiro反序列化、fastjson这些java反序列化一类的流量特征 shiro就看cookie中Rememberme字段&#xff0c;什么都要从这里传 fastjson&#xff1a;可以在提交的包中找找json格式的数据&#xff0c;重点看一下有无rmi或…

【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!

操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…

记录Xshell使用ed25519公钥免密链接SSH

试了半天&#xff0c;Xshell好像没办法导入linux生成的ssh公钥,因此需要以下步骤实现免密登录 结论&#xff0c;在linux公钥文件中&#xff0c;将客户端生成的ed25519公钥加上去即可(一个公钥单独一行) 1.使用Linux生成秘钥文件(不需要输入私钥密码passphrase)或者直接创建一…

【css】文本过长溢出一行不换行普通css以及antd实现

.text-box { white-space: nowrap; /* 防止文字换行 */ overflow: hidden; /* 隐藏超出div的内容 */ text-overflow: ellipsis; /* 当内容超出时&#xff0c;显示省略号 */ max-width: calc(100% - 80px); /* 假设按钮宽度为80px&#xff0c;则设置div的最大宽度为容器宽度…

【企业管理精粹】华为腾讯全套人力资源管理精品资料合集

以下是华为&腾讯全套人力资源管理资料目录&#xff0c;如需下载&#xff0c;请前往星球下载&#xff0c;海量免费资料等你领取&#xff1a; 华为全套企业管理资料合集&#xff0c;共23专题。 1.绩效考核 华为内训绝密资料:绩效管理与绩效考核.ppt 华为绩效管理与绩效考核制…

软考高级架构师;线程的同步和互斥、临界区、临界资源、信号量、PV 操作概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

信息系统项目管理师——第15章项目风险管理

本章节内容属于10大管理知识领域&#xff0c;选择、案例、论文都会考。 选择题&#xff0c;稳定考3分左右&#xff0c;新教材基本考课本原话&#xff0c;这个分不能丢。 案例题&#xff0c;本期考的概率中等。 论文题&#xff0c;202305刚考过&#xff0c;这期不会考。 1管理基…

基于SSM的“电费管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“电费管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM,VUE 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统登录页面 用户列表信息页面 添加用户信…

mkcert生成ssl证书+nginx部署局域网内的https服务访问问题

文章目录 mkcert生成ssl证书nginx部署局域网内的https服务访问问题1、下载mkcert查看自己的电脑是arm还是amd架构 2、安装mkcert3、测试mkcert是否安装成功4、查看CA证书存放位置5、打开windows的证书控制台6、生成自签证书,可供局域网内使用其他主机访问以下是nginx部署https服…

财富池指标公式--通达信免费指标公式源码合集--第二期

财富池免费通达信指标公式源码第二期来啦&#xff0c;今天给大家分享3个不同功能用法的指标&#xff0c;如果大家想要小编发布什么类型的指标&#xff0c;请多多在评论区留言呀&#xff01; 一、通达信犀牛王指标公式 当在0轴线上出现蓝色加玫红色柱的信号时&#xff0c;是上涨…

LeetCode:331. 验证二叉树的前序序列化(模拟 Java)

目录 331. 验证二叉树的前序序列化 题目描述&#xff1a; 实现代码与解析&#xff1a; 模拟 原理思路&#xff1a; 331. 验证二叉树的前序序列化 题目描述&#xff1a; 序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节…

JAV八股--redis

如何保证Redis和数据库数据一致性 关于异步通知中消息队列和Canal的内容。 redisson实现的分布式锁的主从一致性 明天继续深入看这个系列问题 介绍IO复用模型

5个网络基础概念

说到网络&#xff0c;有五大基础概念是不得不提的&#xff0c;IP地址&#xff0c;子网掩码、网关、DHCP服务和PPPoE拨号&#xff0c;这些都是日常做电脑或路由器网络配置经常用到的&#xff0c;相信很多人都听过这些概念念&#xff0c;也知道都是一串串数字&#xff0c;但具体是…