@Conditional+@Configuration有没有搞头?

打印 上一主题 下一主题

主题 922|帖子 922|积分 2766

日拱一卒,功不唐捐。

在了解 @Conditional 之前先花 10 秒钟复习一下 @Configuration 这个注解。
@Configuration 是干什么?
是配合 @Bean 注解来配置 Spring 容器的 bean 的。
那它为什么会出现呢?
因为配置 bean 的另一种方式是 xml ,狗都不用。
那给个示例看看呗?
简单。
  1. @Configuration
  2. public class AppConfig {
  3.     @Bean
  4.     public MyBean myBean() {
  5.         // 初始化, 配置, 返回bean...
  6.     }
  7. }
复制代码
下面进入主题:
@Conditional 是什么东西?
首先明确第一点:
@Conditional 是 Spring 提供的。
其次明确第二点:
Conditional 中文译为:有条件的,依...而定的。
前边既然讲了 @Configuration 的简单用法,那么问题就是:
@Configuration + @Conditional 有没有搞头?
有搞头。
怎么搞?
那就是可以给@Configuration加上一个开关。
我打开开关,你这配置就好用。
我关闭开关,你这配置就不好用。
进一步升级。
我给 @Configuration 里的 @Bean 加一个开关。
我打开开关,你这 bean 就注册。
我关闭开关,你这 bean 就不注册。
那开关在哪里呢?
废话不多说,先上代码。
  1. @Configuration
  2. @Conditional(MyCondition.class)
  3. public class ConditionConfig {
  4.     @Bean
  5.     public ConditionBean conditionBean() {
  6.         return new ConditionBean();
  7.     }
  8. }
复制代码
开关就是代码中的 MyCondition.class
WTF is MyCondition.class ?
MyCondition类就是我们自定义的开关,我们定义什么时候开,什么时候关的逻辑。
很明显这个逻辑不可能是 Spring 给的。
但 Spring 又必须插手管理。
通过什么呢?

没错,通过接口 Condition
这个接口中什么都没有,只有一个 matches 方法,返回一个 boolean 值。
显而易见,你返回 true, 开关打开,返回 false,开关关闭。
MyCondition 类代码如下:
  1.     public class MyCondition implements Condition {
  2.         @Override
  3.         public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  4.             return true;
  5.         }
  6.     }
复制代码
可以看到 matches 方法中的两个参数,可以简单介绍一下。
ConditionContext context 这个参数提供了一种方法来访问关于Spring容器的信息。
AnnotatedTypeMetadata metadata 这个参数提供了对被注解类的元数据的访问。
基于这两个参数我们就可以创建复杂和动态的条件来控制开关的闭合
例如,你可以基于环境变量、定义的bean、类的存在等因素,来决定是否创建某个bean。

除了自定义 Condition,Springboot 还为我们扩展了一些常用的 Condition。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表