Spring 中, Service 调用 Service 有什么好的方式吗?

2015-12-01 10:09:35 +08:00
 depress
目前是把一些公共的业务方法放在一个公共 Service 里了,譬如某些查询等,然后其他业务 Service 调用这个公共 Service 的方法,但是调用的话,除了调用前获取一下上下文还有什么好的办法吗,获取上下文的速度好慢。
8827 次点击
所在节点    Java
19 条回复
saximoer
2015-12-01 10:22:01 +08:00
IOC 啊
直接注入这个 SERVICE 对象?
depress
2015-12-01 10:51:26 +08:00
@saximoer 包下所有都注入了,调用的时候还是提示空指针,目前是用了获取 ApplicationContext 的方法才能获取到,按道理注入后应该是可以直接调用啊,为什么我调用就找不到那个 bean...
zts1993
2015-12-01 11:00:21 +08:00
。。。。调用者本身也得是 Spring 构造出来的。
br00k
2015-12-01 11:17:09 +08:00
直接注入就可以了吧。楼主应该找下为啥没有注入成功。
id4alex
2015-12-01 11:56:11 +08:00
spring 只能注入 spring 容器里面的对象。。。
zonghua
2015-12-01 12:06:27 +08:00
Spring 是神一般的框架,现在写软件就像积木一样组装。
caixiexin
2015-12-01 12:10:52 +08:00
直接注入,除非你们团队不让同级 service 互相调用
Infernalzero
2015-12-01 12:22:59 +08:00
你这个公共的 service 没注入吧?如果也加了 @Component 或者 @Service 的话是可以直接 autowire 的,既然你能从 ApplicationContext 里获取到那我猜应该是该类没加需要扫描的注解了,要么就是扫描的配置有问题
qinxi
2015-12-01 13:20:21 +08:00
你需要 dubbo 公共方法暴露接口供其他服务调用!
gangsta
2015-12-01 13:39:23 +08:00
这不就是 ZooKeeper / dubbo 的应用场景么?
li24361
2015-12-01 15:37:08 +08:00
@gangsta
@qinxi
他说的是传统的 controller service dao 那里的 service 吧
不是那种服务
depress
2015-12-01 15:39:27 +08:00
@saximoer @zts1993 @br00k @id4alex @caixiexin @Infernalzero @qinxi @zonghua @gangsta
谢谢各位,注入搞定了,目前有个新问题,如果我想把 service 当成静态变量用,譬如:
@Autowired
private static XxxService xxxservice
这样是不是无法依赖注入?我这样用又报空指针了。
wzdxt
2015-12-01 16:09:32 +08:00
是的,你不应该用静态。
如果你只是想每次都用同一个对象,避免反复创建对象,只需要在类上添加注解 @Scope("singleton")就行了。
你可以打印对象的 id 测试每次使用的是否是同一个
Infernalzero
2015-12-01 16:45:41 +08:00
@depress
为何要改成静态的,难道你是打算在 main 函数里调用?
raysmond
2015-12-01 16:49:23 +08:00
DI 机制可是 Spring 的灵魂之一,当然是注入了
qinxi
2015-12-01 17:01:07 +08:00
@depress 为什么要非用静态变量? 难道你觉得每个类里面写上 resource/inject 麻烦吗?
caixiexin
2015-12-01 17:33:45 +08:00
静态是单例, spring 注入也可以是单例,为什么要静态呢
fwrq41251
2015-12-01 17:40:27 +08:00
@depress
可以当成静态的成员来用的,但是你需要一个辅助的 Bean 来做这件事情,在那个 Bean 里注入你需要的 service ,再把这个 service 赋值给你的静态成员
depress
2015-12-15 09:10:40 +08:00
@wzdxt @Infernalzero @qinxi @caixiexin @fwrq41251
再次谢谢各位,因为公共类是供大家使用的,所以变量和方法都定义成静态的了,这样可以注入后直接用,单例确实是没有明确要求的话很少用,另外因为公共类也用到了业务 service 的一些方法,所以依赖了一些业务的 service ,比如有个查询在某个业务 service 里,而公共类先调用查询方法,然后验证查询结果之类的...不过后来想了想这样互相依赖比较乱,所以改了个设计,目前是没有这问题了。

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

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

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

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

© 2021 V2EX