SpringBoot原理

130 阅读3分钟

一、Springboot零配置的实现

主要思想是通过注解来代替之前的XML

在创建传统SpringMVC项目时,需要复杂的配置文件,例如:

1、web.xml,(1)配置servlet给容器,也就是我们的tomcat(2)初始化springcontext

2、application.xml,扫描mybatis.xml,扫描mapper,数据源,扫描包

3、springmvc.xml,扫描controller,视图解析器等

总结一下启动服务做了哪些事情:

  • 启动了一个Tomcat服务
  • 初始化Spring上下文环境
  • 注册DispatcherServlet

Spring Boot要想达到零配置,这些问题必须要解决。

解决方案

  • 内嵌Tomcat代替原生去除web.xml: WebInit extends AbstractAnnotationConfigDispatcherServletInitializer 
  • 用JavaConfig,@Configuration,@Bean来代替applicationContext.xml,声明将Bean交给容器管理。@Configuration>  public class SpringConfig
  • 代替spring-mvc.xml。各种注解+DispatchServlet的自动装配。WebConfig implements WebMvcConfigurer

二、Spring内嵌Tomcat底层原理

  在刷新容器上下文的时候,会加载tomcat

三、Springboot自定义starter及自动装配底层原理

  1. Spring Boot 中,我们直接引入一个 starter 即可。引入 starter 之后,我们通过少量注解和一些简单的配置就能满足第三方的依赖

2. @SpringBootApplication

  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
  • @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
  • @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描[启动类]所在的包下所有的类
  1. @EnableAutoConfiguration:实现自动装配的核心注解
  • @Import({AutoConfigurationImportSelector.class})

将AutoConfigurationImportSelector这个类导入到spring容器中,AutoConfigurationImportSelector可以帮助springboot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器

  • @Import 注解

普通类,直接导入到IOC容器管理

ImportBeanDefinitionRegistrar接口实现类,支持手动注册bean

ImportSelector实现,ImportSelector接口只定义了一个selectImports()会把实现类中返回的Class名称都定义为bean.

  • AutoConfigurationImportSelector中的selectImport是自动装配的核心实现,它主要是读取META-INF/spring.factories文件,经过去重、过滤,返回需要装配的取需要配置的bean全限定名列表。

4.总结

(1)@SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})实现自动装配。

(2)AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类。

(3)通过Spring提供的SpringFactoriesLoader机制(SPI),扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类。

(4)依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配。

四、Springboot启动流程源码(spring 的监听机制 )

图片4.png

  • SpringApplication 构造方法

获得应用类型

利用spi机制加载applicationContextInitializer【初始化器】, applicationLister【监听器】接口实例(META-INF/[spring.factories]

定位main方法

  • 调run方法

获取并启动监听器

准备环境

刷新容器(上下文)前 (内置tomcat)

刷新容器

刷新容器后

发布容器启动完成事件

五、SpringBoot配置文件的优先级

1、配置文件加载顺序小结

简单:命令行,系统环境变量,properties,yaml,yml

外部配置加载顺序SpringBoot也可以从以下位置加载配置:

优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 。

  • 命令行参数。所有的配置都可以在命令行上进行指定;
  • 来自java:comp/env的JNDI属性;
  • Java系统属性(System.getProperties());
  • 操作系统环境变量 ;
  • jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  • jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile
  • jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  • jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  • @Configuration注解类上的@PropertySource

2、bootstrap.xml 和application.yml

六、Springboot的关键标签*