什么是SpringBoot
Spring Boot 是一个开源的 Java 框架,用于简化 Spring 应用程序的开发过程,减省了繁重的配置文件,提供了各种启动器,开发者能快速上手
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对象。
配置文件加载顺序
命令行参数配置
项目名/config/配置文件
项目名/配置文件
src/main/resources/config/配置文件
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 微服务
什么是 WebSockets
什么是 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 ,一个可执行,一个可引用