【SpringBoot】很好用的一组 Condition —— AllNestedConditions AnyNestedCondition NoneNestedConditions

【SpringBoot】很好用的一组 Condition —— AllNestedConditions AnyNestedCondition NoneNestedConditions

前言

SpringBoot@Conditional 注解的拓展是十分漂亮的,也是 SpringBootAPI 设计 的代表作,本文介绍几个很好用的 Condition 拓展类,在这之前如果想要了解一下 Conditon 相关,可以阅读下文

【源码】Spring —— Condition 条件匹配解读

【源码】SpringBoot 对 Condition 的拓展 —— @ConditionalOnXxx系列注解

关于什么叫做 SpringBoot 式 API 设计,这是我个人的理解:

Spring 式 API,java API 设计的天花板,简单、优雅,最重要的是拥有
无限的生命力(易拓展,不然也不会有 SpringBoot 了),“简单” 是指逻辑的
实现相对简单(设计可一点都不简单)而且代码伴随着大量的注释,因此想潜心看
还是有可能看懂的

SpringBoot 式 API,同样是 java API 设计的天花板,但是逻辑实现是
真的复杂,且伴随着 天马行空 的想象力,编码风格逐渐向 函数式编程 靠
拢,且因为代码注解相对 Spring 少的多了,因此我认为逻辑能力如果不够强
且没有足够的时间,真的看不懂一些 API 的实现逻辑

不废话,直接上干货

AllNestedConditions

AllNestedConditions, 该类本身就是一个 Condition,因此可以直接作为条件注解 @Conditonalvalue,但是它可以包含一组 Condition,且当前目标类要 match 这些所有 Conditon,才会被注册进去

如果不好理解,直接看示例

@Configuration
public class ConditionConfig {

    @Bean
    @Conditional(BorCCondition.class)
    public BorC borC() {

        return new BorC();
    }

    static class BorCCondition extends AllNestedConditions {

        public BorCCondition() {
            super(ConfigurationPhase.REGISTER_BEAN);
        }

        @ConditionalOnBean(B.class)
        class BCondition {

        }

        @ConditionalOnBean(C.class)
        class CCondition {

        }
    }

    @Configuration
    static class Config {

        @Bean
        public B b() {

            return new B();
        }
    }
}

示例中的 BorCCondition 包含了一组 Conditon,其中 BCondition 是容器中要有 Bbean实例CConditon 亦然,同时 BorCCondition 是一个 AllNestedConditions,因此只有当 BConditionCConditon 全都 match 时,BorCbean实例 才会被注册到容器中

至于为什么命名 BorCCondition 是因为我一开始写的 demo 是 AnyNestedCondition

如上示例中,BorCbean实例 不会被注册,可以自己动手试试

AnyNestedCondition

这就不难理解了,只要 match 其中任意 Condition,目标实例就会被注册

NoneNestedConditions

只有不 match 所有 Conditon,目标实例才会被注册

总结

关于它们的实现逻辑其实可以自己想象一下,我并不打算深究 SpringBoot 的实现,原因见前言

这几种 ConditionSpringBoot 的装配类中十分常见,我就是在 LoadBalance 的装配类中开始感兴趣的,我们在日常开发的场景也难免会遇到这种需要组合条件匹配的 bean实例

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值