springboot 中 controller 中通过一个 key 值动态调用 service

2020-09-03 11:03:22 +08:00
 jiobanma

想在服务启动的时候,将所有的 service 存放到一个缓存 Map 中,然后给定一个 key 值绑定。 在 controller 中通过 key 值找到对应的 service 对象该如何实现。 因为不同 service 的类型不一样,所以 Map 在定义的时候只能定义成 Map<String,Object>value 是个 Object, 这样的话通过 key 值取出来的也就是 Object 的类型,无法调用到 service 下的方法。 有没有好的实现思路呢?

4922 次点击
所在节点    Java
50 条回复
tsening
2020-09-03 11:16:12 +08:00
我累了,小白吧。。。
mosliu
2020-09-03 11:17:00 +08:00
反射呗
chendy
2020-09-03 11:17:41 +08:00
为啥要这么搞,别的不说,service 的参数和返回也不一样啊
jiobanma
2020-09-03 11:23:43 +08:00
@chendy #3 因为服务要做成动态的,service 里面只有一个通用接口,参数都是 Map 所以不存在返回值类型和参数不同的问题
wysnylc
2020-09-03 11:31:53 +08:00
@jiobanma #4 我只能说,作死
说了多少回参数和返回值不要用 map,不撞南墙不回头
pushback
2020-09-03 11:32:00 +08:00
method.invoke
pushback
2020-09-03 11:33:09 +08:00
存储 class 就行,对应 value 到 BeanFactory 下去取
idoggy
2020-09-03 11:35:01 +08:00
入参都一样吗?要调用的 service 全部继承同一个接口就行了,用 applicationcontext.getbean 去调。
ily433664
2020-09-03 11:40:21 +08:00
通过 applicationContext 获取,可以根据 bean 类型或者名称
YzSama
2020-09-03 11:42:44 +08:00
@idoggy #8 这个方式可取。 不过,入参和出参不建议使用 map 。
lipcao
2020-09-03 11:56:22 +08:00
哈哈,你这个标准的策略+工厂模式 解决 if else 啊,前一段时间公众号嗷嗷推这个。。。
zhuweiyou
2020-09-03 11:57:32 +08:00
建议楼主学 PHP 或 JS,他们就是这么玩的。
DelayNoMay
2020-09-03 12:00:08 +08:00
用 golang 的 interface
yuan7712
2020-09-03 12:03:11 +08:00
460881773
2020-09-03 12:04:35 +08:00
花里胡哨
aguesuka
2020-09-03 12:06:47 +08:00
service 都带个 controller,原来的 controller 里通过 key 转发到对应的 service 的 controller 。param bind 是 spring 的工作,不要实现一个低配版的
aguesuka
2020-09-03 12:10:16 +08:00
以前我还是个傻逼的时候,map 里面存的是个 lambda 函数,比如 map.put(key,xxxxService::doxxxxxxx)
huifer
2020-09-03 12:17:25 +08:00
添加一个 接口比如
```java
public interface KeyInterface{
String key();
}

```
- 所有 service 都实现这个接口,重写 key()

- 在启动阶段(ApplicationRunner 或者 CommandLineRunner)通过 context.getBeanOfTypes(KeyInterface.class) 获取到一个 map
key: beanName value: KeyInterface 的实现
- 调用 value 的 key()方法. 将结果映射成 key:key() ,value: service 即可
dutianze
2020-09-03 13:11:45 +08:00
如果所有 sevice 都是同样的接口的话,

1. 所有 service 都继承一个接口 CommonService

2.
@Autowired
private Map<String, CommonService> commonServiceMap;

k 默认是 service 的类名小写,v 默认是对应的 service
butterfly1211
2020-09-03 13:13:28 +08:00
服务注册与服务发现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/703791

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX