走进舒适圈の小窝

Loading...

Java框架 —— SpringBoot(面试)

什么是SpringBoot

Spring Boot 是 基于 Spring 框架 的快速开发脚手架,旨在简化 Spring 应用的初始搭建和配置流程。它的核心设计理念是 “约定优于配置”,通过默认配置和自动化机制,让开发者能够快速构建生产级应用,而无需过多关注复杂的 XML 配置或环境依赖。

SpringBoot的优点

  • 自动配置:根据项目的依赖关系自动配置 Spring 框架

  • 内嵌服务器:内嵌Tomcat或Jetty、 Undertow 等Servlet容器;

  • 开箱即用:SpringBoot提供了许多默认的配置和模版,使开发者可以快速上手

  • 提供可选的starter,简化应用整合:场景启动器(starter):web、json、邮件、oss(对象存储)、异步、定时任务、缓存...

  • 开发工具支持:支持自动重启、热部署

SpringBoot的核心注解

@SpringBootApplication注解包含了三个注解:

  • @SpringBootConfiguration:包含了@Configuration注解,实现配置文件的功能

  • @EnableAutoConfiguration:启动自动配置,也可以关闭某个自动配置的选项

  • @ComponentScan:Spring组件臊面

Java Config

提供了配置Spring IOC容器的纯Java方法,优点:

  • 面向对象的配置:是Java类,用户可以充分利用Java的面向对象功能,一个配置类可以继承另一个,重写它的@Bean方法

  • 减少或消除XML配置

  • 类型安全和重构友好:JavaConfig提供了一种安全的方法来配置Spring容器,可以按照类型而不是按照名称来检索,不需要进行强转或者基于字符串的查找

自动配置原理

  Spring Boot的自动装配机制是其核心特性之一,它允许开发者通过引入相应的Starter依赖,自动配置Spring应用程序中所需的bean,从而大大减少了手动配置的工作量。这一机制的实现主要依赖于@SpringBootApplication注解,它包含了@Configuration@EnableAutoConfiguration@ComponentScan三个关键注解。其中,@EnableAutoConfiguration注解负责启用自动配置功能,它会根据项目的依赖关系和类路径中的jar包来自动注册所需的bean。,Spring Boot会通过SpringFactoriesLoader类读取META-INF/spring.factories文件中的配置,找到所有自动配置类的全路径名,并利用ImportSelector接口实现对这些配置类的动态加载。这些自动配置类通常位于第三方jar包中,并使用了@Configuration@Bean注解来声明要装配到IOC容器的bean对象。

配置文件加载顺序

  1. 命令行参数配置

  2. 项目名/config/配置文件

  3. 项目名/配置文件

  4. src/main/resources/config/配置文件

  5. src/main/resources/配置文件

SpringBoot的核心配置文件

SpringBoot的两个核心配置文件:

  • bootstrap:由父ApplicationContext加载,比Application优先级高,配置在应用程序上下文的引导阶段生效,一般会在Spring Cloud Config中用,且其属性不会被覆盖

  • applicantion:由ApplicationContext加载,用于SpringBoot的自动化配置

Spring profile

  Spring Profile 是 Spring 框架的核心特性之一,它允许开发者将 Bean 映射到不同的环境配置中,如开发(dev)、测试(test)和生产(prod)环境。通过在不同环境中激活特定的 Profile,可以确保只加载当前环境所需的 Bean。

Spring Security 和 Shiro

  • Shiro比Spring Security更容易使用,也就是实现上简单一些

  • Spring Security社区支持度更高,支持力度和更新维护上有优势,同时和Spring这一套的结合较好。

  • Shiro 功能强大、且 简单、灵活。是Apache 下的项目比较可靠,且不跟任何的框架或者容器绑定,可以独立运行。

Spring Boot 中如何解决跨域问题

跨域可以在前端通过JSONP来解决,但是JSONP只能发送GET请求,无法发送其他类型的请求,在Restful风格的应用中,比较鸡肋

  • 添加@CrossOrigin注解

  • 添加CORS过滤器

  • 实现WebMvcConfigurer,重写addCorsMappings方法

  • 引入Spring Security(引入后,第一种和第三种会失效,这两种方案的原理是使用Spring中的拦截器,过滤器的执行顺序在拦截器之前,加入Spring Security后,会引入很多过滤器,导致之前的配置失效,想要让第二种方式生效,需要使用@Order注解指定顺序)

什么是 CSRF 攻击

CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

简单来说就是,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作(如转账和购买商品))。因为浏览器之前认证过,所以被访问的站点会觉得这是真正的用户操作而去运行。

SpringBoot中的监视器

