逆着
全局配置文件中可以配置的属性是由某些properties结尾的类进行限制。例如ServerProperties类。里面有port属性,当我们在全局配置文件中配置server.port=9090的时候,这个属性的值通过ServerProperties类上面的@configurationProperties注解绑定到这个ServerProperties类中的属性上。又通过ServletWebServerFactoryAutoConfiguration这个配置类上面的@EnableConfigurationProperties(ServerProperties.class)这个注解把已经绑定属性数据了的properties bean注入到spring容器中。然后后面的其他注解作用差不多都是为了加载ServletWebServerFactoryAutoConfiguration这个配置类。
顺着
项目启动类上面有@SpringbootApplication注解,这个组合注解里面有@EnableAutoConfiguration注解。而@EnableAutoConfiguration复合注解里有@import(AutoConfigurationImportSelector.class)这个注解。AutoConfiguartionImportSelector里面的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描spring-boot-autoconfigure-xxx.jar包中的spring.factories文件。这个文件是由键值对组成的,key是EnableAutoConfiguration全类名名称,value就是那些xxxAutoConfiguration(例如上面的ServletWebServerFactoryAutoConfiguration)的类名列表以逗号分隔。逆着和顺着由XXXAutoConfiguration这个类连接起来了。
注解流程:@SpringbootApplication ---> @EnableAutoConfiguration --> @Import( AutoConfigurationImportSelector.class),selectImports()里面的SpringFactoriesLoader.loadFactoryName() -->xxxAutoConfiguration类。---->@EnableConfigurationProperties(xxxProperties.class)----->@ConfigurationProperties进行和配置文件绑定。---->xxxProperties.class里面就是各种与配置文件对应的属性。
@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。
这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示: