搞懂SpringBoot自动装配原理!

71 阅读2分钟

spring boot启动类

在使用springboot的时候,我们可以很明显的感觉到,脱离了之前繁杂的配置,在构建项目的时候非常的快捷。那么spring boot是怎么帮我们避免手动配置,自动装配的呢? 我们在构建项目的时候,我们都会创建一个spring boot启动类,而这个启动类就是解开它神秘面纱的入口!

image.png 从上图可以看出,启动类中关键的就是@SpringBootApplication注解和SpringApplication.run(QuickStartApplication.class,args); run方法加载启动类的字节码文件,这样就可以识别@SpringBootApplication注解。

@SpringBootApplication注解

@SpringBootApplication注解其实是一个复合注解,它里面包含三个关键的注解。 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan

image.png

  • @SpringBootConfiguration 它实际上是应用了@Configuration,就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration。他们作用相同,都是用来表示当前类是一个可以被组件扫描器扫描的配置类。

image.png

-@ComponentScan @ComponentScan在spring中是一个组件扫描注解,它可以自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。

image.png

  • @EnableAutoConfiguration 这个注解最为重要,它作为一个复合注解,其核心注解如下:

image.png

两个比较重要的注解:

  @AutoConfigurationPackage:自动配置包
  @Import: 导入自动配置的组件
  • AutoConfigurationPackage注解: image.png 它其实是注册了一个Bean的定义。 new PackageImport(metadata).getPackageName(),它其实返回了当前主程序类的同级以及子级的包组件。这也就是为什么要把启动类放到最外层包里
  • Import(AutoConfigurationImportSelector.class)注解:

image.png 可以从图中看出 AutoConfigurationImportSelector 继承了 DeferredImportSelector 继承了 ImportSelector 它其实是去加载 public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";外部文件。这个外部文件,有很多自动配置的类。

image.png

总结:

  • 第一个注解是 @SpringBootConfiguration,底层是一个@Configuration注解,表示当前类是一个配置类
  • 第二个注解是@ComponentScan,是一个组件扫描,spring会扫描引导类所在的包及子包下的组你
  • 第三个注解是@EnableAutoConfiguration,底层是通过@Import注解导入一个AutoConfigurationImportSelector配置类,这个配置类会自动调用 selectImports 方法,这个方法会去扫描 META-INF/spring.factories的文件中Key为EnableAutoConfiguration的所有数据,同时还会扫描 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中的数据,再经过@CondtionalXxx的条件判断,把满足条件的内容加载到内存中,封装成一字符串数组