用于监控和管理SpringBoot应用程序的工具集。通过Spring boot actuator,可以在应用运行过程中查看健康状态、指标、应用配置、环境变量等信息,通过它,我们可以更方便的进行应用的监控、调试、诊断和管理,其公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态

如何在 Spring Boot 中禁用 Actuator 端点安全性

默认情况下,Actuator 的端点由 Spring Security 保护,所有敏感的HTTP端口都是安全的,只有 Actuator 角色的用户可以访问它们,可以通过以下方式来禁用:

  • 通过完全排除 Spring Security 来禁用安全性

  • 通过自定义的 Spring Security 配置来禁用 Actuator 端点的安全性,保留其他部分的安全性保护

  • 通过配置文件暴露特定的端点,限制暴露的敏感信息

如何监视所有的 SpringBoot 微服务

  • 通过 SpringBoot Actuator

SpringBoot Actuator 中提供了很多内置的监控功能,可以通过启动 Actuator 来暴露端点,查看应用的健康状况、内存使用情况、线程情况

  • 集中化日志管理

配置日志格式化,使得可以区分不同微服务的日志信息,并且日志信息能够包含请求链路信息

  • 分布式追踪

使用 Spring Cloud Sleuth 与 Zipkin 或者 Jaeger 集成来跟踪请求的流向,查看请求在各个微服务中的执行过程

  • 监控工具

Prometheus:可以与 Spring Boot 集成,定期收集应用程序的性能指标

Grafana:Prometheus 数据的可视化工具,能够创建实时监控仪表盘

什么是 WebSockets

WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道

  1. WebSocket 是双向的 -使用 WebSocket 客户端或服务器可以发起消息发送

  2. WebSocket 是全双工的 -客户端和服务器通信是相互独立的

  3. 单个 TCP 连接 -初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有未来的通信

  4. Light -与 http 相比,WebSocket 消息数据交换要轻得多

什么是 Spring Data

Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持 NoSQL关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:

  • 减少样板代码:提供了大量预定义的方法,减少了开发者需要编写的重复代码

  • 支持多种数据库:支持关系型数据库和NoSql数据库,可以在不同类型的数据存储之间进行切换

  • 一致的编程模型:无论是关系型数据库、NoSQL 还是其他数据存储,Spring Data 提供了一致的编程模型

什么是 Swagger

用于设计、构建、文档化和使用 Restful API,主要用于生成API文档,并提供了可视化交互界面,Swagger 最初是由 Wordnik 开发的,现在是 OpenAPI 规范的一部分

如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?Spring Boot 项目如何热部署?

通过DevTools实现,导入依赖后,允许开发者在修改代码后,无需重启服务器或者重新部署就能看到更改的效果

您使用了哪些 starter maven 依赖项

Web项目

  • spring-boot-starter-web:用于构建基于SpringMVC的Web应用

  • spring-boot-starter-thymeleaf:用于构建基于 Thymeleaf 模板引擎的 Web 应用,常用于生成 HTML 页面的渲染

数据访问

  • spring-boot-starter-data-jpa:用于构建基于 JPA 的持久层应用

  • spring-boot-starter-jdbc

  • mysql -connector-j

  • mybatis-plus-boot-starter

  • p6spy-spring-boot-starter:SQL检测工具,针对数据库访问进行拦截和记录的工具,它通过代理JDBC驱动程序来工作

安全性

spring-boot-starter-security:提供生产环境监控和管理功能,支持健康检查、指标监控、日志管理等功能

测试

spring-boot-starter-test:用于集成测试,包含了 JUnit、Spring Test 等测试工具

日志、缓存

spring-boot-starter-logging:用于日志记录

spring-boot-starter-cache:用于集成缓存功能

Spring Boot 中的 starter 到底是什么

它是一组预配置好的 Maven 依赖,用于简化项目的集成与配置,它提供了一个自动化配置类,一般命名为XXXAutoConfiguration,在这个配置类中通过条件注解来决定一个配置是否生效,然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性

spring-boot-starter-parent 有什么用

它是一个特殊的SpringBoot父级的POM文件,作用:

  • 子项目可以继承父POM中定义的所有插件、依赖、版本等配置

  • 依赖版本管理:会自动管理项目中所有常用库的版本(如:SpringFramework、json)

  • 插件配置:提供了与Maven构建相关的默认插件配置,如打包的SpringBoot Maven插件

  • 默认编码和构建设置:自动配置了编码、构建环境和Java版本

  • 简化配置:通过继承父POM,项目中不需要重复设置版本信息、插件配置和其他构建相关的细节

Spring Boot 打包成的 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 ,一个可执行,一个可引用

posted @   走进舒适圈  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示