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

2018-10-09 16:25:00 +08:00
 leyle
搜索了一圈,基本都在说如何实现依赖注入,看来看去都是把一个实例变量传递给另外一个对象。
以前从没接触过 jvm 类的语言,对 jvm 的很多概念都感觉头大。

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

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

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



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

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

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

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

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

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

© 2021 V2EX