SpringBoot

springboot启动流程

SpringBoot启动的时候,会构造一个SpringApplication的实例,然后调用这个实例的run方法,在run方法调用之前,也就是构造SpringApplication的时候会进行初始化的工作,初始化的时候会做以下几件事:

(1)把参数sources设置到SpringApplication属性中,这个sources可以是任何类型的参数.
(2)判断是否是web程序,并设置到webEnvironment的boolean属性中.
(3)创建并初始化ApplicationInitializer,设置到initializers属性中 。
(4)创建并初始化ApplicationListener,设置到listeners属性中 。
(5)初始化主类mainApplicatioClass。

SpringBoot的自动装配原理

Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中

Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系!

其关键点是注解@EnableAutoConfiguration当中的导入import的AutoConfigurationImportSelector中的selectImports方法 通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包

在spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。

这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔

类似于下图

dqf9l.png

这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(...)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

总结:

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

https://blog.csdn.net/u014745069/article/details/83820511

简单介绍⼀下 Spring?有啥缺点?

缺点是集成度较高,使用过程中不太容易了解底层。

ioc和aop配置复杂

说出使⽤ Spring Boot 的主要优点

(1)简化配置,不需要编写太多的xml配置文件;

(2)基于Spring构建,使开发者快速入门,门槛很低;

(3)SpringBoot可以创建独立运行的应用而不需要依赖于容器;

(4)内置tomcat服务器,不需要打包成war包,可以直接放到tomcat中运行;

(5)提供maven极简配置,以及可视化的相关监控功能,比如性能监控,应用的健康程度等;

(6)为微服务SpringCloud奠定了基础,使得微服务的构建变得简单;

(7)Spring可以整合很多各式各样的框架,并能很好的集成;

(8)活跃的社区与论坛,以及丰富的开发文档;

什么是 Spring Boot Starters?

starter是SpringBoot中的一个新发明,它有效的降低了项目开发过程的复杂程度,对于简化开发操作有着非常好的效果。

参考连接:https://stackoverflow.com/questions/28273543/what-are-spring-boot-starter-jars/28273660#28273660

Spring Boot ⽀持哪些内嵌 Servlet 容器?

Spring Boot支持Tomcat、Jetty和Undertow三种Servlet容器嵌入到Web应用程序中,开发者使用starter即可方便嵌入,默认情况下,嵌入服务器的访问端口为8080。

如何在 Spring Boot 应⽤程序中使⽤ Jetty ⽽不是 Tomcat?

就是在pom.xml文件中,在引用的spring-boot-starter-web排除Tomcat的依赖包,然后再引入Jetty容器的依赖包,如下:

<dependencies>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</artifactId>              <exclusions>                  <exclusion>                      <groupId>org.springframework.boot</groupId>                      <artifactId>spring-boot-starter-tomcat</artifactId>                  </exclusion>              </exclusions>          </dependency>            <!-- Jetty适合长连接应用,就是聊天类的长连接 -->          <!-- 使用Jetty,需要在spring-boot-starter-web排除spring-boot-starter-tomcat,因为SpringBoot默认使用tomcat -->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-jetty</artifactId>          </dependency>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>  </dependencies>  

把容器修改为undertow

<dependencies>          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</artifactId>              <exclusions>                  <exclusion>                      <groupId>org.springframework.boot</groupId>                      <artifactId>spring-boot-starter-tomcat</artifactId>                  </exclusion>              </exclusions>          </dependency>                    <!-- undertow不支持jsp -->          <!-- 使用undertow,需要在spring-boot-starter-web排除spring-boot-starter-tomcat,因为SpringBoot默认使用tomcat -->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-undertow</artifactId>          </dependency>                    <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>  </dependencies>  

参考:

https://www.cnblogs.com/fanshuyao/p/8668059.html

介绍⼀下@SpringBootApplication 注解

@SpringBootApplication注解包含三个注解:

  • @ComponentScan扫描当前包和子包中的组件,自动注册到ioc中
  • @SpringBootConfiguration,它其实也是一个configuration,说明启动类也是一个配置类
  • @EnableAutoConfiguration,这个注解是实现自动配置的最主要的注解。这个注解里包含**@AutoConfigurationPackage自动配置包**还有@import一个AutoConfigurationImportSelector.class。这个类中通过loadFactoryNames读取meta-inf中的spring。factories文件中自动装配的类。而这些类是pom文件中导入了start之后才能生效。这些类都是XXXautoconfiguration,中还绑定了有属性的xxx.properties,这些properties有一些默认的属性。我们也可以在配置文件yml或者properties中修改这些属性。
    SpringApplication.run一共做了两件事
  1. 创建SpringApplication对象;在对象初始化时保存事件监听器,容器初始化类以及判断是否为web应用,保存包含main方法的主配置类。
  2. 调用run方法;准备spring的上下文,完成容器的初始化,创建,加载等。会在不同的时机触发监听器的不同事件。

Spring Boot 的⾃动配置是如何实现的?

参考:https://blog.csdn.net/u014534808/article/details/105961992/

开发 RESTful Web 服务常⽤的注解有哪些?

  • @GetMapping,处理 Get 请求
  • @PostMapping,处理 Post 请求
  • @PutMapping,⽤用于更新资源
  • @DeleteMapping,处理删除请求
  • @PatchMapping,用于更新部分资源

Spirng Boot 常⽤的两种配置⽂件

properties

yaml

什么是 YAML?YAML 配置的优势在哪⾥ ?

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

  • 配置有序,在一些特殊的场景下,配置有序很关键
  • 支持数组,数组中的元素可以是基本数据类型也可以是对象 简洁 相比 properties
  • 相比properties配置文件,YAML还有一个缺点,就是不支持@PropertySource注解导入自定义的YAML配置。

Spring Boot 常⽤的读取配置⽂件的⽅法有哪些?

  1. 通过获取环境变量来获取配置参数
  2. 通过注解获取配置文件信息

参考链接

Spring Boot 加载配置⽂件的优先级了解么?

  1. file:/config/

  2. file:/

  3. classpath:/config/

  4. classpath:/

常⽤的 Bean 映射⼯具有哪些?

BeanUtils---先用 jdk 的 java.beans.Introspector类的getBeanInfo()方法获取对象的属性信息及属性get/set方法,接着使用反射(Method的invoke(Object obj, Object… args))方法进行赋值

BeanCopier---直接使用ASM的MethodVisitor直接编写各属性的get/set方法

mybatis

Spring Boot 如何监控系统实际运⾏状况?

组件 Spring Boot Actuator 负责监控应⽤的各项静态和动态的变量

Spring Boot 如何做请求参数校验?

spring-boot-starter-validation

如何使⽤ Spring Boot 实现全局异常处理?

使⽤ @ControllerAdvice 定义统⼀的异常处理类,⽽不是在每个Controller中逐个定义

@ExceptionHandler ⽤来定义函数针对的异常类型

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

一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz

参考链接

分布式系统session一致性问题

  • session同步法:多台web-server相互同步数据
  • **客户端存储法:**一个用户只存储自己的数据
  • **反向代理hash一致性:**四层hash和七层hash都可以做,保证一个用户的请求落在一台web-server上
  • **后端统一存储:**web-server重启和扩容,session也不会丢失

参考