zoukankan      html  css  js  c++  java
  • 面试官分享在java面试中常问的spring boot相关的问题

    1.简介

    自Spring Boot诞生以来,就引起了业界轰动,目前越来越多的公司技术选型选择拥抱Spring Boot。所以Spring Boot也成为面试必问的问题之一。接下来小胖哥总结了一些来开阔你的思路。

    2.问题

    Q1。Spring和Spring Boot有什么区别?
    Spring Framework提供了多种功能,使Web应用程序的开发更加容易。这些功能包括依赖注入,数据绑定,面向方面的编程,数据访问等等。
    随着Spring社区的壮大,Spring慢慢变得越来越复杂,不再像开始宣称的那么轻量级。 开发应用程序的配置量越来越大令开发者头疼。这时Spring Boot就派上用场了 - 它采用“约定大于配置”的思想简化了配置,对Spring提供的功能和配置而且将一些功能抽象成为“Starter”开箱即用、按需引用。极大地简化了开发。

    Q2。我们如何使用Maven设置Spring Boot应用程序?
    我们可以像在任何其他库中一样在Maven项目中包含Spring Boot。但是,最好的方法是从spring-boot-starter-parent项目继承并声明依赖于Spring Boot启动器。这样做可以让我们的项目重用Spring Boot的默认设置。
    继承spring-boot-starter-parent项目非常简单 - 我们只需要在pom.xml中指定一个parent元素:
    ​​在这里插入图片描述
    我们可以在Maven 中央仓库找到最新版本的 spring-boot-starter-parent。
    上面的方式很方便但是并不一定符合实际需要。例如公司要求所有项目依赖构建从一个标准BOM开始,我们就不能按上面的方式进行。
    在这种情况下,我们可以进行如下引用:
    ​​在这里插入图片描述
    然后在 dependencies 标签下引用Spring Boot 的starters 就行了。
    Q3。Spring boot 中的starter是什么?
    依赖管理对于项目至关重要。当项目足够复杂时,管理依赖项可能会变成一场噩梦,因为涉及的组件太多了。这时Spring Boot 的starter就派上用场了。每个starter都可以为我们提供所需要的Spring技术的一站式服务。并且以一致的方式传递和管理其他所需的依赖关系。所有官方starter都在org.springframework.boot组下,其名称以spring-boot-starter-开头 。非官方的starter的名称在前,如mybatis-spring-boot-starter。这种命名模式使得查找启动器变得很容易,尤其是在使用支持按名称搜索依赖关系的IDE时。但是这个不是绝对的,有些开发者可能不遵从这种契约。

    目前大概有超过50种官方starter。最常用的是:

    • spring-boot-starter: 核心启动器,包括自动配置支持,日志记录和YAML
    • spring-boot-starter-aop: 使用Spring AOP和AspectJ进行面向方面编程的初学者
    • spring-boot-starter-data-jpa: 使用Spring Data JPA和Hibernate的启动器
    • spring-boot-starter-jdbc: 用于将JDBC与HikariCP连接池一起使用的启动器
    • spring-boot-starter-security: 使用Spring Security的启动器
    • spring-boot-starter-test: 用于测试Spring Boot应用程序的启动器
    • spring-boot-starter-web: 使用Spring MVC构建Web的启动器,包括RESTful应用程序
      其他starter 可去spring.io查询

    Q4。如何禁用特定的自动配置?
    如果我们要禁用特定的自动配置,我们可以使用@EnableAutoConfiguration注解的exclude属性来指示它。如下禁用了DataSourceAutoConfiguration:
    ​​在这里插入图片描述
    如果我们使用@SpringBootApplication注解。 它具有@EnableAutoConfiguration作为元注解 - 我们同样可以配置exclude属性来禁用自动配置:
    ​​在这里插入图片描述
    我们还可以使用spring.autoconfigure.exclude环境属性禁用自动配置。在application.properties配置文件设置如下也可以达到同样的目的:
    在这里插入图片描述
    ​​Q5。如何注册自定义自动配置?
    要注册自动配置类,我们必须在META-INF / spring.factories文件的EnableAutoConfiguration 键下列出其完全限定名称,如果是多个按照以下风格配置:
    在这里插入图片描述
    如果我们使用Maven构建一个项目,那么该文件应放在resources / META-INF目录中。

    Q6。如何根据不同的条件来加载bean?
    使用@Conditional 系列注解。 例如@ConditionalOnMissingBean。此注释的最显着属性是:

    • value:要检查的bean类型
    • name:要检查的bean的名称
      放置在使用@Bean装饰的方法上时,目标类型默认为方法的返回类型:
      ​​在这里插入图片描述
      表示的意思是如果不存在CustomService类型的bean则初始化并注入该bean。

    Q7。如何将Spring Boot Web应用程序部署为JAR和WAR文件?
    传统上,我们将Web应用程序打包为WAR文件,然后将其部署到外部服务器中。这样做可以让我们在同一台服务器上安排多个应用程序。在CPU和内存稀缺的时候,这是节省资源的好方法。
    但事情发生了变化。现在计算机硬件相当便宜,并且注意力转向服务器配置。在部署期间配置服务器的一个小错误可能会导致灾难性后果。
    Spring通过提供一个插件即spring-boot-maven-plugin来解决这个问题,将Web应用程序打包为可执行的JAR。要包含此插件,只需向pom.xml添加一个插件元素:
    ​​在这里插入图片描述
    有了这个插件,我们将在执行包阶段后得到一个fat JAR 。此JAR包含所有必需的依赖项,包括嵌入式服务器。因此,我们不再需要担心配置外部服务器。
    然后我们可以像运行普通的可执行JAR一样运行应用程序。
    请注意,必须将pom.xml文件中的packaging元素设置为 jar 才能构建JAR文件:
    ​​在这里插入图片描述
    如果我们不包含这个元素,它也默认为jar。
    如果我们想要构建WAR文件,请将包装 元素更改为war:
    ​​在这里插入图片描述
    并将容器依赖关系从打包文件中删除:
    ​​在这里插入图片描述
    执行Maven 包阶段后,我们将拥有一个可部署的WAR文件。

    Q8。如何在Spring Boot启动的时候运行一些逻辑?
    可以实现接口 ApplicationRunner 或者者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法。

    Q9。Spring boot支持哪些外部配置?
    Spring Boot支持外部配置,允许我们在各种环境中运行相同的应用程序。我们可以使用properties文件,YAML文件,环境变量,系统属性和命令行选项参数来指定配置属性。
    然后,我们可以访问使用这些属性@Value注释,经由绑定对象 的@ConfigurationProperties注释,或Environment 环境抽象类注入。
    以下是最常见的外部配置来源:
    命令行属性:命令行选项参数是以双连字符开头的程序参数,例如-server.port = 8080。Spring Boot将所有参数转换为属性,并将它们添加到环境属性集中。
    应用程序属性:应用程序属性是从application.properties文件或其YAML对应文件加载的属性。默认情况下,Spring Boot会在当前目录,类路径根或其config子目录中搜索此文件。
    特定于配置文件的属性:特定于配置文件的属性从application- {profile} .properties文件或其YAML对应文件加载。{profile}占位符是指活性轮廓。这些文件与非特定属性文件位于相同位置,并且优先于非特定属性文件。

    Q10。如何编写集成测试?
    在为Spring应用程序运行集成测试时,我们必须有一个ApplicationContext。为了简化测试,Spring Boot为测试提供了一个特殊的注释 @SpringBootTest。此批注从其classes属性指示的配置类创建ApplicationContext。如果未设置classes属性,Spring Boot将搜索主配置类。搜索从包含测试的包开始,直到找到使用@SpringBootApplication或@SpringBootConfiguration注释的类。请注意,如果我们使用JUnit 4,我们必须用@RunWith(SpringRunner.class)装饰测试类。可以查阅我前面的关于Spring Boot Mock测试的文章来学习更多的测试方式。

    Q11 。 Spring Boot Actuator有什么用?
    Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX或者HTTP endpoints来获得。Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。Actuator使用Micrometer来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。将Spring Boot Actuator集成到一个项目中非常简单。我们需要做的就是在pom.xml文件中包含 spring-boot-starter-actuator启动器:
    ​​在这里插入图片描述
    Spring Boot Actuator可以使用HTTP或JMX端点公开操作信息。但是,大多数应用程序都使用HTTP,其中端点的标识和/执行器前缀形成URL路径。
    以下是Actuator提供的一些最常见的内置端点:

    标识 描述 Sensitive
    auditevents 显示当前应用程序的审计事件信息 Yes
    beans 显示应用Spring Beans的完整列表 Yes
    caches 显示可用缓存信息 Yes
    conditions 显示自动装配类的状态及及应用信息 Yes
    configprops 显示所有 @ConfigurationProperties 列表 Yes
    env 显示 ConfigurableEnvironment 中的属性 Yes
    flyway 显示 Flyway 数据库迁移信息 Yes
    health 显示应用的健康信息(未认证只显示status,认证显示全部信息详情) No
    info 显示任意的应用信息(在资源文件写info.xxx即可) No
    liquibase 展示Liquibase 数据库迁移 Yes
    metrics 展示当前应用的 metrics 信息 Yes
    mappings 显示所有 @RequestMapping 路径集列表 Yes
    scheduledtasks 显示应用程序中的计划任务 Yes
    sessions 允许从Spring会话支持的会话存储中检索和删除用户会话。 Yes
    shutdown 允许应用以优雅的方式关闭(默认情况下不启用) Yes
    threaddump 执行一个线程dump Yes
    httptrace 显示HTTP跟踪信息(默认显示最后100个HTTP请求 - 响应交换) Yes

    生产使用Actuator务必保护好这些端点,避免未授权的访问请求。

    3.结论

    今天小胖哥介绍了在技术面试中经常遇到的一些关于Spring Boot的最关键问题。掌握以上的知识在日常开发中也是必要的,希望对你的面试有所帮助。

    扫码关注公众号【码农小胖哥】 获取更多java干货。

    在这里插入图片描述

  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/felordcn/p/12142589.html
Copyright © 2011-2022 走看看