SpringBoot之SpringBoot常见面试题

1. SpringBoot是什么

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

2. SpringBoot的优点

  1. 首先 SpringBoot可以快速一键快速搭建Spring框架,简化初始配置 ,可与主流框架集成.
  2. 内置Servlet容器,无需在打War包
  3. 使用了Starter(启动器)管理依赖并能对版本进行集中控制,如下的父工程带有版本号, 就是对版本进行了集中控制.
 
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.0.0.RELEASEversion>
    parent>
  1. 大量的自动配置,简化开发,方便集成第三方
  2. 提供准生产环境运行时的监控,如指标,健康,外部配置等
  3. 无需XML配置,减少冗余代码 ,开箱即用。

3. 运行SpringBoot项目的方式

  • 可以打包
  • 可以使用Maven插件直接运行.
  • 直接运行main方法.

4. SpringBoot的启动器starter

4.1 什么是starter?

starter启动器,可以通过启动器集成其他的技术,比如说: web, mybatis, redis等等.可以提供对应技术的开发和运行环境.
比如: pom中引入spring-boot-starter-web, 就可以进行web开发.

4.2 starter执行原理?
  • SpringBoot在启动时候会去扫描jar包中的一个名为spring.factories.
  • 根据文件中的配置,去加载自动配置类. 配置文件格式是key=value, value中配置了很多需要Spring加载的类.
  • Spring会去加载这些自动配置类, Spring读取后,就会创建这些类的对象,放到Spring容器中.后期就会从Spring容器中获取这些类对象.
4.3 SpringBoot中常用的启动器
  • spring-boot-starter-web, 提供web技术支持
  • spring-boot-starter-test
  • spring-boot-starter-jdbc
  • spring-boot-starter-jpa
  • spring-boot-starter-redis
  • spring-boot-starter-solr
    …等等

5. SpringBoot运行原理剖析

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

在这里插入图片描述

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

5.2 当前启动类@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容器并注入对象.

  • 任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类.
  • 任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器中, 方法名将默认成该bean定义的id。

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

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

(4)第四类: @EnableAutoConfiguration

点开源码会发现,本质是@import, 自动导入功能
在这里插入图片描述

  1. @EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器中.
    @EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置, 如:添加了spring-boot-starter-web依赖, 会自动添加Tomcat和SpringMVC的依赖, SpringBoot会对Tomcat和SpringMVC进行自动配置.
  2. 那么SpringBoot是如何完成自动配置的呢?
    A. SpringBoot自动配置的注解是 @EnableAutoConfiguration.
    B. 我们用的时候是在启动类上加@SpringBootApplication,这个注解是复合注解,内部包含 @EnableAutoConfiguration
    C. @EnableAutoConfiguration内部有一个@Import, 这个注解才是完成自动配置的关键.
    D. @Import导入一个类(AutoConfigurationImportSelector),这个类内部提供了一个方法(selectImports). 这个方法会扫描导入的所有jar包下的spring.factories文件. 解析文件中自动配置类key=value, 将列表中的value对应的类创建,并放到Spring容器中.
    SpringBoot之SpringBoot常见面试题_第1张图片

5.3 总结

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

6. SpringBoot热部署

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

7. SpringBoot中的配置文件

7.1有哪些配置文件?

  • bootstrap: yml/application
  • application: yml/application
    上面两种配置文件有什么区别?
  1. bootstrap由父ApplicationContext加载, 比application配置文件优先被加载.
  2. bootstarp里的属性不能被覆盖.
  3. application: springboot项目中的自动化配置.
  4. bootstrap:
    使用spring cloud config配置中心时, 需要加载连接配置中心的配置属性的, 就可以使用bootstrap来完成.
    加载不能被覆盖的属性.
    加载一些加密/解密的数据.

7.2 读取配置文件的方式?

  • 读取默认配置文件
    • 需要注入Environment类, 使用environment.getProperty(peorperties中的key), 这样就能获得key对应的value值
    • @value(${key.value}) 直接读取
  • 读取自定义配置文件
    • 自定义配置文件后缀必须是.propeties
    • 编写和自定义配置文件对应的java类, 类上放3个注解
      • @ConfigurationProperties(“前缀”)
      • @PropertySource(“指定配置文件”)
      • @@Component包扫描
    • 读取的时候就跟读取默认配置文件一样.

8. SpringBoot支持哪些日志框架

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

9.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 配合完成统一异常拦截处理.
    备注: 面试的时候记住6.7个即可~

你可能感兴趣的:(#,+SpringBoot,SpringBoot面试,读取配置文件方式)