自定义SpringBootCondition

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: 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/

发表评论