当前位置: 首页 > news >正文

Java面试题———SpringBoot篇

目录

1、项目中为什么选择SpringBoot

2、SpringBoot的自动装配原理

3、SpringBoot的核心注解是哪个

4、SpringBoot中的starter是干什么的

5、SpringBoot可以有哪些方式加载配置

6、bootstrap.yml和application.yml有何区别

7、SpringBoot读取配置的方式有几种

8、SpringBoot项目如何热部署

9、SpringBoot项目如何实现方法的异步调用

10、SpringBoot中如何实现定时任务

11、SpringBoot中如何解决跨域问题

12、如何理解拦截器

13、拦截器和过滤器的区别是什么


1、项目中为什么选择SpringBoot

SpringBoot简化了Spring,可以快速搭建企业级项目,而且开发起来效率也会更高,它的主要优点如下:

  1. 版本锁定:SpringBoot在父工程中进行了大量常见依赖的版本锁定,省去了我们查找依赖版本和解决版本冲突的麻烦

  2. 起步依赖:SpringBoot以功能化的方式将需要的依赖进行组装,并且允许程序员以starter的方式进行引入

  3. 默认配置:SpringBoot实现了大量依赖框架的默认配置项,程序员无须再进行自己配置

  4. 内置Tomcat:SpringBoot内置了一个tomcat,使用它开发的程序无需再进行tomcat部署,可直接运行

2、SpringBoot的自动装配原理

Springboot自动装配主要是基于注解编程和约定优于配置的思想来进行设计的

自动装配就是自动地把其他组件中的Bean装载到IOC容器中,不需要开发人员再去配置文件中添加大量的配置

我们只需要在SpringBoot的启动类上添加一个@SpringBootApplication的注解,就可以开启自动装配

SpringBootApplication底层最重要的一部分是@EnableAutoConfiguration这个注解来实现的,它作用是:

  1. 读取所有jar包/META-INF/spring.factories文件中EnableAutoConfiguration键对应的值

  2. 这些值必须声明为Spring的配置类,也就是在类中需要向Spring容器放入对象

  3. 为了防止非当前所需的组件进入到容器,配置类中需要使用@Conditional注解来声明配置成立的必要条件

3、SpringBoot的核心注解是哪个

SpringBoot的核心注解在启动类上,叫@SpringBootApplication,主要组合包含了以下3个注解:

  1. @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能

  2. @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项

  3. @ComponentScan:Spring组件扫描,默认会扫描启动类所在的包

4、SpringBoot中的starter是干什么的

当项目足够复杂时,因为涉及的组件太多了,就需要引入很多的依赖,此时管理依赖就边的很麻烦

此时SpringBoot的starter就派上用场了,每个starter都可以为我们提供某个服务场景所需要的一系列依赖

在导入starter之后,SpringBoot主要帮我们完成了两件事情:

  1. 相关组件的自动导入

  2. 相关组件的自动配置

5、SpringBoot可以有哪些方式加载配置

SpringBoot支持很多种方式加载配置,常见有

  1. 配置文件,直接在项目中提供SpringBoot支持的配置文件,比如properties、yaml 、yml

  2. 系统环境变量,SpringBoot是可以读取系统环境变量中的配置信息的,但不推荐这么做

  3. 命令行参数,SpringBoot在项目启动的时候运行通过命令行直接传递参数,一般用于临时修改配置的情况

6、bootstrap.yml和application.yml有何区别

这是SpringBoot支持的两个核心配置文件,区别点在于

  1. boostrap比applicaton优先加载,在应用程序上下文的引导阶段生效,且里面的属性不能被覆盖

    一般来说我们在SpringCloud Config或者Nacos中会用到它

  2. application用于SpringBoot项目的自动化配置,一般来说我们会将自己项目的业务配置项写在这里面

7、SpringBoot读取配置的方式有几种

SpringBoot常见的读取配置信息的方式有两种:

  1. 使用@Value配合EL表达式(@Value("${name}"))注解直接注入对应的值

  2. 使用@ConfigurationProperties注解把对应的值绑定到一个配置对象,然后将配置对象注入到需要的地方

推荐使用使用第二种方式,在配置比较多的情况下,操作简单,可读性好

8、SpringBoot项目如何热部署

Spring Boot有一个开发工具(DevTools)模块,通过它可以实现SpringBoot项目的热部署

也就是开发人员将文件更改后,它会自动部署到服务器并自动重启服务器。

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>

9、SpringBoot项目如何实现方法的异步调用

异步调用指的是a方法在调用b方法的时候,无需等待b方法执行完毕,就可以继续向下执行

一般用在a方法无需使用b方法返回结果的场景下,可以在一定程度上提高运行效率

