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

4973 次点击
所在节点    Java
50 条回复
24bit
2020-09-03 13:16:57 +08:00
不如直接用注解标注要缓存的方法,直接在 Map 里面存 Method,取的时候直接调用
Cyron
2020-09-03 13:19:33 +08:00
Service service = applicationContext.getBean("serviceImplA");
Service service = applicationContext.getBean("serviceImplB");
jintianfengda
2020-09-03 14:28:27 +08:00
用 map 这么玩开发一时爽,维护火葬场
ixx
2020-09-03 14:55:18 +08:00
liuguangcuican
2020-09-03 15:12:58 +08:00
定义一个 interface,在其每个实现类上使用 @Component("实现类的别名")。在 controller 里使用 @Autowrid 定义一个 Map<String,你定义的 interface>,在入口方法里使用 map.get("实现类的别名")就能获取到你对应的实现类。
d460686680
2020-09-03 15:24:21 +08:00
实现同一个接口 + getBean()
levizheng
2020-09-03 15:36:41 +08:00
简单工厂就可以解决了。。 放一 map 里
xuanbg
2020-09-03 16:16:29 +08:00
我司的 php 写的老系统就是这样,接口参数里面有个 action,1234567……分别对应一个方法。。。。各方法传入一个 object,其实就是一个 json,各个方法自己负责解析这个参数。楼主莫非要的是这个?

可是为啥不把接口拆开呢?
KevinBlandy
2020-09-03 16:26:15 +08:00
ApplicationContext.getBean();
ocean1477
2020-09-03 16:30:24 +08:00
策略模式了解下
caotian
2020-09-03 16:38:23 +08:00
不要手工维护 map, 不然每次加一个 serivce 还要修改这个 map
可以这样试试: 每个 service 定义自己的 key, 实现同一个接口 IService, 使用的时候通过 Autowired 注入拿到 List<IService>对象, 通过 key 来获得具体的 service 实例, 再调用方法
jiobanma
2020-09-03 16:40:36 +08:00
@wysnylc #5 业务需要
pierswu
2020-09-03 16:52:43 +08:00
这个用 mvc 的 forward 不就行了吗?

每一个 service 都有各自的 controller,就按照正常的写 ,然后总的 controller 根据不同的 key,forward 到不同的 controller
至于 key,最好能放在 url 中或者 header 中,好取一些
pierswu
2020-09-03 16:57:54 +08:00
用 forward 的话,每个 service 的参数类型,参数个数,返回值,都可以不一样的
pengfei
2020-09-03 17:31:53 +08:00
策略模式 ?
venpong
2020-09-03 18:05:50 +08:00
建议学学设计模式,比如楼上说的策略模式就可以很优雅的解决你这个问题。
oneisall8955
2020-09-03 18:24:36 +08:00
我最喜欢搞这些花里胡哨得了,经常写工厂模式+模板
securityCoding
2020-09-03 18:40:46 +08:00
applicationContext.getBean()

策略模式+泛型可解

不过在业务层做这种事情这种看起来很无脑....中间件还情有可原
BigBunny
2020-09-03 20:03:39 +08:00
做那种对外开放平台标准化接口有用过。当时的想法是 controller 里所有接口的请求参数返回参数都一样。加签验签逻辑也都一致。索性共用一个接口,调用 service 里的方法通过自定义注解去区分。半路转的 java,也不知道这么做了对不对好不好。
supermoonie
2020-09-03 20:12:26 +08:00
注解?

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

https://tanronggui.xyz/t/703791

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

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

© 2021 V2EX