@Conditional注解使用

 

前言

       当一个接口有多个实现类时,启动spring容器根据条件来加载其中的某一个作为实现类,应该如何实现呢?

其实这种情况对于策略模式很有效,下面来看一下如何具体实现。

 

DEMO

 

1、定义一个接口

 

package com.example.springbootTest;
/**
 * @author txb
 * @DESCRIPTION
 * @create 2019/2/27
 */

public interface EncodingConvert {
  
}

 

2、定义2个实现类

 

    其一:

 

package com.example.springbootTest;
/**
 * @author txb
 * @DESCRIPTION
 * @create 2019/2/27
 */

public class GBKEncodingConvert implements EncodingConvert {

}

      

      其二:

   

package com.example.springbootTest;
/**
 * @author txb
 * @DESCRIPTION
 * @create 2019/2/27
 */

public class UTFEncodingConvert implements  EncodingConvert {
}

 

  

3、定义配置类

 

@SpringBootConfiguration
public class EncodingConfig {

    @Bean
    @Conditional(UTFCondition.class)
    public EncodingConvert createUTF(){
        return  new UTFEncodingConvert();
    }

    @Bean
    @Conditional({GBKCondition.class})
    public EncodingConvert createGBK(){
        return  new GBKEncodingConvert();
    }


}

4、定义Condition(返回true则加载)

 

    其一:

 

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class GBKCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        String encoding= System.getProperty("file.encoding");
        if(encoding!=null){
            return "gbk".equals(encoding.toLowerCase());
        }
        return false;
    }
}

     

     其二:

  

public class UTFCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        String encoding= System.getProperty("file.encoding");
        if(encoding!=null){
            return "utf".equals(encoding.toLowerCase());
        }
        return false;
    }
}

 

 

说明:

       配置类中添加了@Conditional的注解,说明在加载这个方法的时候,需要去判断相应的Condition(条件),如果返回true,则运行此方法。同样@Conditional也可以放在类上面,是同样的道理(则对其下所有方法都适用)。

 

      注意:@Conditional可以传递多个参数:@Conditional({UTFCondition.class, GBKCondition.class})

 

 

推荐一个公众号,免费领架构师学习资料,每周更新优质文章,能学到很多。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值