我们在创建springboot项目的时候,发现只需要一个主启动类就可以运行整个springboot项目,我们一起来看一下springboot是如何自动装配和启动的。
一、
springboot的主启动类调用方法run()来启动项目。run方法传了3个参数,appName(启动类名称),source(资源),而这个source是通过@SpringBootApplication来指定配置资源,并返回一个ApplicationContext对象。
二、
@SpringbootApplication这个注解是一个组合注解,包含了3个注解,分别是
(1)@SpringBootConfiguration(底层是@Configuration注解,修饰的类是一个IOC容器)
(2)@EnableAutoConfiguration(自动装配注解),也是一个组合注解,包含@AutoConfigurationPackage和@Impot两个注解。
(3)@Component(包扫描注解,扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中)
三、
@Import({AutoConfigurationImportSelector.class})是自动装配的核心注解,传入一个AutoConfigurationImportSelector类,从字面意识上来看,自动导入选择器。
AutoConfigurationImportSelect类中的selectImports方法调用了getCandidateConfigurations方法,从这个绿色的字体中可以看出,该方法是从META-INF/spring.factories中找配置文件。
我们可以找到该类所处的包下META-INF/spring.factories文件
发现 spring.factories文件是一组组的key=value的形式,包含了key为EnableAutoConfiguration的全类名,value是一个AutoConfiguration类名的列表,以逗号分隔。
在主启动类运行run方法时,就会间接调用selectImports方法,找到所有JavaConfig配置类全限定名对应的class,然后将所有自动配置类加载到IOC容器中。