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 下的方法。 有没有好的实现思路呢?

4990 次点击
所在节点    Java
50 条回复
chachae
2020-09-03 20:45:55 +08:00
策略模式
gaius
2020-09-04 01:23:30 +08:00
以前掉各种银行接口就是用反射,配置全限定名
1ffree
2020-09-04 09:56:48 +08:00
19l 正解 +1
HolmLoh
2020-09-04 10:26:26 +08:00
工厂模式加模板模式,小的单人开发的项目这么搞搞还行,偷偷懒还挺快乐,人多起来不好维护
yisheyuanzhang
2020-09-04 10:51:46 +08:00
想到两种方法
1 、8L 的方法,Service 实现同一接口,key 作为 bean 的名称,用 applicationcontext.getbean 去调。缺点是每个 service 只能实现同一个方法。
2 、定义 service 的类注解和方法注解, 启动时通过 BeanPostProcessor,根据类注解的 key 存入 Map<key,bean>中。调用时根据类注解 key,找到 bean,根据方法注解 key 找到方法,通过反射执行

我们生产中用过第二种
CoderGeek
2020-09-04 13:54:15 +08:00
简单点
1. <String,String> key 是你的策略 value 是你的 beanName 直接 get 就好
2. <String,Class> key 是你的策略 value 是你的所有加载的 service 取出来强制转型
3.直接用 xml 更简单创建一个 map 对象 value 是多个 bean
举个常见栗子
private Map<Object, Object> targetDataSources;
<bean id="xxx" class="xxxxx">
<property name="targetDataSources">
<map>
<entry key="xxxxx" value-ref="xxxxx"></entry>
</map>
</property>
</bean>
6IbA2bj5ip3tK49j
2020-09-04 13:56:27 +08:00
别听楼上 BB 。
把那些 service 合成一个函数方法就 ok 了。
一个函数就解决所有问题了,高内聚。
传来 map,返回 map,改动也只需要改这一个函数,低耦合。
xiaoxinshiwo
2020-09-04 15:38:59 +08:00
instance of
yazinnnn
2020-09-05 22:14:12 +08:00
```kotlin
@RestController
class ControllerA(
var serviceA: ServiceA,
var serviceB: ServiceB
) {

@RequestMapping("/")
fun foo(type: String, param: String) = serviceMap[type]!!(param)


private val funcA = { it: String -> serviceA.foo(it) }
private val funcB = { it: String -> serviceB.foo(it) }


private val serviceMap by lazy {
mutableMapOf(
"a" to funcA,
"b" to funcB
)
}
}
```

kotlin 可以这么干,java 没有 by lazy,估计比较啰嗦
Relims
2020-09-07 17:34:35 +08:00
value 存 service 的实例化对象,通过对象来调用方法,如果你的 sevice 有共同的方法的化,还可以用到工厂模式

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

https://tanronggui.xyz/t/703791

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

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

© 2021 V2EX