WinddSnow

Java面试题10SpringBoot

字数统计: 1.6k阅读时长: 5 min
2022/10/22

SpringBoot 是什么

是 Spring 的子项目,主要简化 Spring 开发难度,去掉了繁重配置,提供各种启动器,可以让程序员很快上手,节省开发时间.

SpringBoot 的优点

SpringBoot 对上述 Spring 的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

  • 版本锁定:解决是 maven 依赖版本容易冲突的问题,集合了常用的并且测试过的所有版本

使用了 Starter(启动器)管理依赖并能对版本进行集中控制,父工程带有版本号,就是对版本进行了集中控制.

  • 起步依赖 :解决了完成某一个功能要整合的 jar 包过多的问题,集合了常用的 jar 包

  • 自动配置:解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置

  • 内置 Tomcat:通过内置的 tomcat,无需再用其他外置的 Tomcat 就直接可以运行 javaEE程序

    总之:人们把 Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的 spring 项目,并且尽可能的减少一切 xml 配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。

SpringBoot 运行原理剖析

SpringApplication 类作用及 run()方法作用

  • SpringApplication 这个类整合了其他框架的启动类, 只要运行这一个类,所有的整合就都完成了.
  • 调 用 run 函 数 , 将 当 前 启 动 类 的 字 节 码 传 入 ( 主 要 目 的 是 传 入@SpringBootApplication 这个注解), 以及 main 函数的 args 参数.
  • 通过获取当前启动类的核心信息, 创建 IOC 容器.

当前启动类@SpringBootApplication 详细剖析

run 函数传入的当前启动类字节码, 最重要的是传入了@SpringBootApplication,点开该注解源码, 会发现有多个注解组成,接下来会详细解释每个注解的含义.
点开这个注解源码, 发现有 4 类注解.

  1. 第一类: JDK 原生注解 4 个

    • @Target(ElementType.TYPE) //当前注解的使用范围
    • @Retention(RetentionPolicy.RUNTIME) //生命周期
    • @Documented //声明在生成 doc 文档时是否带着注解
    • @Inherited //声明是否子类会显示父类的注解
  2. 第二类: @SpringBootConfiguration

    点开该注解源码, 会发现本质是@Configuration,定义该类是个配置类功能等同于 xml配置文件.

    提到@Configuration 就要提到他的搭档@Bean, 使用这两个注解就可以创建一个简单的 Spring 配置类, 可以用来替代相应的 xml 配置文件.可以理解为创建了 IOC 容器了

  3. 第三类: @ComponentScan, 包扫描功能

    这个注解对应 Spring 的 XML 配置中的@ComponentScan,其实就是自动扫描并加载符合条件的组件(比如@Component 和@Repository 等)或者 bean 定义, 最终将这些bean 定义加载到 IoC 容器中.
    也可以通过 basePackages 等属性来细粒度的定制@ComponentScan 自动扫描的范围,如果不指定, 则默认扫描@ComponentScan 所在类的 package 及子包进行扫描。
    注:所以 SpringBoot 的启动类最好是放在 root package 下,因为默认不指定basePackages, 这样能扫描 root package 及子包下的所有类.

  4. 第四类: @EnableAutoConfiguration

    点开源码会发现,本质是@import, 自动导入功能

    @EnableAutoConfiguration 也是借助@Import 的帮助,将所有符合自动配置条件的 bean 定义加载到 IoC 容器.
    @EnableAutoConfiguration 会根据类路径中的 jar 依赖为项目进行自动配置, 如:添加了spring-boot-starter-web 依赖, 会自动添加 Tomcat 和 SpringMVC 的依赖, SpringBoot会对 Tomcat 和 SpringMVC 进行自动配置.

SpringBoot 是如何完成自动配置的呢?

  1. SpringBoot 自动配置的注解是 @EnableAutoConfiguration.
  2. 我们用的时候是在启动类上加@SpringBootApplication,这个注解是复合注解,内部包含 @EnableAutoConfiguration
  3. @EnableAutoConfiguration 内部有一个@Import, 这个注解才是完成自动配置的关键.
  4. @Import 导入一个类(AutoConfigurationImportSelector),这个类内部提供了一个方法(selectImports). 这个方法会扫描导入的所有 jar 包下的 spring.factories 文件. 解析文件中自动配置类 key=value, 将列表中的类创建,并放到 Spring 容器中.

总结

  • 总之一个@SpringBootApplication 注解就搞定了所有事, 它封装了核心的
    @SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan 这三个类,
  • 大大节省了程序员配置时间,这就是 SpringBoot 的核心设计思想.

SpringBoot 热部署

导入 spring-boot-devtools 这个 jar 包: 就可以完成热部署了

SpringBoot 支持哪些日志框架

  • Java Utils logging
  • Log4j2
  • Lockback
  • 如果你使用了启动器,那么 springboo 默认将 Lockback 作为日志框架.

SpringBoot 常用注解

  • @SpringBootApplication: 它 封 装 了 核 心 的 @SpringBootConfiguration+@EnableAutoConfiguration +@ComponentScan 这三个类,大大节省了程序员配置时间,这就是 SpringBoot 的核心设计思想.
  • @EnableScheduling 是通过@Import 将 Spring 调度框架相关的 bean 定义都加载到IoC 容器
  • @MapperScan:spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis接口类的路径,即可完成对 mybatis 接口的扫描
  • @RestController 是 @Controller 和 @ResponseBody 的 结 合 , 一 个 类 被 加 上@RestController 注解,数据接口中就不再需要添加@ResponseBody,更加简洁。
  • @RequestMapping,我们都需要明确请求的路径.
  • @GetMappping,@PostMapping, @PutMapping, @DeleteMapping 结 合@RequestMapping 使用, 是 Rest 风格的, 指定更明确的子路径.
  • @PathVariable:路径变量注解,用{}来定义 url 部分的变量名.
  • @Service 这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个注解交给 spring 容器。事务的切面也会配置在这一层。当让 这个注解不是一定要用。有个泛指组件的注解,当我们不能确定具体作用的时候 可以用泛指组件的注解托付给spring 容器
  • @Component 和 spring 的注解功能一样, 注入到 IOC 容器中.
  • @ControllerAdvice 和 @ExceptionHandler 配合完成统一异常拦截处理.
CATALOG
  1. 1. SpringBoot 是什么
  2. 2. SpringBoot 的优点
  3. 3. SpringBoot 运行原理剖析
    1. 3.1. SpringApplication 类作用及 run()方法作用
    2. 3.2. 当前启动类@SpringBootApplication 详细剖析
    3. 3.3. SpringBoot 是如何完成自动配置的呢?
    4. 3.4. 总结
  4. 4. SpringBoot 热部署
  5. 5. SpringBoot 支持哪些日志框架
  6. 6. SpringBoot 常用注解