SpringBoot---自动配置原理

SpringBoot项目无需各种配置文件,一个main方法,就能把项目启动起来。那么我们看看SpringBoot是如何进行自动配置和启动的。

先看下图的SpringBoot项目的启动类

SpringBoot程序能够实现自动配置主要来源于@SpringBootApplication注解,这个注解是个复合注解,其中有三个注解是比较重要的:

1.@SpringBootConfiguration注解

   这个注解的底层是一个@Configuration注解,表明这是一个配置类,支持JavaConfig的方式来进行配置;

2.@ComponentScan注解(扫描注解)

  默认扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中;

3.@EnableAutoConfiguration注解

   字面意思为启动自动装配,里面包含两个比较重要的注解@AutoConfigurationPackage和@Import。

再看一下@AutoConfigurationPackage注解和@Import注解

 

1.@AutoConfigurationPackage注解

   此注解和@ComponentScan一样,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中。

   区别是@AutoConfigurationPackage扫描@Enitity、@MapperScan等第三方依赖的注解。

   @ComponentScan只扫描@Controller/@Service/@Component/@Repository等常见注解。两个注解扫描的对象是不一样的。

2.@Import(AutoConfigurationImportSelector.class)注解

   此注解是自动装配的核心注解,其导入的AutoConfigurationImportSelector类中有个selectImports方法,

   selectImports()方法通过 SpringFactoriesLoader.loadFactoryNames()来扫描所有具有目录为META-INF/spring.factories的jar包。

spring-boot-autoconfigure-x.x.x.x.jar里就有一个在META-INF目录下的spring.factories文件。

spring.factories文件由一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,

而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔。

  @EnableAutoConfiguration注解通过@SpringBootApplication注解被间接的标记在了SpringBoot的启动类上,springboot项目启动时,SpringApplicaton.run方法的内部就会执行selectImports方法,进而找到所有JavaConfig配置类全限定名对应的class,然后将所有自动配置类加载到IOC容器中。

  SpringBoot不需要写配置文件的原因是,SpringBoot所有配置都是在启动的时候进行扫描并加载,SpringBoot的所有自动配置类都在Spring.factories里面,但是不一定会生效,生效前要判断条件是否成立,只要导入了对应的start,就有对应的启动器,有了启动器就能帮我们进行自动配置类

我话讲完!谁赞成?谁反对?
原文地址:https://www.cnblogs.com/wffzk/p/14793450.html