Springboot - Condition接口

Condition接口是spring4之后提供给了的接口,增加条件判断功能,用于选择性的创建Bean对象到spring容器中

public class OnClassCondition implements Condition {
    /**
     * 返回true 则满足条件  返回false 则不满足条件
     *
     * @param context  上下文信息对象 可以获取环境的信息 和容器工程 和类加载器对象
     * @param metadata 注解的元数据 获取注解的属性信息
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        //1.获取当前的redis的类字节码对象
        try {
            //2.加载成功则说明存在 redis的依赖 返回true,
            Class.forName("redis.clients.jedis.Jedis");
            return true;
        } catch (ClassNotFoundException e) {
            // 如果加载不成功则redis依赖不存在 返回false
            e.printStackTrace();
            return false;
        }
    }
}

@Configuration
public class UserConfig {

    @Bean
   // conditinal 用于指定当某一个条件满足并返回true时则执行该方法创建bean交给spring容器
    @Conditional(value = OnClassCondition.class)
    public User user() {
        return new User();
    }
}

以下是几个常用的条件注解:

● @ConditionalOnClass: 当类路径下有指定的类时才会注册Bean或配置。

例如:

● @ConditionalOnMissingBean: 当容器中没有指定Bean时才会注册。

例如:

● @ConditionalOnProperty: 当指定的配置项被设置为true时才会注册。

例如:

以上是Spring Boot中常用的条件注解。通过条件注解,我们可以更加灵活地控制Bean的注册和配置,从而更好地适应不同的环境需求,大家多练练就熟能生巧了

@ConditionalOnProperty注释在类或者bean方法上进行控制这个bean对象是否被注册

它是否被注册,完成依赖于ConditionalOnProperty里的value的值,为true时,表示被注册,为false表示不注册这个bean。而我们通过matchIfMissing来配置这个value的缺省值,默认是false,即当你不配置时,它是不会自动装配的。

在组件中的使用

一 声明一个配置类

@ConfigurationProperties("kc-kafka")
@Data
public class KafkaProperties {
  /**
   * 是否开启kafka功能.
   */
  private Boolean enabled = true;
  /**
   * kafka生产者ack机制
   */
  private String acks = "1";

通过EnableConfigurationProperties开启配置类,而当前类是否被注册,依赖于kc-kafka.enabled的值,默认是装配这个bean

matchIfMissing=true表示默认在不配置kc-kafak时,它就会装配这个KafkaProviderConfig对象

@Configuration
@RequiredArgsConstructor
@ConditionalOnProperty(value = "kc-kafka.enabled", matchIfMissing = true)
@EnableConfigurationProperties(KafkaProperties.class)
public class KafkaProviderConfig {
  @Autowired
  KafkaProperties kafkaProperties;

  @Bean
  @ConditionalOnBean(DefaultKafkaProducerFactory.class)
  public KafkaTemplate<String, String> kafkaTemplate(DefaultKafkaProducerFactory<String, String> kafkaProducerFactory) {
    return new KafkaTemplate<>(kafkaProducerFactory, false);
  }
}

通过name和havingValue为控制bean的装配

上面的matchIfMissing只控制boolean类型的属性,如果你希望通过字符串属性来控制bean的装配,可以使用name和havingValue的组合。

@Configuration
@RequiredArgsConstructor
@ConditionalOnProperty(name= "kc-kafka.status", havingValue="1")
@EnableConfigurationProperties(KafkaProperties.class)

@ConditionalOnProperty和@ConditionalOnMissingBean一起使用的效果

  • MissingBean是一个接口,里面有个方法hello()
  • 有个默认的实现DefaultMissingBean,通过@ConditionalOnMissingBean进行声明,当没有其它MissingBean接口的bean时,会使用这个DefaultMissingBean
  • V1MissingBean是我们自定义的实现,它通过@ConditionalOnProperty来开启是否装配,如果它没有装备,spring就使用默认的DefaultMissingBean
  • test.v1.enabled在配置文件里,配置为true表示开启 V1MissingBean,配置为false,表示不开启它,而开启默认的DefaultMissingBean

实例代码

public interface MissingBean {

	void hello();

}
public class DefaultMissingBean implements MissingBean {

	@Override
	public void hello() {
		System.out.println("default MissingBean");
	}

}
@Configuration
public class MissingBeanConfig {

    /**
     * @ConditionalOnMissingBean当没有其它MissingBean的bean时,就使用DefaultMissingBean这个bean. @return
     */
    @Bean
    @ConditionalOnMissingBean(MissingBean.class)
    public MissingBean defaultMissingBean() {
        return new DefaultMissingBean();
    }

}
  • v1MissingBean对象
@Component
@ConditionalOnProperty(value="test.v1.enabled",matchIfMissing = true)
public class V1MissingBean implements MissingBean {

	@Override
	public void hello() {
		System.out.println("v1 MissingBean");
	}

}
  • 关闭v1的配置
test:
  v1:
    enabled: false
  • 测试用例
	@Autowired
	MissingBean missingBean;


	/**
	 * @ConditionalOnMissingBean.
	 */
	@Test
	public void onMissingBean() {
		missingBean.hello();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值