使用Springboot根据配置文件动态注入接口实现类

 更新时间:2021年08月14日 09:26:51   作者:iFence  
这篇文章主要介绍了使用Springboot根据配置文件动态注入接口实现类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Springboot根据配置文件动态注入接口实现类

需求

最近在做一个Springboot项目,需要面向不同需求的客户,但是为了方便管理分支,需要将不同客户的需求都写到同一套代码中,根据不同客户实例化对应的实现类。

实现

为了尽量不修改代码,少做不必要的逻辑判断,我们考虑为不同客户写不同的Service,然后根据配置参数实例化对应的Service。这样就遇到了需要根据配置文件实现不同类的需求。

针对这一需求大致有两种实现方式。但是针对我的需求,能用的只有第二种,但还是想将第一种一起总结一下。

两种方式都需要给定义接口,并针对不同客户对接口做不同实现。

接口类

public interface IAService {
 
    //获取客户名,所有客户都需要,但是需要针对不同客户做不同实现
    String getCustomName();
}

针对客户A和B对上面接口实现两个类

//注意要给Service命名
@Service("customA")
public class IAServiceShijiazhuangImpl implements IAService{
   //A客户的逻辑
    @Override
    public String getCustomName() {
        return "客户A";
    }
}
//注意要给Service命名
@Service("customB")
public class IAServiceLinyiImpl implements IAService{
 //客户B的逻辑
    @Override
    public String getCityName() {
        return "客户B";
    }
}

Service层写好以后,需要在Controller层做不同的实现。有两种方式

1.使用@Qualifier注解

在@Qualifier("customA")上标明要实现的类的Service填写的名字即可。但是这种方式有个弊端。Qualifier注解的参数必须是常量,无法填写配置文件的值,因此无法使用配置文件动态注入,只能动手改代码,基本是鸡肋般的存在。

@RestController
public class AController {
 
 
    //如果要给客户A部署,这里写客户A Service注解的名称,上面配置的是customA
    @Qualifier("customA")
    IAService iaService;
    
    //不同地区需要有不同的逻辑,下面service实例化的正好是不同地区的实例
    @GetMapping("/name")
    public String getCustomName() {
        return iaService.getCityName();
    }
}

2.使用@Resource注解

上面配置了两个不同客户Service注解的名称,我们可以使用Resource注解,通过配置文件的方式进行动态注入。通过配置文件进行灵活切换。

其实代码并没有多少改动,仅仅是换成了@Resource(name="${local.name}")而已,其中的local.name为从配置文件中要读取的变量对应的值。

@RestController
public class AController {
 
    //根据配置文件中配置的参数决定实例化哪个实现类,解决上面问题1
    @Resource(name="${local.name}")
    IAService iaService;
    
    //不同地区需要有不同的逻辑,下面service实例化的正好是不同地区的实例
    @GetMapping("/name")
    public String getCustomName() {
        return iaService.getCityName();
    }
}

SpringBoot同一接口多个实现类配置

SpringBoot项目中可能出现一个接口有多个实现类的情况,如果不进行配置,注入接口时编译器不知道要注入哪个实现类就会报错,因此需要进行配置。

以下进行举例:

接口如下:

public interface NoticeService {
    public String noticeUser(Long id);
}

两个实现类如下:

@Service
public class NoticeServiceImpl1 implements NoticeService {
 public String noticeUser(Long id){
  return noticeServe1(id);
 }
}
@Service
public class NoticeServiceImpl2 implements NoticeService {
 public String noticeUser(Long id){
  return noticeServe2(id);
 }
}

Controller如下:

@Controller
@RequestMapping("notice")
public class NoticeController{
 @Autowired
 NoticeService noticeService;
}

这样直接启动后就会报错,需要在添加@Qualifier注解:

@Controller
@RequestMapping("notice")
public class NoticeController{
 @Autowired
 @Qualifier("impl1")
 NoticeService noticeService;
}

需要调用的实现类中添加标识:

@Service("impl1")
public class NoticeServiceImpl1 implements NoticeService {
 public String noticeUser(Long id){
  return noticeServe1(id);
 }
}

此时再运行即可~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Http学习之组装报文

    Http学习之组装报文

    这篇文章主要介绍了Http学习之组装报文,组装报文就是指组装HTTP响应报文,你需要返回客户请求的相应资源,通常一个完整的报文包括报文头和报文体,一起来看看吧
    2023-04-04
  • sql于navicat中能运行在mybatis中不能运行的解决方案

    sql于navicat中能运行在mybatis中不能运行的解决方案

    这篇文章主要介绍了sql于navicat中能运行在mybatis中不能运行的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 浅谈Java中hashCode的正确求值方法

    浅谈Java中hashCode的正确求值方法

    这篇文章主要介绍了浅谈Java中hashCode的正确求值方法,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java文件(io)编程_基于File类的基本用法(必看篇)

    Java文件(io)编程_基于File类的基本用法(必看篇)

    下面小编就为大家带来一篇Java文件(io)编程_基于File类的基本用法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 初识Spring Boot框架和快速入门

    初识Spring Boot框架和快速入门

    这篇文章主要介绍了初识Spring Boot框架学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 举例讲解Java中的Stream流概念

    举例讲解Java中的Stream流概念

    这篇文章主要介绍了举例讲解Java中的Stream流概念,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • SpringBoot整合Security权限控制登录首页

    SpringBoot整合Security权限控制登录首页

    这篇文章主要为大家介绍了SpringBoot整合Security权限控制登录首页示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Mybatis-Plus通过配置在控制台打印执行日志的实现

    Mybatis-Plus通过配置在控制台打印执行日志的实现

    本文主要介绍了Mybatis-Plus通过配置在控制台打印执行日志的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Java中Exception和Error的区别详解

    Java中Exception和Error的区别详解

    在 Java 开发面试中,Exception 和 Error 的区别是一个经典问题,这个问题不仅考察我们对 Java 异常处理机制的理解,还考察我们在实际开发中如何处理异常的能力,所以本文主要给大家介绍一下Java中Exception和Error的区别,需要的朋友可以参考下
    2025-04-04
  • Java跳跃游戏实例真题解决思路详解

    Java跳跃游戏实例真题解决思路详解

    这篇文章主要介绍了Java跳跃游戏,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路
    2022-10-10

最新评论