V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
leyle
V2EX  ›  程序员

初学 jvm 语言,依赖注入 和 一个实例变量传递给另外的对象 有什么区别?

  •  
  •   leyle · 2018-10-09 16:25:00 +08:00 · 2865 次点击
    这是一个创建于 2270 天前的主题,其中的信息可能已经有所发展或是发生改变。
    搜索了一圈,基本都在说如何实现依赖注入,看来看去都是把一个实例变量传递给另外一个对象。
    以前从没接触过 jvm 类的语言,对 jvm 的很多概念都感觉头大。

    这个依赖注入和传递实例变量给另外一个对象,有什么具体的区别?
    21 条回复    2018-10-10 22:36:03 +08:00
    p2pCoder
        1
    p2pCoder  
       2018-10-09 16:39:51 +08:00
    容器与解耦
    jimrok
        2
    jimrok  
       2018-10-09 17:32:31 +08:00
    如果能实现依赖注入,相当于没有写死一个实现。这样,测试时候可以用个假对象来模拟接口进行测试。生产时候,再替换一个实现。
    xiaoshenke
        3
    xiaoshenke  
       2018-10-09 17:33:49 +08:00
    没有区别
    skypyb
        4
    skypyb  
       2018-10-09 17:35:36 +08:00
    可以说是一个极致的解耦了,你的使用方和实体之间没有任何交互,其创建与销毁都归于第三方。
    jinhan13789991
        5
    jinhan13789991  
       2018-10-09 17:53:17 +08:00 via Android
    依赖注入就是 set 啊
    111qqz
        6
    111qqz  
       2018-10-09 19:41:05 +08:00
    2 个小时刚了解到这个概念的菜鸡觉得,好像没什么区别?
    lockelee
        7
    lockelee  
       2018-10-09 20:00:14 +08:00   ❤️ 1
    找一个相对复杂系统,你不用依赖注入框架,自己维护一下对象关系改造试一试。
    然后你就知道为什么要依赖注入了。
    很多工程问题已经被框架解决了,但是新人学习的时候其实都没有碰到过这些问题,所以就可能会不太能感知为什么要这么做吧。
    STRRL
        8
    STRRL  
       2018-10-09 20:06:17 +08:00 via Android
    可以这么理解:注入就是在你需要的时候“自动” set 进去。。
    lhx2008
        9
    lhx2008  
       2018-10-09 20:06:37 +08:00 via Android   ❤️ 1
    spring 本质上就是一个保存对象单例的 map,根据不同条件取出来。
    就好像,原始社会需要以物易物,地要自己种。现在是直接去市场买,就这么简单
    zn
        10
    zn  
       2018-10-09 20:07:59 +08:00 via iPhone
    你说的情况没区别,实际上都是属于依赖注入的范畴。

    依赖注入的核心思想是:如果需要用到其他类的对象实例,不在自己类里面 new 其他类的对象实例,而是通过其他方法传对象实例进去。

    所以你的做法实际上就是属于依赖注入。



    另外,我想,你实际上想问的是依赖注入对象与自己 new 对象有什么区别吧?
    lhx2008
        11
    lhx2008  
       2018-10-09 20:08:13 +08:00 via Android
    还有这并不是 jvm 的锅,其他语言也很常见
    carlclone
        12
    carlclone  
       2018-10-09 20:19:59 +08:00
    传递进去的类型判断是一个接口,而不是具体的类 , 这样就能看出区别了
    可以自由更换接口实现,不需要去修改代码
    扩展性上的考量
    Cbdy
        13
    Cbdy  
       2018-10-09 20:22:09 +08:00 via Android
    依赖注入的实质是代码生成,生成样板代码
    ixiaohei
        14
    ixiaohei  
       2018-10-09 20:29:01 +08:00
    解耦;软件工程里面的概念。方便软件后续维护;这个工程做多了,做大了就会越来越有感觉..
    earendil1412
        15
    earendil1412  
       2018-10-09 20:31:25 +08:00 via Android
    依赖注入不只是 JVM 的东西,而是面向对象的东西。
    为什么只在 JVM 上见到依赖注入?因为别的语言 IOC 容器太差劲了
    wenzhoou
        16
    wenzhoou  
       2018-10-09 20:54:06 +08:00 via Android
    我不认同解耦的说法。我认同 @zn 的说法。 我认为它就是替代在方法调用的时候不要去 new。因为开销很大。
    popbones
        17
    popbones  
       2018-10-10 08:14:46 +08:00
    我理解变量传递是依赖注入的一种形式。根据维基百科的解释,依赖注入的核心理念在于“客户”对象获得一个“服务”对象,而不是由”客户“对象去发现或者构建”服务“对象。这里的”客户“和”服务“对象只是个相对的抽象概念,用来表述”客户“对象需要使用 /依赖于”服务“对象提供的”服务“。

    而究竟如何将”服务“对象提供给”客户“对象,可以有很多不同的形式,比如在”客户“对象的构造函数传入,或通过成员变量、属性、Setter、Interface 或者 delegate 来实现都是可以的。重点是”客户“对象不需要知道如何构建”服务“对象。
    fox0001
        18
    fox0001  
       2018-10-10 08:19:19 +08:00 via Android
    自动与手动的区别…
    yinaqu
        19
    yinaqu  
       2018-10-10 11:12:32 +08:00
    @wenzhoou 解耦是一个方面,控制反转( IOC )就是不要让用户代码自己去注入依赖。你说的替代 new 的说法不对,不用容器也不一定需要每次都 new,工厂+单例不就行了;况且容器也可以每次都 new ( prototype 模式),只不过大多数情况下我们都用容器的 singleton 模式而已
    jimrok
        20
    jimrok  
       2018-10-10 11:48:53 +08:00
    @wenzhoou
    @yinaqu 很同意你的说法,就是不要自己去管理依赖的对象,而是让容器去管理,这样容器可以在运行时给你把手枪换成火炮。如果你自己 new 一个手枪,你就永远依赖这个手枪。不过要注意,不要什么代码都弄成 IOC 管理,非常难理解,因为不知道运行期被注入的是什么对象。尽量模块化依赖,模块内部不要再搞 IOC。
    SoloCompany
        21
    SoloCompany  
       2018-10-10 22:36:03 +08:00
    和 jvm 没什么关系

    依赖注入本质上就是一种解耦
    生产(工厂)
    消费(业务)
    控制(框架)

    如果不使用依赖注入,就是生产和消费是混在一起的,消费直接对生产依赖
    解耦后,消除了消费对生产的直接依赖,提高了可重用性
    但一般不是为了业务逻辑重用,而是更容易实现和测试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1254 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:57 · PVG 01:57 · LAX 09:57 · JFK 12:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.