# Spring Boot是什么

Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

# Spring Boot的优点

  1. 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
  2. 开箱即用,远离繁琐的配置。
  3. 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
  4. 没有代码生成,也不需要XML配置。
  5. 避免大量的 Maven 导入和各种版本冲突。

# Spring Boot自动配置原理

SpringBoot 项目的一切都要从 @SpringBootApplication 这个注解开始说起。

@SpringBootApplication 标注在某个类上说明:

  • 这个类是 SpringBoot 的主配置类。
  • SpringBoot 就应该运行这个类的 main 方法来启动 SpringBoot 应用。
@SpringBootConfiguration 
@EnableAutoConfiguration 
@ComponentScan( 
excludeFilters = {@Filter( 
  type = FilterType.CUSTOM, 
  classes = {TypeExcludeFilter.class} 
), @Filter( 
    type = FilterType.CUSTOM, 
    classes = {AutoConfigurationExcludeFilter.class} 
)} 
) 
public @interface SpringBootApplication { 
    
}

可以看到SpringBootApplication 注解是一个组合注解,其主要组合了一下三个注解:

  • @SpringBootConfiguration:该注解表示这是一个 Spring Boot 的配置类,其实它就是一个@Configuration 注解而已。
  • @ComponentScan:开启组件扫描。
  • @EnableAutoConfiguration:从名字就可以看出来,就是这个类开启自动配置的。嗯,自动配置的奥秘全都在这个注解里面。

先看该@EnableAutoConfiguration注解是怎么定义的 ,

@AutoConfigurationPackage 
@Import({AutoConfigurationImportSelector.class}) 
public @interface EnableAutoConfiguration { 
}
  • @AutoConfigurationPackage 注解就是将主配置类(@SpringBootConfiguration标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器中。
  • @Import({AutoConfigurationImportSelector.class})该注解给当前配置类导入另外的 N 个自动配置类。

进入类AutoConfigurationImportSelector,观察其selectImports方法,这个方法执行完毕后,Spring会把这个方法返回的类的全限定名数组里的所有的类都注入到IOC容器中。具体分析这个方法。

  1. 第一行if时会首先判断当前系统是否禁用了自动装配的功能,如果当前系统禁用了自动装配的功能则会返回如下这个空的数组,后续也就无法注入bean了。

  2. 此时如果没有禁用自动装配则进入else分支,第一步操作首先会去加载所有Spring预先定义的配置条件信息,这些配置信息在org.springframework.boot.autoconfigure包下的META-INF/spring-autoconfigure-metadata.properties文件中。

  3. 这些配置条件主要含义大致是这样的:如果你要自动装配某个类的话,你觉得先存在哪些类或者哪些配置文件等等条件,这些条件的判断主要是利用了@ConditionalXXX注解。

  4. 获取@EnableAutoConfiguration注解上的excludeexcludeName属性,这两个属性的作用都是排除一些类的。

  5. 加载整个项目所有的spring.factories文件。

  6. 删除重复的自动配置类,去除我们指定排除的配置类。

  7. 根据加载的配置条件信息来判断各个配置类上的@ConditionalXXX系列注解是否满足需求。

  8. 最后就是发布自动装配完成事件,然后返回所有能够自动装配的类的全限定名。

LastUpdated: 3/11/2021, 7:31:36 PM