在SpringBoot中使用异步调用是很简单的,只需要做两个操作就可以了

  1. 在启动类上添加@EnableAsync注解,开启异步调用支持

  2. 在被调用的方法上添加@Async注解

 controller-a(){代码1 service-a()代码3 }​@Asyncservice-a(){}

10、SpringBoot中如何实现定时任务

在SpringBoot中使用定时任务主要有两种方式,一个就是使用SpringTask,另一个则是使用第三方框架Quartz

SpringTask主要是通过@Scheduled注解来实现定时任务触发的,格式如下

 @Scheduled(fixedRate = 5000)public void printTime() {System.out.println(new Date().toLocaleString());}

主要属性如下:

  • fixedRate:按一定的频率执行任务,参数类型为long,单位 ms

  • fixedDelay:上一次任务执行完后多久再执行,参数类型为long,单位 ms

  • initialDelay:延迟多久再第一次执行任务,参数类型为 long,单位 ms

  • cron:使用cron表达式指定任务在特定时间执行

11、SpringBoot中如何解决跨域问题

跨域是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制

当浏览器从一个域名的网页去请求另一个域名的资源时,出现域名、端口、协议任一不同,都属于跨域

SpringBoot解决跨域很简单,执行添加一个配置类实现WebMvcConfigurer接口然后重写addCorsMappings方法即可

 @Configurationpublic class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*")//允许跨域访问的路径.allowCredentials(true).allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")//运行跨越的请求方式.maxAge(3600);}}

12、如何理解拦截器

拦截器是Spring提供的一种拦截机制,目的是实现对指定请求路径进行拦截,然后做成指定的处理

自定义一个拦截器需要实现HandlerInterceptor,并重写接口中定义的3个方法

  1. preHandle: 这个方法在Controller处理请求之前被调用,通过方法的返回值可以确定是否放行请求

  2. postHandle:这个方法在Controller处理请求之后被调用

  3. afterCompletion:这个方法将在整个请求结束之后被调用,此方法主要用于进行资源清理

13、拦截器和过滤器的区别是什么

拦截器和过滤器都可以实现请求的拦截处理,不同点有下面几个:

  1. 技术栈所属不同:过滤器属于JavaWeb技术,依赖Servlet容器;而拦截器是属于Spring的技术

  2. 实现原理不同:拦截器是基于Java的反射机制,而过滤器是基于函数回调

  3. 拦截范围不同:过滤器可以拦截所有请求,而拦截器主要是针对发往controller请求

  4. 拦截位置不同:过滤器在前端控制器前拦截行,而拦截器在前端控制器后拦截

相关文章:

Java面试题———SpringBoot篇

目录 1、项目中为什么选择SpringBoot 2、SpringBoot的自动装配原理 3、SpringBoot的核心注解是哪个 4、SpringBoot中的starter是干什么的 5、SpringBoot可以有哪些方式加载配置 6、bootstrap.yml和application.yml有何区别 7、SpringBoot读取配置的方式有几种 8、Spring…...

模块化沙箱:构建零信任架构的关键技术

在数字化时代&#xff0c;数据安全成为了企业和机构关注的焦点。模块化沙箱作为一种创新的数据安全解决方案&#xff0c;正逐渐成为保护敏感信息的有力工具。深信达模块化沙箱&#xff0c;凭借其高灵活性和高扩展性&#xff0c;为不同安全需求提供了定制化的解决方案。 模块化沙…...

10.14学习日志

一.矩阵 接上篇 11.伴随矩阵 设 A 是一个 nn 的方阵&#xff0c;其元素为 aij。伴随矩阵 adj(A)或A* 是一个 nn的矩阵&#xff0c;其第 i 行第 j 列的元素是 A 的余子式 Mji 的代数余子式 Cji&#xff0c;即&#xff1a; 其中 Mji是 A 的第j 行第i 列元素的余子式&#xff0…...

“我们为什么缺少科学精神”演讲内容拆解

演讲人张双南&#xff0c;视频链接&#xff1a; https://tv.cctv.com/2017/04/23/VIDEdqzdpmxStYXAmYBdgDP7170423.shtml...

openpyxl 3.0.7 中文教程

openpyxl 3.0.7 中文教程 python Execl 处理库教程 https://openpyxl-chinese-docs.readthedocs.io/zh-cn/latest/tutorial.html#id2 案例&#xff1a; 生成表格&#xff0c;设置单元格样式 from openpyxl import Workbook from openpyxl.styles import Font, Border, Side, …...

idea开发工具使用

idea开发工具使用 1.idea下载 2.idea设置 字体 编码格式 换行 忽略大小写 自动导包 各方法之间加横线 3.快捷键 4.导入工程 5.安装scala插件 6.运行代码 7.导入jar包 8.git托管 9.打jar包...

Android map 获取值

