@Conditional 条件装配
@Conditional 条件装配
@Conditional 提供自动装配的条件约束,一般与 @Configuration 和 @Bean 配合使用
根据该注解配置的条件决定是否实现 Bean 的装配
Condition 是一个接口 ,提供 matches 方法,返回 true 表示可以注入 Bean,返回 false 表示不满足条件,不能注入 Bean
自定义 Condition
我们可以自定义 Condition
ConditionConfig 配置类:
XpCondition 的 matches 返回 true 时候,才会将 BeanClass 装载到 Spring Ioc 容器中
SpringBoot 中的 Conditional
SpringBoot 针对 Conditional 做了扩展:
ConditionalOnBean ConditionalOnMissingBean:容器中存在某个类或不存在某个 Bean 时进行 Bean 装载
ConditionalOnClass ConditionalOnMissingClass:classpath 下存在指定类或者不存在指定类时进行 Bean 装载
ConditionalOnResource:指定资源是否存在于 classpath 下
ConditionalOnProperty: 系统中指定的对应的属性是否有对应的值。
ConditionalOnExpression:符合指定表达式的时候除此以外,SpringBoot 还扩展了别的 Conditional 注解的扩展类
批量自动装配条件配置
SpringBoot 提供了 spring-autoconfigure-metadata.properties 实现批量自动装配条件配置
约定优于配置:
配置文件的路径和名称必须是 META-INF/spring-autoconfigure-metadata.properties
配置文件中 key 的配置格式:自动配置类的类全路径名.条件=值
降低了 SpringBoot 启动时间,过滤发生在配置类的装配之前,降低 Spring Boot 启动时装载 Bean 的耗时。
总结
这篇文章从 @Conditional 注解出发,并且利用 @Conditional 注解自定义 Condition 类,同时讲解了一下 SpringBoot 基于 @Conditional 注解封装了一些自己的注解,比如 ConditionalOnBean 注解、ConditionalOnClass 注解等等,这些注解在 SpringBoot 和其他框架的源码中经常被使用,对于 Spring Boot 的批量自动装配,用约定大于配置的思想,规定配置文件必须是 META-INF/spring-autoconfigure-metadata.properties,而且这个文件中必须以 key value 形式的存储,springboot 除了这个自动装配条件以外,还有利用 spring-boot 的 SPI 机制来获得所有自动装配的配置信息,我们从上篇文章的 Springboot 的自动装配机制中对 Springboot 自动装配的源码分析中就能看出来,主要是通过这两个来进行自动装配的。
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/d978d045675378b625e116119】。文章转载请联系作者。
评论