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

问一个比较傻逼的问题。。。

  •  
  •   jy04149886 · 2015-02-11 14:44:07 +08:00 · 4626 次点击
    这是一个创建于 3607 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请问,在三层架构当中,上一层调用下一层的服务,使用注入模式比使用对象的方法调用,优势在哪呢??
    26 条回复    2015-04-03 14:44:17 +08:00
    raincious
        1
    raincious  
       2015-02-11 14:50:36 +08:00
    非Java小能手,可能立即的不对,但是你是不是在说这个?: http://stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code
    raincious
        2
    raincious  
       2015-02-11 14:51:16 +08:00
    - 立即
    + 理解
    jy04149886
        3
    jy04149886  
    OP
       2015-02-11 15:12:20 +08:00
    @raincious 太好了,谢谢
    tabris17
        4
    tabris17  
       2015-02-11 15:17:29 +08:00
    你在说IoC容器么?

    IoC容器获取对象,获取对象后才能“对象的方法调用”啊,两码事儿
    jy04149886
        5
    jy04149886  
    OP
       2015-02-11 15:21:33 +08:00
    @tabris17 直接new,不注入
    tabris17
        6
    tabris17  
       2015-02-11 15:31:02 +08:00
    @jy04149886 用IoC就是咱们不用知道对象到底怎么生成的,有些对象是new的,但是有些对象要用build或者factory模式生成。有些对象需要依赖别的服务或组件。而使用IoC容器可以让调用者无需关心这些细节。

    比如一个dbconnection对象,你直接new需要传递ip端口用户名密码,你要知道从哪里去读取这些信息,到底是配置文件还是全局变量或者是常量。而是用IoC就只要把这些信息写入配置文件就可以了
    jy04149886
        7
    jy04149886  
    OP
       2015-02-11 15:34:01 +08:00
    @tabris17 这个我知道,比如数据库连接对象通过注入取得是很方便的,但是一个action调用它的service对象通过依赖注入来实现,我感觉好烦琐,但是现在的java三层架构的开发都是这种模式的吧。。。。是不是对这个模式使用的有点不合适。。。
    tabris17
        8
    tabris17  
       2015-02-11 15:38:26 +08:00
    @jy04149886 你就姑且认为是一种DI的美学吧……
    tabris17
        9
    tabris17  
       2015-02-11 15:40:04 +08:00
    或者说“用new太low了”
    jy04149886
        10
    jy04149886  
    OP
       2015-02-11 15:44:46 +08:00
    @tabris17 好吧。。。
    hcymk2
        11
    hcymk2  
       2015-02-11 16:00:24 +08:00
    windyboy
        12
    windyboy  
       2015-02-11 16:01:31 +08:00
    注入的优势在于,你只告诉接口你想干什么,至于最后这个事情怎么干,谁来干,可以执行的时候才决定
    fangzhzh
        13
    fangzhzh  
       2015-02-11 16:04:38 +08:00 via Android
    注入方便测试
    jy04149886
        14
    jy04149886  
    OP
       2015-02-11 16:07:26 +08:00
    @windyboy 这机制确实很强大,不过超级大项目才体现优势吧。。。做个管理软件什么的,我看貌似没什么必要。。。
    jy04149886
        15
    jy04149886  
    OP
       2015-02-11 16:08:13 +08:00
    @fangzhzh 貌似现在都用注解来实现了,貌似没有xml那么强大?
    invite
        16
    invite  
       2015-02-11 16:13:03 +08:00
    何必纠结什么模式呢?怎么方便怎么来啊。
    raincious
        17
    raincious  
       2015-02-11 16:13:18 +08:00
    @jy04149886

    看你的项目到底要规范化到什么程度。

    一般来说通用的代码除非出于冗余性以及组建依赖的考虑,一般还是抽出来做成可复用的流程。使用IoC方法可以轻易地做到这一点,而且可以更加灵活的进行加载(比如你可以决定是否缓存某个对象的实例,来实现比如复用数据库连接的实例),代码量可以更少。

    反过来说如果你的代码里都是直接new出来,首先是维护不方便,如果这些被new的组件有更新导致调用方式改变(比如拆分了之类),那么可能需要改的地方就太多了,不便维护。而且代码一长,维护就相对更困难。

    代码总归还是给人看的。
    caixiexin
        18
    caixiexin  
       2015-02-11 16:13:36 +08:00 via Android
    解耦,模块化,当然可以不用,自己决定:)
    设计模式的问题也争论挺久了
    6IbA2bj5ip3tK49j
        19
    6IbA2bj5ip3tK49j  
       2015-02-11 17:11:09 +08:00
    团队作战,写好接口,各写各的。
    kedron
        20
    kedron  
       2015-02-11 17:51:51 +08:00
    @invite 怎么方便怎么来?垃圾代码就是这么出来的。
    kedron
        21
    kedron  
       2015-02-11 17:57:30 +08:00   ❤️ 1
    注入的出发点就是为了解耦。至于为什么要解耦,怎么实现解耦的,解耦是什么意思。楼主可以顺着这个思路继续学习。

    多说点,至于你现在做的东西要不要采用注入,还需要你自己学习之后结合实际情况,具体分析。很多架构、模式、框架不是说什么地方都要用。但是不用,是因为自己知道这个东西,分析之后决定不用。而不是因为自己啥也不懂,眼前怎么省事怎么来。
    kedron
        22
    kedron  
       2015-02-11 18:01:40 +08:00
    楼主这个问题一点都不傻逼,反而是有些回答……
    invite
        23
    invite  
       2015-02-12 12:46:34 +08:00
    @kedron 看来我们对"方便"一词的理解不一致啊,老去扯那些一套套的理论,反而自己绕进去了。
    rikeinei
        24
    rikeinei  
       2015-02-18 16:55:03 +08:00
    使用注入模式比使用对象的方法调用,有没有优势主要看面对的情况,直接New不见得坏,但是注入也不见得好。

    目前项目因为太庞大,平行开发修改频繁,用的注入,大家为了不影响别人开发都是先写接口...
    funky
        25
    funky  
       2015-02-23 14:13:38 +08:00
    老问题了。凡事在没有全面了解之前慎用。
    sunnysign
        26
    sunnysign  
       2015-04-03 14:44:17 +08:00
    我觉得python不错,用过之后就觉得java确实太麻烦,杂乱,不美好,不可爱,没有掌控感。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2269 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 01:01 · PVG 09:01 · LAX 17:01 · JFK 20:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.