哎呦,不错超详细的SpringBoot自动装配原理剖析(下)( 二 )

debug , 看看要从META-INF/spring.factories中加载的类的key , 如下图所示:org.springframework.boot.autoconfigure.EnableAutoConfiguration
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
回到selectImports()方法 , debug , 跳过List configurations = getCandidateConfigurations(annotationMetadata,attributes);看一下configurations
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
竟然有一百多个 , 那这些类都在哪里呢?看spring-boot-autoconfigure(当然在SpringBoot的工程中 , 也不止这一个依赖包中存在该配置文件)工程下的META-INF/spring.factories , 我们能看到org.springframework.boot.autoconfigure.EnableAutoConfiguration定义了一大堆 。
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
继续看Set exclusions = getExclusions(annotationMetadata, attributes);方法 , 该方法是排除主类上@SpringBootApplication注解上排除的自动装配的类 。 比如我们在该注解上排除我们自定义starter的自动装配的类 , @SpringBootApplication(exclude = {com.demo.starter.config.DemoConfig.class})(当然也可以用excludeName进行排除) , 那么在后面的configurations.removeAll(exclusions);方法中将会删除我们的com.demo.starter.config.DemoConfig.class 。
configurations = filter(configurations, autoConfigurationMetadata);该行代码将会过滤掉不需要装配的类 。 过滤的逻辑有很多 , 比如我们常用的@ConditionXXX注解 。 如下所示
【哎呦,不错超详细的SpringBoot自动装配原理剖析(下)】@ConditionalOnBean:容器中有指定的Bean @ConditionalOnClass:当类路径下有指定的类 @ConditionalOnExpression:基于SpEL表达式作为判断条件 @ConditionalOnJava:基于JVM版本作为判断条件 @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置 @ConditionalOnMissingBean:当容器中没有指定Bean的情况下 @ConditionalOnMissingClass:当类路径下没有指定的类 @ConditionalOnNotWebApplication:当前项目不是Web项目 @ConditionalOnProperty:配置文件中指定的属性是否有指定的值 @ConditionalOnResource:类路径下是否有指定的资源 @ConditionalOnSingleCandidate:当指定Bean在容器中只有一个 , 或者虽然有多个但是指定首选Bean @ConditionalOnWebApplication:当前项目是Web项目的条件下
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
上图这种没有满足@ConditionXXX注解的自动配置类 , 就不会被注入到IoC容器中
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
而这种满足了@ConditionXXX的自动配置类就会被导入到IoC容器中了
除了这些条件注解 , 我们还有一些注解可以讲
找到EnableConfigurationProperties注解 , 点进它这个类 。
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
点进来后我们能看到一个前缀(spring.mvc) , 和非常多的属性 。
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
不难猜到这些属性就是对应的我们能够在application.yaml配置文件中自定义配置的一些配置 。
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
我们来看一下ConfigurationProperties这个注解
这个注解会将我们配置文件中的配置项和它prefix参数中的前缀进行匹配 。
如果能够匹配到的话 , 就会将我们配置文件的配置项读到其前缀相匹配的类中
哎呦,不错超详细的SpringBoot自动装配原理剖析(下)文章插图
而EnableConfigurationProperties注解又将该类注入到了我们的IoC容器中 , 那我们启动SpringBoot主程序时也就自然而然的实现了自定义配置的操作 。
由于篇幅问题 , 仍有一部分没有讲到 , 也就是IoC容器的注入 感兴趣的朋友可以去原作者的博客园看一下这篇文章 , 我这里把地址贴出来
SpringBoot启动流程分析(六):IoC容器依赖注入
作者:Moluuu链接:来源:掘金著作权归作者所有 。 商业转载请联系作者获得授权 , 非商业转载请注明出处 。