Android Map 获取值的完整指南 在Android开发中&#xff0c;使用Map&#xff08;映射&#xff09;来存储和检索数据是非常常见的需求。Map是一种键值对集合&#xff0c;能够快速而高效地根据特定的键获取值。在这篇文章中&#xff0c;我们将深入探讨如何在Android应用中使用Ma…...

Leetcode.13 罗马数字转整数

关键词&#xff1a;to_string, string.size(), string.length() 1.题目 2.解答思路及解答 解答思路&#xff1a; 首先&#xff0c;罗马数字表达中和常规数学表达类似&#xff0c;基本是按照从后往前&#xff0c;从小到大排列。因此&#xff0c;理论上只需要从后往前相加即可。…...

骨架提取(持续更新)

一 什么是骨架提取 1.1 简介 骨架提取是图像处理或计算机视觉中的一种技术&#xff0c;用于从二值化图像中提取物体的中心线或轮廓&#xff0c;通常称为“骨架”或“细化图像”。这一技术主要用于简化形状表示&#xff0c;同时保留物体的拓扑结构。 这里我们强调了&#xff…...

B3622 枚举子集

1. 注意dfs内&#xff0c;for循环的遍历&#xff0c;想清楚把什么赋值给a[x] 2.本题只需要把0或1赋值给a[x]所以 #include<bits/stdc.h> using namespace std; int n; int a[20]; int vis[20]; void pr() {for (int i 1; i < n; i) {if (a[i] 0)cout << N;els…...

git submodule add用法

背景 介绍 git submodule add 命令用于将一个 Git 仓库作为子模块添加到另一个 Git 仓库中。子模块是一个独立的 Git 仓库&#xff0c;但它被嵌套在另一个 Git 仓库中&#xff0c;并且可以通过主仓库进行管理。当你需要在主项目中引用另一个项目&#xff08;子模块&#xff09…...

计算机毕业设计 基于Python的汽车销售管理系统的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

主流的安全测试工具知识点

1. 静态应用安全测试&#xff08;SAST&#xff09;工具 工具示例: SonarQube: 支持多种编程语言的代码质量和安全分析。Checkmarx: 提供全面的代码扫描和漏洞检测。知识点: 分析源代码或二进制代码以发现潜在的安全漏洞。早期发现和修复代码中的安全问题&#xff0c;减少修复成…...

如何接入实时期货行情数据 - 2024最新教程

期货市场通过标准化合约的交易&#xff0c;为投资者提供了在大宗商品、金融工具等方面进行风险对冲和投机的机会。量化交易以计算机模型为核心&#xff0c;通过历史数据和实时数据进行分析和策略执行&#xff0c;减少人为情绪对交易的干扰。由于期货市场的波动性强且价格变化迅…...

通义灵码:AI 编码的强大助力

一、通义灵码简介 通义灵码是阿里云推出的智能编码辅助工具&#xff0c;以通义大模型为基础&#xff0c;提供多种强大功能助力开发者高效编码。 通义灵码集成了行级 / 函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等…...

docker 容器启动详解

1.启动容器 示例 1&#xff1a;启动一个复杂的 Web 应用容器 docker run -d \ -p 8080:80 \ -v /data/webapp:/app \ -e APP_ENVproduction \ -e DB_HOSTdb.example.com \ -it \ --network my_network \ --name webapp_container \ --restart always \ --memory 1g \ --cpu-sh…...

【spring ai】java 实现RAG检索增强,超快速入门

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;一个常见的问题是模型会产生幻觉&#xff08;即生成的内容与事实不符&#xff09;&#xff0c;同时由于缺乏企业内部数据的支持&#xff0c;导致其回答往往不够精准和具体&#xff0c;偏向于泛泛而谈。这些问题…...

【Java SE 题库】递归的魅力之--> 汉诺塔问题

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 分析 2.1 图解 2.2 代码解析 3. 完整代码 3.1 运行截图 4. 小结 1. 题目 汉诺塔问题是一个经典的递归问题&#xff0c;源自一个古老的印度传…...

《为什么要在三层交换机 VLAN 上配置 IP 地址?》

如果在三层交换机上划分了 VLAN10 和 VLAN20 但没有给 IP 地址的情况下&#xff0c;只有相同 VLAN 的端口之间才能相互通信。 这是因为在没有为 VLAN 配置 IP 地址&#xff08;即没有创建 SVI&#xff0c;交换虚拟接口&#xff09;时&#xff0c;三层交换机仅作为一个二层设备…...

Git的基本使用入门

参考&#xff1a;Git速查 git的基本概念 git常用命令大部分是基于三大分区来执行的。先来了解一些专有名词吧。 工作区&#xff0c;也叫 Working Directory暂存区&#xff0c;也叫 stage&#xff0c;index版本库&#xff0c;也叫本地仓库&#xff0c;commit History 将代码推…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...