Springboot基础使用@Conditional多条件注册Bean

导读:本篇文章讲解 Springboot基础使用@Conditional多条件注册Bean,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

环境:springboot2.3.10


需求:有这么一个Bean它被注册的条件是需要满足多个条件下才能被注册。如下

pack:
  datasource:
    enabled: true
---
pack:
  cache:
	  enabled: true

只有在这两个属性都为true时才注册Bean。

方法1 @ConditionalOnExpression

注解说明:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnExpressionCondition.class)
public @interface ConditionalOnExpression {

  /**
   * The SpEL expression to evaluate. Expression should return {@code true} if the
   * condition passes or {@code false} if it fails.
   * @return the SpEL expression
   */
  String value() default "true";

}

表达式SpEL表达式 要么返回true,要么返回false。

使用内置的@ConditionalOnExpression表达式条件注解。

@Bean
@ConditionalOnExpression("${pack.datasource.enabled:true} and ${pack.cache.enabled:true}")
public Animal animal() {
  return new Animal() ;
}
pack:
  datasource:
    enabled: true
---    
pack:
  cache:
    enabled: false

只有这两个属性都配置为true时Animal Bean才会被注册。

方式2 AllNestedConditions & AnyNestedCondition

使用AllNestedConditions所有条件都满足的情况下才会注册Bean

public class DataSourceAllCondition extends AllNestedConditions {
	
  public DataSourceAllCondition() {
    super(ConfigurationPhase.REGISTER_BEAN) ;
  }
  public DataSourceAllCondition(ConfigurationPhase configurationPhase) {
    super(configurationPhase);
  }
  @ConditionalOnBean(UsersController.class)
  static class ExistClass {
  }
  @ConditionalOnProperty(prefix = "pack.datasource", name = "enabled", havingValue = "true", matchIfMissing = false)
  static class PropertyEnabled {
  }
  @ConditionalOnProperty(prefix = "pack.cache", name = "enabled", havingValue = "true", matchIfMissing = false)
  static class PropertyEnabled {
  }
}
@Bean
@Conditional(DataSourceAnyCondition.class)
public Animal animal() {
  return new Animal() ;
}

这里只有3个条件都满足了才会注册。当前上下文中存在UsersController Bean,pack.datasource.enabled=true, pack.cache.enabled=true 3个条件同时成立才会被注册。

AnyNestedCondition 只要有一个条件成立就会注册Bean。

public class DataSourceAnyCondition extends AnyNestedCondition {
	public DataSourceAnyCondition() {
		super(ConfigurationPhase.REGISTER_BEAN) ;
	}
	public DataSourceAnyCondition(ConfigurationPhase configurationPhase) {
		super(configurationPhase);
	}
	@ConditionalOnProperty(prefix = "pack.datasource", name = "enabled", havingValue = "true", matchIfMissing = false)
	static class PropertyEnabled {
	}
  @ConditionalOnProperty(prefix = "pack.cache", name = "enabled", havingValue = "true", matchIfMissing = false)
  static class PropertyEnabled {
  }
}

两个条件只要有一个成立即可。

完毕!!!

关注一波呗

Springboot基础使用@Conditional多条件注册BeanwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

Spring Cloud Sentinel 基础配置

Spring Cloud Sentinel 流控限流

Spring Cloud Sentinel 熔断降级

Spring Cloud Gateway应用详解1之谓词

Spring Cloud Nacos 开启权限验证

SpringCloud Nacos 整合feign

SpringCloud Alibaba 之 Nacos 服务

Spring Cloud Sentinel整合Feign

SpringCloud Nacos 服务提供者

SpringCloud Nacos 服务消费者

Springboot中Redis事务的使用及Lua脚本

spring data jpa 高级应用

Spring Boot Security防重登录及在线总数

SpringCloud Zookeeper配置中心详解

Spring MVC 异步请求方式

Spring Security记住我功能实现及源码分析

Spring Retry重试框架的应用

使用Spring Boot Admin实时监控你的系统

Springboot基础使用@Conditional多条件注册Bean

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80010.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!