spring覆盖jar包中的实现

spring覆盖jar包中的实现

公众号

在这里插入图片描述
欢迎大家关注我的公众号,我会定期的给大家分享最前沿的技术、视频教程、黑科技以及开发中遇到的各类疑难杂症的解决方案。

场景描述

最近遇到一个场景,对同一个接口,可能会有多种不同的实现类,但是我们希望指定其中的一种进行实现。
现在我们有一个spring工程名称是xx-core,里面有以下的两段代码,我们的目标是,当别的工程引用我们的这个xx-core的时候,如果没有实现我们的【DynamicReportAuth】的接口,那么就采用默认的实现【DynamicReportAuthDefault 】,如果别的工程实现了【DynamicReportAuth】接口,则直接采用新的实现。
假定我们现在有一个接口DynamicReportAuth,代码如下:

public interface DynamicReportAuth  {

    /**
     * 功能描述: 获取当前登录的用户的信息
     *
     * @return
     */
    ReportUser getLoginInfo();
    
}

这时候我们需要一个默认的实现DynamicReportAuthImpl,代码如下:

@Component
public class DynamicReportAuthDefault implements DynamicReportAuth {
    @Override
    public ReportUser getLoginInfo() {
        ReportUser ru = new ReportUser();
        ru.setUserAccount("111");
        ru.setUserId("1");
        ru.setUserName("11");
        return ru;
    }
}

接着我们新建一个新的工程xx-new在这个工程中我们引入xx-core,这时候我们实现【DynamicReportAuth 】接口DynamicReportAuthImpl代码如下:

@Component
public class DynamicReportAuthImpl implements DynamicReportAuth {

    @Override
    public ReportUser getLoginInfo() {
        ReportUser ru = new ReportUser();
        ru.setUserAccount("222");
        ru.setUserId("2");
        ru.setUserName("22");
        return ru;
    }

}

大家会看到我们这两个工程都的两个实现都使用了@component注解注入了,这时候我们启动我们的工程,那么大家会看到如下错误的页面:
在这里插入图片描述

破局方案

这时候我们只需要一个注解就可以完美的破局了,那就是在DynamicReportAuthImpl 上加上@Primary,当我们加了这个注解以后,我们再次调试就会发现我们的代码这时候获取到的信息是222的信息【DynamicReportAuthImpl 】里面的信息,假定我们现在需要采用的是默认实现,那我们直接删除【DynamicReportAuthImpl 】这个类,这时候我们的程序调用的就是我们的默认实现里面的代码了。

发布了143 篇原创文章 · 获赞 80 · 访问量 114万+
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览