1.什么是 Spring Boot?

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

2.Spring Boot 有哪些优点?

  1. 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
  2. 开箱即用,远离繁琐的配置。
  3. 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外 部化配置等。
  4. 没有代码生成,也不需要XML配置。
  5. 避免大量的 Maven 导入和各种版本冲突。

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

    启动类上面的注解是@SpringBootApplication,它也是 Spring Boot的核心注解,主要组合包含了以下 4 个注解:
  • @SpringBootConfiguration:组合了@Configuration 注解,实现配置文件的功能。
  • @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
  • @ComponentScan:Spring组件扫描。

    4.什么是 JavaConfig?

    Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC容器的纯Java 方法。因此它有助于避免使用XML配置。使用 JavaConfig的优点在于:

  • 1.面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个 配置类可以继承另一个,重写它的@Bean方法等。

  • 2.减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技 术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与XML混合匹配是理想的。
  • 3.类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于Java 5.0 对泛型的支持, 现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。

    5.Spring Boot 自动配置原理是什么?

    注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass就是自动配置的核心, @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。 筛选有效的自动配置类。
    每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能

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

  • properties文件;

  • YAML文件;
  • 系统环境变量;
  • 命令行参数;

    7.Spring Boot 是否可以使用 XML 配置 ?

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

    8.spring boot 核心配置文件是什么?bootstrap.properties 和application.properties 有何区别?

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

  • bootstrap (. yml 或者 . properties):boostrap由父ApplicationContext 加载的,比applicaton优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在Spring Cloud Config 或者Nacos中会用到它。且 boostrap 里面的属性不能被覆盖;

  • application (. yml 或者 . properties): 由ApplicatonContext加载,用于 spring boot 项目的自动化配置

    9.什么是 Spring Profiles?

    Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。

    10.如何在自定义端口上运行 Spring Boot 应用程序?

    为了在自定义端口上运行 Spring Boot 应用程序,您可以在application.properties 中指定端口。server.port = 8090

    11.如何实现 Spring Boot 应用程序的安全性?

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

    12.比较一下 Spring Security 和 Shiro 各自的优缺点 ?

    由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是 没有问题的。Shiro 和 Spring Security 相比,主要有如下一些特点:
  1. Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架
  2. Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
  3. Spring Security 功能强大;Shiro 功能简单

    13.Spring Boot 中如何解决跨域问题?

    跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。 这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
    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. }
    10. }
    项目中前后端分离部署,所以需要解决跨域的问题。 我们使用cookie存放用户登录的信息,在spring拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。 当用户登录以后,正常使用;当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。 我们知道一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行。
    1. @Configuration
    2. public class CorsConfig{
    3. @Bean
    4. public CorsFilter corsFilter(){
    5. CorsConfiguration corsConfiguration = new CorsConfiguration();
    6. corsConfiguration.addAllowedOrigin("*");
    7. corsConfiguration.addAllowedHeader("*");
    8. corsConfiguration.addAllowedMethod("*");
    9. corsConfiguration.setAllowCredentials(true);
    10. UrlBasedCorsConfigurationSource config = new UrlBasedCorsConfigurationSource();
    11. config.registerCorsConfiguration("/**",corsConfiguration);
    12. return new CorsFilter(config);
    13. }
    14. }

    14.什么是 CSRF 攻击?

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

    15.Spring Boot 中的监视器是什么?

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

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

    默认情况下,所有敏感的 HTTP 端点都是安全的,只有具有 ACTUATOR 角色的用户才能访问它们。安全性是使用标准 的 HttpServletRequest.isUserInRole 方法实施的。 我们可以使用来禁用安全性。只有在执行机构端点在防火墙后访问 时,才建议禁用安全性。

    17.我们如何监视所有 Spring Boot 微服务?

    Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。 它建立在 Spring Boot Actuator 之 上,它提供了一个Web UI,使我们能够可视化多个应用程序的度量。

    18.您使用了哪些 starter maven 依赖项?

  • spring-boot-starter-security
  • spring-cloud-starter-consul-discovery
  • spring-cloud-starter-sleuth
  • spring-cloud-starter-consul-config

这有助于增加更少的依赖关系,并减少版本的冲突。

19.Spring Boot 中的 starter 到底是什么 ?

首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。

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

我们都知道,新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:

  1. 定义了 Java 编译版本为 1.8 。
  2. 使用 UTF-8 格式编码。
  3. 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
  4. 执行打包操作的配置。
  5. 自动化的资源过滤。
  6. 自动化的插件配置。
  7. 针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件, 例如 application-dev.properties 和 application-dev.yml。

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

    22.运行 Spring Boot 有哪几种方式?

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

    23.Spring Boot 需要独立的容器运行吗?

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

    24.开启 Spring Boot 特性有哪几种方式?

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

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

    25.如何使用 Spring Boot 实现异常处理?

    Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个ControlerAdvice类,来处理控制器类抛出的所有异常。

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

    在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。

    27.Spring Boot 中如何实现定时任务 ?

    在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的@Scheduled 注解,另一个则是使用第三方框架 Quartz。
    使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
    使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。