JAVA面试篇(七)一 SpringBoot

1. 什么是 SpringBoot?为什么要用SpringBoot?

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

➢ 快速开发
➢ 快速整合
➢ 配置简化
➢ 内嵌服务容器

2. SpringBoot与SpringCloud 区别?

SpringBoot是快速开发的Spring框架
➢ SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot

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

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

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

➢ @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项
	例如:java 如关闭数据源自动配置功能
	@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })。
	
➢ @ComponentScanSpring组件扫描。

4. SpringBoot 支持哪些日志框架?推荐和默认的日志框架是哪个?

SpringBoot 支持Java Util Logging, Log4j2, Logback 作为日志框架,如果你使用 Starters 启动器,
SpringBoot 将使用 Logback 作为默认日志框架,但是不管是那种日志框架他都支持将配置文件输出到控制台或者文件中。

5. SpringBoot Starter的工作原理?

我个人理解SpringBoot就是由各种Starter组合起来的,我们自己也可以开发Starter
在sprinBoot启动时由 @SpringBootApplication 注解会自动去maven中读取每个starter中的spring.factories文件,
文件里配置了所有需要被创建spring容器中的bean,并且进行自动配置把bean注入SpringContext中,
SpringContextSpring的配置文件。

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

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

7. SpringBoot 实现热部署有哪几种方式?

➢ 模板热部署
➢ spring-boot-devtools
➢ Spring LoadedJRebel(插件)

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

8. SpringBoot事务的使用?

1、启动类加上 @EnableTransactionManagement 注解,开启事务支持(其实默认是开启的)。
➢ 2、在使用事务的public(只有public支持事务)方法(或者类)加上 @Transactional 注解。

9. Async异步调用方法?

SpringBoot中使用异步调用是很简单的,只需要在方法上使用 @Async 注解即可实现方法的异步调用。
注意:需要在启动类加入 @EnableAsync 使异步调用 @Async 注解生效。

@Configuration
//主要是为了扫描范围包下的所有 @Async注解
@EnableAsync
public class AsyncConfiguration {
}

10. 如何在 SpringBoot 启动的时候运行一些特定的代码?

	主要做一些初始化的操作,可以实现接口ApplicationRunner或者CommandLineRunner,
	这两个接口实现方式一样,它们都只提供了一个 run 方法
	

11. SpringBoot 有哪几种读取配置的方式?

Spring Boot 可以通过以下注解来绑定变量	
➢ @PropertySource@Value 用在属性上,常用
➢ @Environment@ConfigurationProperties 用在类上,类的所有属性都可以配置

12. 什么是 JavaConfig?

Spring JavaConfigSpring 社区的产品,Spring 3.0 引入了他,它提供了配置 Spring IOC 
	容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:
➢ 面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。
➢ 一个配置类可以继承另一个,重写它的@Bean 方法等。
➢ 减少或消除 XML 配置。
➢ 基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XMLJava 之间来回切换。
➢ JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。
➢ 从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,
	但实际上很多人认为将JavaConfifigXML 混合匹配是理想的。
➢ 类型安全和重构友好。
➢ JavaConfig 提供了一种类型安全的方法来配置 Spring容器。
➢ 由于 Java5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。

常用的Java config:
➢@Configuration:在类上写下此注解,表示这个类是配置类
➢@ComponentScan:在配置类上添加@ComponentScan注解,该注解默认会扫描该类所在的包下所有的配置类
➢@Bean:bean的注入:相当于以前的< bean id=“objectMapper” class=org.codehaus.jackson.map.ObjectMapper/>@EnableWebMvc:相当于xml的 <mvc:annotation-driven >@ImportResource:相当于xml的 < import resource="applicationContextcache.xml">

13. SpringBoot的自动配置原理是什么?

主要是Spring Boot的启动类上的核心注解 @SpringBootApplication 注解主配置类,
有了这个主配置类启动时就会为SpringBoot开启一个 @EnableAutoConfiguration 注解自动配置功能。
有了这个EnableAutoConfiguration的话就会:从配置文件 META_INF/Spring.factories 加载可能
用到的自动配置类去重,并将exclude和excludeName属性携带的类排除过滤,
将满足条件(@Conditional)的自动配置类返回

14. 你如何理解 Spring Boot 配置加载顺序?

SpringBoot的配置属性获取是通过匹配,从高优先级开始查找,查到即返回属性值。
也就是说Spring Boot中同一配置属性在内存中可能会存在多份,但获取的是优先级最高的那份。

➢ 1 命令行参数
➢ 2 Servlet初始参数
➢ 3 ServletContext初始化参数
➢ 4 JVM系统属性
➢ 5 操作系统环境变量
➢ 6 随机生成的带random.*前缀的属性 内部实现Random的api
➢ 7 配置文件(例如:classpath:/application.yml)属性,properties、xml、yml、yaml的方式依次查找加载。
➢ 8 默认属性

15. 什么是 YAML?其优势在哪里 ?

YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中
添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。

YAML 的优势:
➢ 配置有序,在一些特殊的场景下,配置有序很关键
➢ 简洁明了,他还支持数组,数组中的元素可以是基本数据类型也可以是对象

16. SpringBoot 是否可以使用 XML 配置 ?

Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,
通过 @ImportResource 注解可以引入一个 XML 配置。

17. SpringBoot启动过程

JAVA面试篇(七)一 SpringBoot_第1张图片

18. springBoot 核心配置文件是什么?bootstrap.properties 和application.properties 有何区别 ?

单纯做 SpringBoot 开发,可能不太容易遇到bootstrap.properties配置文件,
但是在结合Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。

springBoot 核心的两个配置文件:
➢ bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,
	比applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud 
	配置就会使用这个文件。且 boostrap 里面的属性不能被覆盖;
	
➢ application (. yml 或者 . properties):由 ApplicatonContext 加载,
	用于 spring boot 项目的自动化配置。

19. 什么是 Spring Profiles?

在项目的开发中,有些配置文件在开发、测试或者生产等不同环境中可能是不同的,例如数据库连接、redis的配置等等。
那我们如何在不同环境中自动实现配置的切换呢?Spring给我们提供了profiles机制给我们提供的就是来回切换配置文件的功能

Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,
只有某些 bean 可以加载,而在 PRODUCTION 中,某些其他 bean 可以加载。

假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。
SpringBoot 使得使用配置文件非常简单。

spring.profiles.active
指定激活哪个文件,值是application-{profileName}.yml中的 profileName。用于区分不同的运行环境。

20. SpringBoot多数据源拆分的思路?

➢ 先在 properties 配置文件中配置两个数据源,创建分包mapper,使用 @ConfigurationProperties
➢ 读取 properties 中的配置,使用 @MapperScan 注册到对应的mapper包中

21. SpringBoot多数据源事务如何管理?

➢ 第一种方式是在service层的 @TransactionManager 中使用transactionManager指定DataSourceConfig中配置的事务
➢ 第二种是使用jta-atomikos实现分布式事务管理

22. 保护 SpringBoot 应用有哪些方法?

➢ 在生产中使用 HTTPS
➢ 使用 Snyk 检查你的依赖关系
➢ 升级到最新版本
➢ 启用 CSRF 保护
➢ 使用内容安全策略防止 XSS 攻击

23. 如何实现 SpringBoot 应用程序的安全性?

为了实现 Spring Boot 的安全性,我们使用spring-boot-starter-security 依赖项,并且必须添加安全配置。
它只需要很少的代码。配置类将必须扩展 WebSecurityConfigurerAdapter 并覆盖其方法。

24. SpringBoot 中的监视器是什么?

Spring boot actuator,它 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助您访问生产
环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能
正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。

25. 我们如何监视所有 SpringBoot 微服务?

使用spring-boot-admin。但是,它建立在Spring Boot Actuator之上
,我们必须单独打开应用程序的知识点以了解其状态或健康状况。
spring-boot-admin提供了一个 Web UI,我们能够可视化多个应用程序的度量。

26. 如何使用 SpringBoot 实现全局异常处理?

全局异常处理可以用两个注解来实现:@ControllerAdvice+@ExceptionHandler。
这样可以捕获 Controller中抛出的指定类型异常,可对不同类型的异常单独进行处理。

@Slf4j
@ControllerAdvice
public class GlobalExceptionAdvice {
    
    @ExceptionHandler({Exception.class})
    public R handleException(HttpServletRequest request, Exception e) throws Exception {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',发生异常:'{}'", requestURI, e.getMessage());
        log.error("异常信息:'{}'", e);
        return R.fail(e.getMessage());
    }
}

27. SpringBoot性能如何优化?

➢ 一、优化注解 @SpringBootApplication@SpringBootApplicationSpringboot 整合的一个复合注解,
		作用相当于@Configuration + @EnableAutoConfiguration + @ComponentScan
	○ 由于其中包括有包扫描的注解 @ComponentScan ,这会导致项目启动时间变长
	(启动一个大的应用程序或做大量的集成测试启动应用程序时,影响会特别明显),会加载一些多余的实例(Beans),
	也会增加 CPU 消耗。所以可以将 @SpringBootApplication 注解改为 @EnableAutoConfiguration 
	+ @Configuration + 在我们需要的 bean 上进行显式配置注解。
	
➢ 二、将 Servlet 容器由 Tomcat 变成 Undertow

➢ 三、JVM 调优

28. SpringBoot微服务中如何实现 session 共享 ?

在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,
各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享session ,
常见的方案就是 Spring Session + Redis 来实现 session 共享。

将所有微服务的session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,
都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的
代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。

29. SpringBoot 中的 starter 到底是什么 ? 常用的 starter maven 依赖项有哪些?

这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。

首先它提供了一个自动化配置类,一般命名为XXXAutoConfiguration,在这个配置类中通过条件注解来
决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,
也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,
新注入的属性会代替掉默认属性。

正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter

常用的 starter maven 依赖项:
	➢ spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
	➢ spring-boot-starter-data-jpa 数据库支持
	➢ spring-boot-starter-data-redis 数据库支持
	➢ spring-boot-starter-data-solr 支持
	➢ mybatis-spring-boot-starter 第三方的mybatis集成starter

30. spring-boot-starter-parent 有什么用 ?

我们新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是spring-boot-starter-parent,
spring-boot-starter-parent主要有如下作用:
➢ 定义了统一 Java 编译版本。
➢ 使用统一格式编码 UTF-8 。
➢ 继承自spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,
	所以我们在写依赖时才不需要写版本号。
➢ 执行打包操作的配置。
➢ 自动化的资源过滤。
➢ 自动化的插件配置。
➢ 针对application.properties和application.yml的资源过滤,包括通过 profile 定义的不同
	环境的配置文件,例如application-dev.properties和application-dev.yml。

总结就是打包用的

31. SpringBoot如何实现打包?

进入项目目录在控制台输入mvn clean package,clean是清空已存在的项目包,package进行打包;
或者点击左边选项栏中的Maven,先点击clean在点击package

32. 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 ,一个可执行,一个可引用。

你可能感兴趣的:(java,面试,spring,boot)