前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >优雅解决service有多个实现类,要使用哪个【这方法也太好用了叭!】

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

作者头像
黑洞代码
发布2021-01-14 15:18:52
1K0
发布2021-01-14 15:18:52
举报

前言:

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

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

方法一:

  由于“榴莲”和“苹果”都在这个实现类里,方法名相同,所以只能把一方先注掉。

  这个方法最烂也最不友好,小编是由于忙于开发,就先这样跳过去了做其他的了,大家不要学我(´•༝•`)

优点:只是实现需求,无任何优点可言,无任何美感可言

缺点:每次都得手动改代码,想吃“榴莲”,得把“苹果”注释掉,反之。

方法二:

  在方法一的基础上,把水果的service实现类拆分为两个,一个是“榴莲”实现类,一个是“苹果”实现类。

  在Controller中 注入service,通过注解 @Autowire + @Qualifier实现,具体代码如下:

Controller

代码语言:javascript
复制
    @Autowired
    @Qualifier("durian")
    private FruitService fruitService;

Service

代码语言:javascript
复制
/**
 * Created by git on 2020/4/21.
 *
 * @author Emelia
 */
public interface FruitService {

    String getFruit();

}

“榴莲”实现类

代码语言:javascript
复制
/**
 * 榴莲
 *
 * @author Emelia
 */
@Service("durian")
@Slf4j
public class durianServiceImpl implements FruitService {

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

“苹果”实现类

代码语言:javascript
复制
/**
 * 苹果
 *
 * @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

代码语言:javascript
复制
    @Resource("durian")
    private FruitService fruitService;

Service

代码语言:javascript
复制
/**
 * Created by git on 2020/4/21.
 *
 * @author Emelia
 */
public interface FruitService {

    String getFruit();

}

  “榴莲”实现类

代码语言:javascript
复制
/**
 * 榴莲
 *
 * @author Emelia
 */
@Service("durian")
@Slf4j
public class durianServiceImpl implements FruitService {

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

  “苹果”实现类

代码语言:javascript
复制
/**
 * 苹果
 *
 * @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

代码语言:javascript
复制
fruit:
  impl: apple

  Controller

代码语言:javascript
复制
    @Autowired
    private FruitService fruitService;

  Service

代码语言:javascript
复制
/**
 * Created by git on 2020/4/21.
 *
 * @author Emelia
 */
public interface FruitService {

    String getFruit();

}

  “榴莲”实现类

代码语言:javascript
复制
/**
 * 榴莲
 *
 * @author Emelia
 */
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "fruit", name = "impl", havingValue = "durian")
public class durianServiceImpl implements FruitService {

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

  “苹果”实现类

代码语言:javascript
复制
/**
 * 苹果
 *
 * @author Emelia
 */
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "fruit", name = "impl", havingValue = "apple")
public class appleServiceImpl implements FruitService {

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

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

缺点:好用,暂时没发现缺点

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档