springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配
的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理。
具体过程
@SpringBootApplication
这个注解是springboot启动类上的一个注解,是一个组合注解,也就是由其他注解组合起来,它的
主要作用就是标记说明这个类是springboot的主配置类,springboot应该运行这个类里面的main()。 这个注解主要由三个子注解组成:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@SpringBootConfiguration
这个注解包含了@Configuration,@Configuration里面又包含了一个@Component注解,也就是
说,这个注解标注在哪个类上,就表示当前这个类是一个配置类,而配置类也是spring容器中的组
件
@EnableAutoConfiguration
这个注解是开启自动配置的功能,里面包含了两个注解
- @AutoConfigurationPackage
- @Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
这个注解的作用说白了就是将主配置类(@SpringBootApplication标注的类)所在包以及子包里面
的所有组件扫描并加载到spring的容器中。
@Import(AutoConfigurationImportSelector.class)
上一个注解我们把所有组件都加载到了容器里面,这个注解就是将需要自动装配的类以全类名的方
式返回,那是怎么找到哪些是需要自动装配的类呢? 1、AutoConfigurationImportSelector这个类里面有一个方法selectImports()
2、在selectImport()方法里调用了一个getAutoConfigurationEntry()方法,这个方法里面又调用
了一个getCandidateConfigurations()方法。
3、在getCandidateConfigurations()方法里面调用了loadFactoryNames()方法
5、关键就在这个loadSpringFactories()方法里面,在这个方法里,它会查找所有在META-INF路径下的spring.factories文件。
6、在META-INF/spring.factories这个文件里面的数据是以键=值的方式存储,然后解析这些文件,找出以EnableAutoConfiguration为键的所有值,以列表的方式返回。
@Configuration(proxyBeanMethods = false)————表示该类为配置类 @EnableConfigurationProperties(ServerProperties.class)————将配置文件中设置的值与properties中的属性绑定,将组件添加到IOC容器 ————@Conditionalxxx:若满足不同的条件,则配置类中的配置生效 @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @ConditionalOnClass(CharacterEncodingFilter.class) @ConditionalOnProperty(prefix = “server.servlet.encoding”, value = “enabled”, matchIfMissing = true) @ComponentScan
这个注解的作用就是扫描当前包及子包的注解
自动装配过程
- 通过各种注解实现了类与类之间的依赖关系,容器在启动的时候SpringApplication.run(),调用EnableAutoConfigurationImportSelector.class的selectImports方法
- selectImports方法调用SpringFactoriesLoader.loadFactoryNames方法扫描jar包类路径下的META-INF/spring.factories文件下,获取BeanConfiguration列表
- loadFactoryNames方法会读取spring.factories中EnableAutoConfiguration.class类名对应的值
- 根据这些类上的注解判断,若条件满足,则该配置类生效,将配置文件中自己设置的属性值配置到对应的配置类中,最后注入到IOC容器中实现自动配置
总结
SpringBoot启动的时候通过@EnableAutoConfiguration注解找到META-INF/spring.factories文件中的所有自动配置类,并对其加载,这些自动配置类都是以AutoConfiguration结尾来命名的。它实际上就是一个JavaConfig形式的IOC容器配置类,通过以Properties结尾命名的类中取得在全局配置文件中配置的属性,如server.port。