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,就有对应的启动器,有了启动器就能帮我们进行自动配置类