摘要
记录下在看spring boot 源码时,如何spring是如何实现yml自动装配。
入口
在spring boot启动类中的@SpringBootApplication就是实现自动装配的线索,通过代码可以发现@EnableAutoConfiguration就是实现自动装配的核心所在。
在
EnableAutoConfiguration类中找到EnableAutoConfigurationImportSelector
直接继续跟着代码寻找,selectImports方法中getCandidateConfigurations获取自动装配类的方法
接下来就是通过类加载器寻找META-INF/spring.factories文件
在spring-boot-autoconfigure包中META-INF/spring.factories自动装配类的配置
以我们常用的redis为例,看下spring是如何完成自动装配的。
Conditional家族
- @ConditionalOnProperty:如果有指定的配置,条件生效;
- @ConditionalOnBean:如果有指定的Bean,条件生效;
- @ConditionalOnClass:当类路径下有指定的类,条件生效;
- @ConditionalOnMissingBean:如果没有指定的Bean,条件生效;
- @ConditionalOnMissingClass:如果没有指定的Class,条件生效;
- @ConditionalOnWebApplication:在Web环境中条件生效;
- @ConditionalOnExpression:根据表达式判断条件是否生效。 所以只有在pom.xml文件中添加spring-boot-starter-data-redis,redis的自动配置才生效的,我们就能看到常规配置注入了。
EnableConfigurationProperties
进入@EnableConfigurationProperties 中配置的RedisProperties.class
总结
Spring Boot通过@EnableAutoConfiguration注解找到项目jar包下的META-INF/spring.factories配置文件中的所有自动配置类,根据条件对其进行加载,通过@ConfigurationProperties注解,从配置文件中读取配置信息,并对其进去注入,完成装配。