Spring/SpringBoot/SpringCloud面试题

什么是SpringBoot?

SpringBoot是 Spring 开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

SpringBoot有哪些优点?

减少开发,减少测试时间。

使用JavaConfig有助于避免使用XML。

避免大量的Maven导入和各种版本冲突。

提供意见发展方法。

通过提供默认值快速开始开发。

没有单独的Web服务器需要。这意味着你不再需要启动Tomcat,Glassfish或其他任何东西。

需要更少的配置 因为没有web.xml文件。只需添加用@ Configuration注释的类,然后添加用@Bean注释的方法,Spring将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired添加到bean方法中,以使Spring自动装入需要的依赖关系中。

基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序:

-Dspring.profiles.active = {enviornment}。

在加载主应用程序属性文件后,Spring将在 (application{environment} .properties)中加载后续的应用程序属性文件。

SpringBoot的核心配置文件有哪几个?他们的区别是什么呢?

Spring Boot的核心配置文件是application 和 bootstrap 配置文件。

application 配置文件这个容易理解,主要是用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景:

使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;

一些固定的不能被覆盖的属性;

一些加密/解密的场景出现

SpringBoot的配置文件有哪几种格式?他们有什么区别吗?

1.properties 和 .yml,它们的区别主要是书写格式不同。1.properties

app.user.name = javastack

2.yml

app: user: name: javastack

SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?

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

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

@EnableAutoConfiguration:打开自动配置的功能, 也可以关闭某个自动配置的选项,比如关闭数据源自动配置功能:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

@ComponentScan:Spring组件扫描。

SpringBoot核心组件

在这里插入图片描述

开启SpringBoot特性有哪几种方式?

  1. 继承spring-boot-starter-parent项目

  2. 导入spring-boot-dependencies项目依赖

SpringBoot需要独立的容器运行吗?

可以不需要,内置了 Tomcat/ Jetty 等容器。

运行SpringBoot 有哪几种方式?

  1. 打包用命令或者放到容器中运行
  2. 用 Maven/ Gradle 插件运行
  3. 直接执行 main 方法运行

SpringBoot 自动配置原理是什么?

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。

SpringBoot 2.X 有什么新特性?

配置变更

JDK 版本升级

第三方库升级

响应式 Spring 编程支持

HTTP/2 支持

配置属性绑定

如何使用SpringBoot实现分页和排序?

使用Spring Boot实现分页非常简单。
使用Spring Data-JPA可以实现,
将可分页的 org.springframework.data.domain.Pageable 传递给存储库的方法。

什么是YAML?

YAML是一种人类可读的数据序列化语言。

它通常用于配置文件。

与属性文件相比,如果我们想要在配置文件中添加复杂的属性,

YAML文件更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。

SpringBoot 中的监视器是什么呢?

Spring boot actuator是spring启动框架中的重要功能之一。

Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。

有几个指标必须在生产环境中进行检查和监控。

即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。

监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。

如何使用SpringBoot实现异常处理?

Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法。

我们通过实现一个ControlerAdvice类,来处理控制器类抛出的所有异常。

SpringBoot可以兼容老Spring项目吗?如何做?

可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。

保护SpringBoot应用有哪些方法?

在生产中使用HTTPS 使用Snyk检查你的依赖关系

升级到最新版本

启用CSRF保护

使用内容安全策略防止XSS攻击

SpringBoot打成的jar和普通jar有什么区别?

Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。

Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。

普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。

如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。

SpringBoot中如何实现定时任务?

定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。

在 Spring Boot 中使用定时任务主要有两种不同的方式,

一个就是使用 Spring 中的 @Scheduled 注解,

另一个则是使用第三方框架 Quartz。

使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。

使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。

SpringBoot和SpringMVC的区别

  1. 形式上:SpringBoot是一个自动化配置的工具;SpringMVC是一个web框架
  2. 在搭建项目时:SpringMVC需要手动配置xml文件,同时需要配置Tomcat服务器。而SpringBoot采用约定大于配置的方式,进行自动装配,同时内置服务器,打开就可以直接用

简述 Spring Boot Starter 的工作原理

SpringBoot核心就是几个注解:SpringBootConfiguration、EnableAutoConfiguration、ComponentScan,依赖这几个注解完成了所谓自动装配的功能,这个自动装配说简单点就是把你需要的Bean注入到Spring容器里面。(SpringBootApplication 启动类上的注解,只是简单的组合了SpringBootConfiguration、EnableAutoConfiguration、ComponentScan几个注解,避免开发者一个一个的去加)。
SpringBoot程序在启动过程中会解析SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三个注解:

  1. SpringBootConfiguration:包含了Configuration注解,实现配置文件
  2. ComponentScan:指定扫描范围
  3. EnableAutoConfiguration:通过源码可以知道,该注解使用Import引入了AutoConfigurationImportSelector类,而AutoConfigurationImportSelector类通过SpringFactortisLoader加载了所有jar包的MATE-INF文件夹下面的spring.factories文件,spring.factories包含了所有需要装配的XXXConfiguration类的全限定名。XXXConfiguration类包含了实例化该类需要的信息,比如说如果这是个数据源Configuration类,那么就应该有数据库驱动、用户名、密码等等信息。

总结:
SpringBoot并没有想象那么神秘,就是这么几件事情:
1.提供了一个配置类,该配置类定义了我们需要的对象的实例化过程;
2.提供了一个spring.factories文件,包含了配置类的全限定名;
3.将配置类和spring.factories文件打包为一个启动器starter;
4.程序启动时通过加载starter.jar包的spring.factories文件信息,然后通过反射实例化文件里面的类。

Spring Boot 在启动的时候会干这几件事情:

① Spring Boot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。

② 根据 spring.factories 配置加载 AutoConfigure 类

