SpringBoot项目无需各种配置文件,一个main方法,就能把项目启动起来。那么我们看看SpringBoot是如何进行自动配置和启动的。
-
SpringBoot项目无需各种配置文件,一个main方法,就能把项目启动起来。那么我们看看SpringBoot是如何进行自动配置和启动的。
-
根据注释的意思,run方法从一个使用了默认配置的指定资源启动一个
SpringApplication
并返回ApplicationContext
对象,这个默认配置如何指定呢?
-
这个默认配置来源于
@SpringBootApplication
注解,这个注解是个复合注解,里面还包含了其他注解。
-
其中有三个注解是比较重要的:
-
@SpringBootConfiguration
:这个注解的底层是一个@Configuration
注解,意思被 @Configuration注解修饰的类是一个 IOC容器,支持 JavaConfig的方式来进行配置; -
@ComponentScan
:这个就是扫描注解的意思,默认扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository
等注解加载到IOC容器中; -
@EnableAutoConfiguration
:这个注解表明启动自动装配,里面包含连个比较重要的注解@AutoConfigurationPackage
和@Import
。
-
-
@AutoConfigurationPackage和@ComponentScan一样,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,但是区别是:
@AutoConfigurationPackage
扫描@Enitity、@MapperScan
等第三方依赖的注解;@ComponentScan
只扫描@Controller/@Service/@Component/@Repository
这些常见注解。所以这两个注解扫描的对象是不一样的。
-
@Import(AutoConfigurationImportSelector.class)
是自动装配的核心注解,AutoConfigurationImportSelector.class
中有个selectImports
方法
selectImports
方法还调用了getCandidateConfigurations
方法
getCandidateConfigurations方法中,我们可以看下
断言
,说找不到META-INF/spring.factories
,由此可见,这个方法是用来找META-INF/spring.factories
文件的;
我们可以定位到这个方法所在的类处于spring-boot-autoconfigure-.jar包中,
其中
spring.factories
文件是一组组的key=value的形式,包含了key为EnableAutoConfiguration的全类名,value是一个AutoConfiguration类名的列表,以逗号分隔。
最终,
@EnableAutoConfiguration注解
通过@SpringBootApplication注解
被间接的标记在了SpringBoot的启动类
上,SpringApplicaton.run方法的内部就会执行selectImports方法
,进而找到所有JavaConfig配置类
全限定名对应的class,然后将所有自动配置类加载到IOC容器
中。
那么这些类是如何获取默认属性值的呢?以ServletWebServerFactoryAutoConfiguration为例,它是Servlet容器的自动配置类
该类上开启了
@EnableConfigurationProperties(ServerProperties.class)
注解,最终找到了ServerProperties类。至此,我们大致可以了解。在全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解
导入到Spring容器中。
总结:SpringBoot启动的时候通过
@EnableAutoConfiguration
注解找到META-INF/spring.factories
文件中的所有自动配置类,并对其加载,这些自动配置类都是以AutoConfiguration
结尾来命名的。它实际上就是一个JavaConfig形式的IOC容器配置类
,通过以Properties结尾命名的类中取得在全局配置文件中配置的属性,如server.port。
Properties
类的含义:封装配置文件的相关属性。
AutoConfiguration
类的含义:自动配置类,添加到IOC容器中。