使用Springboot根据配置文件动态注入接口实现类
作者:iFence 时间:2022-11-18 06:56:45
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);
}
}
此时再运行即可~
来源:https://blog.csdn.net/Vector97/article/details/116309598
标签:Springboot,注入接口,实现类
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android 文件数据存储实例详解
2023-07-28 17:08:03
利用Java8 Optional类优雅如何地解决空指针问题
2023-07-30 04:58:13
Android使用JobScheduler定期推送本地通知实例代码
2023-07-26 22:43:28
java中javaBean与Bean的深入理解
2021-11-27 13:19:11
5种Android数据存储方式汇总
2023-08-06 06:49:04
java调用openoffice将office系列文档转换为PDF的示例方法
2023-11-29 11:42:53
Java语言实现简单FTP软件 FTP协议分析(1)
2023-11-10 17:57:21
![](https://img.aspxhome.com/file/2023/7/59027_0s.jpg)
java IO流 之 输入流 InputString()的使用
2023-08-22 07:44:31
【Java IO流】字节流和字符流的实例讲解
2023-08-08 20:45:58
![](https://img.aspxhome.com/file/2023/4/58194_0s.png)
java 工厂模式的实例详解
2023-11-28 08:48:57
Spring Cloud如何使用Feign构造多参数的请求
2023-11-03 00:18:31
Mybatis RowBounds 限制查询条数的实现代码
2022-11-18 17:26:03
Java裁剪压缩PNG图片,透明背景色变黑的解决方案
2023-11-25 13:21:27
详解@ConfigurationProperties实现原理与实战
2023-11-24 05:19:26
![](https://img.aspxhome.com/file/2023/7/58997_0s.png)
Java对zip,rar,7z文件带密码解压实例详解
2023-11-29 05:08:32
![](https://img.aspxhome.com/file/2023/4/60674_0s.png)
实例解析JAVA中代码的加载顺序
2021-10-26 14:57:22
![](https://img.aspxhome.com/file/2023/8/61038_0s.png)
如何在Android中实现左右滑动的指引效果
2023-06-23 09:08:47
![](https://img.aspxhome.com/file/2023/8/82398_0s.png)
解决Map集合使用get方法返回null抛出空指针异常问题
2023-11-25 00:14:00
![](https://img.aspxhome.com/file/2023/8/59848_0s.png)
在spring中手写全局异常拦 截器
2023-11-09 01:25:42
Swift洗牌动画效果的实现方法
2023-06-21 14:01:56