Spring Boot常见问题
昔日龌龊不足夸,今朝放荡思无涯。
1、什么是 Spring Boot?
- Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案。
- 主要是简化了使用Spring 的难度,简省了繁重的配置,提供了各种启动器,使开发者能快速上手。
- 包括快速开发、快速整合、配置简化、内嵌服务容器。
2、SpringBoot与SpringCloud 区别
3、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
- @SpringBootConfiguration(@SpringBootConfiguration注解点开查看发现里面还是应用了@Configuration)->Spring IOC容器配置类。
- @EnableAutoConfiguration ->使用@Import将所有符合自动配置条件的bean定义加载到IOC容器。
- @ComponentScan ->自动扫描并加载符合条件的组件或者bean定义,默认扫描SpringApplication的run方法里的class所在的包路径下文件,所以通常将该启动类放到根包路径下。
即 @SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
4、Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
5、SpringBoot Starter的工作原理
- SpringBoot就是由各种Starter组合起来的,我们自己也可以开发Starter。
- 在sprinBoot启动时由@SpringBootApplication注解会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建spring容器中的bean,并且进行自动配置把bean注入SpringContext中 。(SpringContext是Spring的配置文件)
6、Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
- 配置变更
- JDK 版本升级到11
- 第三方类库升级
- 响应式 Spring 编程支持
- HTTP/2 支持
- 配置属性绑定
- 更多改进与加强
7、SpringBoot的缺点
8、运行 Spring Boot 有哪几种方式?
- 1. 打包用命令或者放到容器中运行
- 2. 用 Maven/ Gradle 插件运行
- 3. 直接执行 main 方法运行
9、Spring Boot 需要独立的容器运行吗?
10、开启 Spring Boot 特性有哪几种方式?
- 1. 继承spring-boot-starter-parent项目
- 2. 导入spring-boot-dependencies项目依赖
11、SpringBoot 实现热部署有哪几种方式?
- Spring Loaded
- Spring-boot-devtools
12、SpringBoot事物的使用
13、Async异步调用方法
- 在SpringBoot中使用异步调用是很简单的,只需要在方法上使用 @Async 注解即可实现方法的异步调用。
- 注意:需要在启动类加入 @EnableAsync 使异步调用 @Async 注解生效。
14、如何在 Spring Boot 启动的时候运行一些特定的代码?
15、Spring Boot 有哪几种读取配置的方式?
16、什么是 JavaConfig?
- 面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。
- 减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。
- 类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。
- @Configuration:在类上打上写下此注解,表示这个类是配置类
- @ComponentScan:在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan >。
- @Bean:bean的注入:相当于以前的< bean id="objectMapper" class="org.codehaus.jackson.map.ObjectMapper" />
- @EnableWebMvc:相当于xml的<mvc:annotation-driven >
- @ImportResource: 相当于xml的 < import resource="applicationContextcache.xml">
17、SpringBoot的自动配置原理是什么
- 1. 从配置文件META_INF/Spring.factories加载可能用到的自动配置类
- 2. 去重,并将exclude和excludeName属性携带的类排除
- 3. 过滤,将满足条件(@Conditional)的自动配置类返回
18、你如何理解 Spring Boot 配置加载顺序?
- 1.properties文件;
- 2.YAML文件;
- 3.系统环境变量;
- 4.命令行参数。
19、YAML 配置的优势在哪里 ?
- 配置有序,在一些特殊的场景下,配置有序很关键
- 简洁明了,他还支持数组,数组中的元素可以是基本数据类型也可以是对象
- 相比 properties 配置文件,YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置。
20、Spring Boot 是否可以使用 XML 配置 ?
21、spring boot 核心配置文件是什么?bootstrap.properties 和application.properties 有何区别 ?
- boostrap 由父 ApplicationContext 加载的,比applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 SpringCloud 配置就会使用这个文件。且 boostrap 里面的属性不能被覆盖;
- application (. yml 或者 . properties): 由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。
22、什么是 Spring Profifiles?
- Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。
- 假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。
23、SpringBoot多数据源拆分的思路
24、SpringBoot多数据源事务如何管理
- 第一种方式是在service层的@TransactionManager中使用transactionManager指定DataSourceConfig中配置的事务
- 第二种是使用jta-atomikos实现分布式事务管理
25、保护 Spring Boot 应用有哪些方法?
- 在生产中使用HTTPS
- 使用Snyk检查你的依赖关系
- 升级到最新版本
- 启用CSRF保护
- 使用内容安全策略防止XSS攻击
26、如何实现 Spring Boot 应用程序的安全性?
27、比较一下 Spring Security 和 Shiro 各自的优缺点 ?
- Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架
- Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
- Spring Security 功能强大;Shiro 功能简单
28、Spring Boot 中如何解决跨域问题 ?
1 @Configuration 2 public class CorsConfig implements WebMvcConfigurer { 3 @Override 4 public void addCorsMappings(CorsRegistry registry) { 5 registry.addMapping("/**") 6 .allowedOrigins("*") 7 .allowCredentials(true) 8 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") 9 .maxAge(3600); 10 } 11 }
29、Spring Boot 中的监视器是什么?
30、如何使用 Spring Boot 实现全局异常处理?
31、我们如何监视所有 Spring Boot 微服务?
32、SpringBoot性能如何优化
- 如果项目比较大,类比较多,不使用@SpringBootApplication,采用@Compoment指定扫包范围。
- 在项目启动时设置JVM初始内存和最大内存相同。
- 将springboot内置服务器由tomcat设置为undertow。
33、SpringBoot微服务中如何实现 session 共享 ?
34、Spring Boot 中的 starter 到底是什么 ?
35、Spring Boot 中如何实现定时任务 ?
36、spring-boot-starter-parent 有什么用 ?
- 1. 定义了 Java 编译版本为 1.8 。
- 2. 使用 UTF-8 格式编码。
- 3. 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
- 4. 执行打包操作的配置。
- 5. 自动化的资源过滤。
- 6. 自动化的插件配置。
- 7. 针对 application.properties 和 application.yml 的资源过滤,包括通过 profifile 定义的不同环境的配置文件,例如 application-dev.properties 和 applicationdev.yml。
- 总结就是打包用的。
37、SpringBoot如何实现打包
- 进入项目目录在控制台输入mvn clean package,clean是清空已存在的项目包,package进行打包
- 或者点击左边选项栏中的Mavne,先点击clean在点击package
38、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 ,一个可执行,一个可引用。