面经——SpringBoot

162 阅读9分钟

www.yuque.com/snailclimb/…

cnk4

1. 简介Spring以及其优缺点

Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性

我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说 Spring 支持 IoC(Inversion of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持 RESTful Java 应用程序的开发。

Spring也是重量级企业开发框架Enterprise JavaBean(EJB)的替代品,Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入面向切面编程,用POJO实现了EJB的功能。

缺点:虽然Spring的组件代码是轻量级的,但它的配置却是重量级的(需要大量的xml配置)

为此,Spring 2.5 引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0 引入了基于Java 的配置,这是一种类型安全的可重构配置方式,可以代替 XML。

尽管如此,我们依旧没能逃脱配置的魔爪。开启某些 Spring 特性时,比如事务管理和 SpringMVC,还是需要用 XML或Java 进行显式配置。启用第三方库时也需要显式配置,比如基于Thymeleaf的 Web 视图。配置 Servlet 和过滤器(比如 Spring 的 DispatcherServlet ) 同样需要在web.xml或Servet 初始化代码里进行显式配置。组件扫描减少了配置量,Java 配置让它看上去简洁不少,但 Spring 还是需要不少配置。

光配置这些 XML 文件都够我们头疼的了,占用了我们大部分时间和精力。除此之外,相关库的依赖非常让人头疼,不同库之间的版本冲突也非常常见。

依赖注入

依赖注入是实现控制反转的一种设计方法,它有三种类型分别为构造函数注入,属性注入以及方法注入。一个依赖关系指的是可被利用的一种对象 。依赖注入是将所依赖的传递给将要使用的从属对象。 依赖注入的类型:

注入类将服务(依赖项)注入客户端(依赖),可分为以下几种形式

(1)构造函数注入:在构造函数注入中,注入器通过客户端类构造函数提供服务(依赖性)。

(2)属性注入:在属性注入(又名Setter注入)中,注入器通过客户端类的公共属性提供依赖性。

(3)方法注入:在这种类型的注入中,客户端类实现一个接口,该接口声明方法以提供依赖性,并且注入器使用此接口来提供对客户端类的依赖性。

依赖注入的好处:

(1)减少依赖性

依赖注入可以消除或者减少组件间不必要的依赖性。以降低组件改变时所带来的影响组件

(2)增强可重用性

减少组件依赖性可以增强组件的可重用性。如果在不同的上下文中需要某个接口的不同实现,或者只是同一实现的不同配置,则可以将该组件配置为使用该实现。无需更改代码。

(3)增加代码的可测试性

依赖注入也增加了组件的可测试性。当依赖项可以注入组件时,意味着可以注入这些依赖项的模拟实现。模拟对象用于测试作为实际实现的替代,并且可以配置模拟对象的行为

(4)增强代码的可读性

依赖注入可将依赖项移动到组件的接口。使得更容易看到组件中哪些具有依赖关系,从而使代码更具可读性。

(5)减少依赖性承载

依赖性承载会在代码中产生大量“噪音”,使其难以阅读和维护,并且使得组件更难测试。而依赖注入可以减少依赖性承载和静态单例的使用,可以将组件完美地连接在一起

2. 为什么要有SpringBoot

Spring 旨在简化J2EE 企业应用程序开发。Spring Boot 旨在简化 Spring 开发(减少配置文件,开箱即用!)。

image.png

3. 说出使用Spring Boot的主要优点

  1. 开发基于 Spring 的应用程序很容易。
  2. Spring Boot 项目所需的开发或工程时间明显减少,通常会提高整体生产力。
  3. Spring Boot 不需要编写大量样板代码、XML 配置和注释。
  4. Spring 引导应用程序可以很容易地与 Spring 生态系统集成,如 Spring JDBC、Spring ORM. Spring Data、Spring Security 等。
  5. Spring Boot 遵循“固执己见的默认配置”,以减少开发工作(默认配置可以修改)
  6. Spring Boot 应用程序提供嵌入式 HTTP 服务器,如 Tomcat 和 Jetty,可以轻松地开发和测试web 应用程序。(这点很赞!普通运行 Java 程序的方式就能运行基于 Spring Boot web 项目省事很多)
  7. Spring Boot 提供命令行接口(CL)工具,用于开发和测试 Spring Boot 应用程序,如 Java 或Groovy.
  8. Spring Boot 提供了多种插件,可以使用内置工具(如 Maven 和 Gradle)开发和测试 SpringBoot 应用程序

4. 什么是Spring Boot Starters?

Spring Boot Starters 是一系列依赖关系的集合,因为它的存在,项目的依赖之间的关系对我们来说变的更加简单了。

举个例子: 在没有 Spring Boot Starters 之前,我们开发 REST 服务或 Web 应用程序时: 我们需要使用像 Spring MVC,Tomcat 和 Jackson 这样的库,这些依赖我们需要手动一个一个添加。但是,有了Spring Boot Starters 我们只需要一个只需添加一个spring-boot-starter-web一个依赖就可以了,这个依赖包含的子依赖中包含了我们开发 REST 服务需要的所有依赖。

image.png

5. Srping Boot支持哪些内嵌Servlet容器?

image.png

6. 如何在 Spring Boot 应用程序中使用 Jetty 而不是 Tomcat?

Spring Boot ( spring-boot-starter-web ) 使用Tomcat 作为默认的嵌入式 servlet容器,如果你想使用 Jetty 的话只需要修改 pom.xml (Maven)或者 build.gradle (Gradle)就可以了。

image.png

7. 介绍@SpringBootApplication注解

可以看出大概可以把 @SpringBootApplication 看作是 @Configuration@EnableAutoConfig@Componentscan 注解的集合。根据 SpringBoot 官网,这二个注解的作用分别是:

  • @EnableAutoConfiguration : 启用 SpringBoot 的自动配置机制
  • @ComponentScan : 扫描被 @Component ( @Service,@Controller )注解的 bean,注解默认会扫描该类所在的包下所有的类。
  • @Configuration : 允许在上下文中注册额外的 bean 或导入其他配置类

8. Spring Boot 的自动配置是如何实现的?

Spring Boot 的自动配置是通过条件化配置来实现的。其核心思想是根据项目中存在的 jar 包或者类的存在与否来判断需要配置哪些功能。这些条件化配置会在 Spring Boot 应用启动时自动执行,从而实现自动配置。

具体来说,Spring Boot 通过 Spring 的条件化注解来实现条件化配置,例如 @ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty 等。通过这些条件化注解,可以实现当项目中包含某些 jar 包或者类时,自动配置某些功能;或者当某个 Bean 不存在时,自动配置该 Bean 等。

另外,Spring Boot 还提供了 Starter 的概念,即 Starter 是一种预先配置好的一组 jar 包,可以用来快速启动某些功能。Starter 中通常包含了所需的 jar 包和自动配置类。因此,通过引入 Starter,可以非常方便地启动一些常用功能,而无需手动进行配置。

9. 开发RESTful Web服务常用的注解有哪些

Spring bean相关:

  • @Autowired
  • @RestController
  • @Component
  • @Repsitory
  • @service
  • @Controller

处理常见的HTTP请求类型:

  • @GetMapping
  • @PosMapping
  • @PutMapping
  • @DeleteMapping

前后端传值

  • @RequestParam以及@Pathvairable
  • @RequestBody

@RequestParam和@PathVariable都是Spring MVC中用于接收请求参数的注解,但它们的使用场景和参数来源有所不同。

@RequestParam用于获取请求参数,它可以获取查询参数或POST请求中的表单数据。使用@RequestParam注解时,可以指定参数的名称和是否必须。如果不指定参数名称,则默认使用方法参数名。如果参数是必须的但请求中没有该参数,将会抛出异常。

@PathVariable用于获取请求路径中的占位符,一般用于RESTful风格的接口。使用@PathVariable注解时,需要在注解中指定占位符的名称,然后在方法参数中使用同名变量接收值。

简单来说,@RequestParam用于接收请求参数,@PathVariable用于接收请求路径中的占位符参数。

image.png

10. SpringBoot常用的两种配置文件

  • application.properties
  • application.yml

11. 什么是YAML?YAML配置的优势在哪里?

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

相比于 Properties 配置的方式,YAML配置的方式更加直观清晰,简介明了,有层次感。

但是,YAML配置的方式有一个缺点,那就是不支持 @PropertySource 注解导入自定义的 YAML配置。如果需要加载自定义的 YAML 配置文件,可以通过以下方式来实现:

  1. 通过 @ImportResource 注解导入 XML 配置文件,然后在 XML 文件中使用 context:property-placeholder 标签加载 YAML 文件,这样就能够将 YAML 文件中的属性注入到 Spring 中的 Bean 中。
  2. 在 Spring Boot 应用程序中,可以使用 @ConfigurationProperties 注解来读取 YAML 文件中的属性,同时也可以使用 @PropertySource 注解来加载自定义的 YAML 配置文件。

需要注意的是,@ConfigurationProperties 注解只能读取 application.yml 或者 application.properties 文件中的属性,如果需要读取其他的 YAML 文件,还需要通过 @PropertySource 注解来加载。

image.png

12. Springboot常用的读取配置文件的方法有哪些?

image.png

image.png

image.png

13. SpringBoot加载配置文件的优先级

image.png