优雅解决service有多个实现类,要使用哪个【这方法也太好用了叭!】

Hi,大家好,我是一个爱冒泡的程序猿
有事情耽搁的好几天没更新了,每日一更计划又泡汤了(灬ꈍ ꈍ灬)

小编今天最近遇到的一个问题就是,有一个水果的Service,它的实现类中,同样方法名的有两个,一个是“榴莲”,一个是“苹果”(万一榴莲坏了,还有苹果吃٩(๑❛ᴗ❛๑)۶),如何优雅的决定它的出现。

有几个解决方法,顺序:从差到优~

方法一:

由于“榴莲”和“苹果”都在这个实现类里,方法名相同,所以只能把一方先注掉
这个方法最烂也最不友好,小编是由于忙于开发,就先这样跳过去了做其他的了,大家不要学我(´•༝•`)

优点:只是实现需求,无任何优点可言,无任何美感可言
缺点:每次都得手动改代码,想吃“榴莲”,得把“苹果”注释掉,反之

方法二:

在方法一的基础上,把水果的service实现类拆分为两个,一个是“榴莲”实现类,一个是“苹果”实现类
在Controller中 注入service,通过注解 @Autowire + @Qualifier实现,具体代码如下:

Controller

    @Autowired
    @Qualifier("durian")
    private FruitService fruitService;

Service

/**
 * Created by git on 2020/4/21.
 *
 * @author Emelia
 */
public interface FruitService {

    String getFruit();

}

“榴莲”实现类

/**
 * 榴莲
 *
 * @author Emelia
 */
@Service("durian")
@Slf4j
public class durianServiceImpl implements FruitService {

    @Override
    public String getFruit() {
        String fruit = "榴莲";
        return fruit;
    }
}

“苹果”实现类

/**
 * 苹果
 *
 * @author Emelia
 */
@Service("apple")
@Slf4j
public class appleServiceImpl implements FruitService {

    @Override
    public String getFruit() {
        String fruit = "苹果";
        return fruit;
    }
}

优点:在controller中修改@Qualifier的值就可以变化
缺点:还是得手动修改代码内容,一个Controller调用还好,如果有多个Controller调用就都得相应的更改

方法三:

和方法二差不多,只不过在Controller注入的时候使用注解@Resource 替换了 @Autowire + @Qualifier实现,具体代码如下:

Controller

    @Resource("durian")
    private FruitService fruitService;

Service

/**
 * Created by git on 2020/4/21.
 *
 * @author Emelia
 */
public interface FruitService {

    String getFruit();

}

“榴莲”实现类

/**
 * 榴莲
 *
 * @author Emelia
 */
@Service("durian")
@Slf4j
public class durianServiceImpl implements FruitService {

    @Override
    public String getFruit() {
        String fruit = "榴莲";
        return fruit;
    }
}

“苹果”实现类

/**
 * 苹果
 *
 * @author Emelia
 */
@Service("apple")
@Slf4j
public class appleServiceImpl implements FruitService {

    @Override
    public String getFruit() {
        String fruit = "苹果";
        return fruit;
    }
}

优点:在controller中修改@Resource 的值就可以变化
缺点:还是得手动修改代码内容,一个Controller调用还好,如果有多个Controller调用就都得相应的更改

方法四:

通过配置文件动态配置,实现类中只需要用 @Configuration+@ConditionalOnProperty
不需要@Service ,这两个注解也可以注入Service,具体代码如下:

application.yml

fruit:
  impl: apple

Controller

    @Autowired
    private FruitService fruitService;

Service

/**
 * Created by git on 2020/4/21.
 *
 * @author Emelia
 */
public interface FruitService {

    String getFruit();

}

“榴莲”实现类

/**
 * 榴莲
 *
 * @author Emelia
 */
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "fruit", name = "impl", havingValue = "durian")
public class durianServiceImpl implements FruitService {

    @Override
    public String getFruit() {
        String fruit = "榴莲";
        return fruit;
    }
}

“苹果”实现类

/**
 * 苹果
 *
 * @author Emelia
 */
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "fruit", name = "impl", havingValue = "apple")
public class appleServiceImpl implements FruitService {

    @Override
    public String getFruit() {
        String fruit = "苹果";
        return fruit;
    }
}

优点:只需要修改配置就可以决定使用哪个实现类,如此甚好,也不需要额外的配置文件,优雅的很
缺点:好用,暂时没发现缺点

参考文章:
https://blog.csdn.net/mengxiangxingdong/article/details/87919315

可能是我第一次使用这个注解,真香啊(•̀∀•́)棒
如果有更好的方式,欢迎大家前来踢馆~

掰掰~ 奔向阿里的第7天

在这里插入图片描述

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哩哩啦啦’

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值