当我们在pom.xml里引入了web的起步依赖,就可以直接使用SpringMVC框架了。在这个过程中,Springboot究竟帮我们做了什么事情呢?这一切都要从引导类开始。
SpringApplication.run方法
这个方法的主要作用是:引导创建一个ApplicationContext容器对象,创建容器后会把运行的引导类注册到容器中,读取引导类上的注解
这是一个组合注解,它实际上引入了多个注解,其中我们主要关注:
-
@SpringBootConfiguraion
:加这个注解的类是Springboot的配置类 -
@EnableAutoConfigutation
:启用Springboot的自动配置 -
@ComponentScan
:开启组件扫描。如果不指定扫描的包,会扫描引导类所在的包
@SpringBootConfiguration
这也是一个组合注解,它实际上引入了@Configuration
,表示是一个配置类
@EnableAutoConfiguration
这个注解表示开启SpringBoot的自动配置功能。SpringBoot会根据你引入的依赖、classpath是否有某些类等等信息,猜测你需要什么样的功能,把相应的bean注册到容器中等你使用。
那么SpringBoot是如何猜测出你的需求呢?这也是一个组合注解,它实际上引入了两个注解:
-
@AutoConfigurationPackage
-
@Import(AutoConfigurationImportSelector.class)
,我们主要关注这个注解 -
AutoConfigurationImportSelector
我们知道,
@Import
可以导入一个ImportSelector
类,它会把类里selectImports
方法返回的类名称,注册到IoC容器中。而AutoConfigurationImportSelector
,是把所有符合条件的@Configuration
配置类注册到容器里。AutoConfigurationImportSelector源码
经过追踪,selectImports方法里最终调用到了
SpringFactoriesLoader
的loadFactoryNames
方法 -
SpringFactoriesLoader
源码
在loadFactoryNames
方法里调用了loadSpringFactories
方法,而在loadSpringFactories
方法中,从所有jar的类路径下查找并加载了META-INF/spring.factories
文件,把文件中相关的配置类注册bean对象spring-boot-autoconfigure-2.1.3.RELEASE.jar
包里有这个文件,其中配置了大量的Configuration类,每个配置类会扫描某些包、注册一些bean,提供一些功能。