本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2016/09/17/custom-springboot-condition/
Spring Boot中一个很重要的特性就是自动配置,可以根据很多条件决定是否生成相应的bean或者其他操作。
大部分情况下自动配置的条件是ConditionalOnMissingBean,也就是没有这个bean,那就用这个自动配置配置一个。
有时候自动配置条件并不是那么直接,有时候还涉及到一些自己的逻辑,这个时候就可以自定义SpringBootCondition来处理复杂一些的情况。
继承SpringBootCondition并将自己的逻辑实现在getMatchOutcome方法中。
自定义的逻辑大部分有两种,第一种是自动配置针对一类情况,需要检测多个独立类的存在性,比如EmbeddedDatabaseCondition,就会自动检测所有可能的数据库驱动,包括H2,DERBY,HSQL
@Override public ConditionOutcome getMatchOutcome( ConditionContext context, AnnotatedTypeMetadata metadata ) { if ( anyMatches( context, metadata, this.pooledCondition ) ) { return(ConditionOutcome.noMatch( "supported DataSource class found" ) ); } EmbeddedDatabaseType type = EmbeddedDatabaseConnection .get( context.getClassLoader() ).getType(); if ( type == null ) { return(ConditionOutcome.noMatch( "no embedded database detected" ) ); } return(ConditionOutcome.match( "embedded database " + type + " detected" ) ); }
还有一种就是配置之间相互依赖,比如虽然提供了一个配置名为feature.enable,并且设置为true,但是相关的必要参数,比如feature.username没有提供,这种情况下自动配置并没有用处,不仅要不自动配置,还要提供有用的信息给用户,指出缺失的参数
@Override public ConditionOutcome getMatchOutcome( ConditionContext context, AnnotatedTypeMetadata annotatedTypeMetadata ) { if ( !isEnabled( context.getEnvironment() ) ) { return(ConditionOutcome.noMatch( "Spring Boot Client is disabled, because 'spring.boot.admin.client.enabled' is false." ) ); } if ( isUrlEmpty( context.getEnvironment() ) ) { return(ConditionOutcome.noMatch( "Spring Boot Client is disabled, because 'spring.boot.admin.url' is empty." ) ); } return(ConditionOutcome.match() ); }
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2016/09/17/custom-springboot-condition/