V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
depress
V2EX  ›  Java

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

  •  1
     
  •   depress · 2015-12-01 10:09:35 +08:00 · 8967 次点击
    这是一个创建于 3273 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前是把一些公共的业务方法放在一个公共 Service 里了,譬如某些查询等,然后其他业务 Service 调用这个公共 Service 的方法,但是调用的话,除了调用前获取一下上下文还有什么好的办法吗,获取上下文的速度好慢。
    19 条回复    2015-12-15 09:10:40 +08:00
    saximoer
        1
    saximoer  
       2015-12-01 10:22:01 +08:00
    IOC 啊
    直接注入这个 SERVICE 对象?
    depress
        2
    depress  
    OP
       2015-12-01 10:51:26 +08:00
    @saximoer 包下所有都注入了,调用的时候还是提示空指针,目前是用了获取 ApplicationContext 的方法才能获取到,按道理注入后应该是可以直接调用啊,为什么我调用就找不到那个 bean...
    zts1993
        3
    zts1993  
       2015-12-01 11:00:21 +08:00
    。。。。调用者本身也得是 Spring 构造出来的。
    br00k
        4
    br00k  
       2015-12-01 11:17:09 +08:00
    直接注入就可以了吧。楼主应该找下为啥没有注入成功。
    id4alex
        5
    id4alex  
       2015-12-01 11:56:11 +08:00
    spring 只能注入 spring 容器里面的对象。。。
    zonghua
        6
    zonghua  
       2015-12-01 12:06:27 +08:00 via iPhone
    Spring 是神一般的框架,现在写软件就像积木一样组装。
    caixiexin
        7
    caixiexin  
       2015-12-01 12:10:52 +08:00 via Android
    直接注入,除非你们团队不让同级 service 互相调用
    Infernalzero
        8
    Infernalzero  
       2015-12-01 12:22:59 +08:00
    你这个公共的 service 没注入吧?如果也加了 @Component 或者 @Service 的话是可以直接 autowire 的,既然你能从 ApplicationContext 里获取到那我猜应该是该类没加需要扫描的注解了,要么就是扫描的配置有问题
    qinxi
        9
    qinxi  
       2015-12-01 13:20:21 +08:00
    你需要 dubbo 公共方法暴露接口供其他服务调用!
    gangsta
        10
    gangsta  
       2015-12-01 13:39:23 +08:00
    这不就是 ZooKeeper / dubbo 的应用场景么?
    li24361
        11
    li24361  
       2015-12-01 15:37:08 +08:00
    @gangsta
    @qinxi
    他说的是传统的 controller service dao 那里的 service 吧
    不是那种服务
    depress
        12
    depress  
    OP
       2015-12-01 15:39:27 +08:00
    @saximoer @zts1993 @br00k @id4alex @caixiexin @Infernalzero @qinxi @zonghua @gangsta
    谢谢各位,注入搞定了,目前有个新问题,如果我想把 service 当成静态变量用,譬如:
    @Autowired
    private static XxxService xxxservice
    这样是不是无法依赖注入?我这样用又报空指针了。
    wzdxt
        13
    wzdxt  
       2015-12-01 16:09:32 +08:00
    是的,你不应该用静态。
    如果你只是想每次都用同一个对象,避免反复创建对象,只需要在类上添加注解 @Scope("singleton")就行了。
    你可以打印对象的 id 测试每次使用的是否是同一个
    Infernalzero
        14
    Infernalzero  
       2015-12-01 16:45:41 +08:00
    @depress
    为何要改成静态的,难道你是打算在 main 函数里调用?
    raysmond
        15
    raysmond  
       2015-12-01 16:49:23 +08:00
    DI 机制可是 Spring 的灵魂之一,当然是注入了
    qinxi
        16
    qinxi  
       2015-12-01 17:01:07 +08:00
    @depress 为什么要非用静态变量? 难道你觉得每个类里面写上 resource/inject 麻烦吗?
    caixiexin
        17
    caixiexin  
       2015-12-01 17:33:45 +08:00 via Android
    静态是单例, spring 注入也可以是单例,为什么要静态呢
    fwrq41251
        18
    fwrq41251  
       2015-12-01 17:40:27 +08:00
    @depress
    可以当成静态的成员来用的,但是你需要一个辅助的 Bean 来做这件事情,在那个 Bean 里注入你需要的 service ,再把这个 service 赋值给你的静态成员
    depress
        19
    depress  
    OP
       2015-12-15 09:10:40 +08:00
    @wzdxt @Infernalzero @qinxi @caixiexin @fwrq41251
    再次谢谢各位,因为公共类是供大家使用的,所以变量和方法都定义成静态的了,这样可以注入后直接用,单例确实是没有明确要求的话很少用,另外因为公共类也用到了业务 service 的一些方法,所以依赖了一些业务的 service ,比如有个查询在某个业务 service 里,而公共类先调用查询方法,然后验证查询结果之类的...不过后来想了想这样互相依赖比较乱,所以改了个设计,目前是没有这问题了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1014 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:55 · PVG 03:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.