③ 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。

springMVC常用基本组件

1.DispatcherServlet

是SpringMVC框架了里面的前端控制器

作用:统一处理用户发来的请求并和响应,相当于一个中间转换器,减少了各个组件之间的调度,减少的耦合性。

  1. HandlerMapping

是SpringMVC框架里面的处理器映射器

作用:根据请求发来的url 和method找到对应的Handler(就是说在一个用到SpringMVC框架的项目中会有好多方法和逻辑这个组件的作用就是找到对应的方法和组件返回给前端控制器)

3.Handler

是程序员自己创建的控制器

作用:就是程序员自己根据用户的要求写出的逻辑方法为用户提供提供服务(我理解的)

4.HandlerAdaper

是SpringMVC框架提供的 处理器适配器

作用:根据前端控制器传过来的Handler找到自己对用的控制器并执行

(我的理解就是处理器映射器找到对应的方法,但这些方法会需要一下特殊的配置或者参数这个组件作用就是提供并执行的)

5.ViewResolver

是SpringMVC框架提供的 视图解析器

作用:就是字如其名,就是用来将处理的结果解析成视图来展现给用户。视图解析器根据逻辑视图名解析成物理视图名,生成View视图对象,最后对视图进行渲染响应给用户。

6.View

是开发者自己提供的 视图

作用就是,根据model对象的要求来渲染 页面,然后但会给前端控器在相应给用户。

SpringMVC的基本流程

在这里插入图片描述

执行前;当一个请求发来时先进服务器(Tomcat),在服务器中会有拦截器,过滤器啊,等这些功能走完之后,才真正的进入了框架中。

1.用户发来一个请求,首先进入的是前端控制器DispatcherServlet

2.前端控制器将(DispacherServlet)用户发来的请求发送给处理器映射器(HandlerMapping)

3.处理器映射器根据前端控制器发来的用户的请求找到对应符合的控制器(Handler),并且将其封装成处理器执行链,返回给前端控制器。

4.处理器适配器接收到来自前端控制器的执行链后,找到对应执行此执行链的处理器适配器(HandlerAdapter)来调用的具体的控制器(就是说其对应的方法或者逻辑)

5.控制器执行完成后,会返回一个ModelAndView对象给处理器适配器

6.处理器适配器将返回来的ModelAndView对象返回给前端控制器(到这里所有的业务处理过程就要完了,接下就是将结果以页面的的形式相应给用户)

7.前端控制器将返回回来的ModelAndView对象交给视图解析器(ViewResolver),视图解析器根据传过里的View对象解析成对应的页面对象,然后将页面对象和Model对象返回给前端控制器。

8.前端控制器再将返回回来的对象交给视图(View),视图根据传过来的Model对象再一次的对页面进行渲染,然后在返回给前端控制器。

9.前端控制器将完成的结果响应给浏览器,然后浏览器在展现给用户。

### 关于 SpringSpring BootSpring Cloud 的常见面试题 #### 1. **Spring 定时任务支持** 定时任务在实际开发中非常普遍,而 Spring Boot 对定时任务的支持主要来源于 Spring 框架本身的功能[^1]。通过 `@Scheduled` 注解可以轻松实现定时任务的调度。 ```java @Component public class ScheduledTasks { @Scheduled(fixedRate = 5000) public void reportCurrentTime() { System.out.println("当前时间:" + new Date()); } } ``` --- #### 2. **Spring Cloud 版本管理机制** Spring Cloud 是一个综合性框架,其由多个子项目组成,各个子项目的发布周期可能不同。因此,为了统一管理和协调版本依赖关系,Spring Cloud 提供了一个 BOM(Bill of Materials),即版本清单文件[^2]。开发者可以通过引入该清单来简化依赖管理。 ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR12</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` --- #### 3. **Spring Boot 启动类的关键注解** 在 Spring Boot 应用程序中,启动类通常需要添加 `@SpringBootApplication` 或者 `@EnableAutoConfiguration` 注解[^3]。这两个注解的核心作用在于自动扫描包路径下的组件并完成必要的配置初始化工作。 ```java @SpringBootApplication(scanBasePackages = {"com.example"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- #### 4. **Spring Boot 中 YAML 文件的优势** 相比于传统的 `.properties` 配置文件,YAML 文件因其结构化的特性,在处理复杂嵌套配置时更具优势[^4]。它能够清晰地表达层次化数据,并减少冗余字符带来的干扰。 ```yaml server: port: 8081 servlet: context-path: /app ``` --- #### 5. **Spring Security 过滤器链的工作原理** Spring Security 的核心组成部分之一是安全过滤器链(Security Filter Chain)。这条链包含了多个过滤器,每个过滤器都承担特定职责,例如认证请求、授权访问等[^5]。默认情况下,Spring Security 自带了多达 15 种标准过滤器。 以下是一些重要的过滤器及其功能概述: - **UsernamePasswordAuthenticationFilter**: 负责基于表单登录的身份验证。 - **ExceptionTranslationFilter**: 处理异常并将未授权或未经身份验证的请求转换为适当响应。 - **FilterSecurityInterceptor**: 执行方法级和 URL 级别的权限控制。 --- #### 6. **解决方案总结** 针对上述技术栈中的问题,解决思路如下: - 如果遇到定时任务无法正常运行的情况,需确认是否正确启用了 `@EnableScheduling` 并检查线程池设置。 - 在使用 Spring Cloud 时,建议始终遵循官方推荐的兼容性矩阵以避免版本冲突。 - 当面对复杂的多模块应用时,合理利用 YAML 文件分层配置能力可显著提升维护效率。 - 若发现安全性漏洞,则应深入分析现有过滤器链逻辑是否存在缺失环节,并按需扩展自定义过滤器。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值