java - 静态和动态语言中的依赖注入(inject)

标签 java python ruby spring dependency-injection

我知道 Java 依赖注入(inject)让生活变得更好。有很多注释处理器框架可以将 bean 映射到对象并方便地将它们注入(inject)到正确的位置。 但我从来没有听说过dependency injection例如,使用 Python 或 Ruby。这种语言有内置支持吗?还是他们不需要?为什么?

最佳答案

简而言之,在 Python 中,由于模块的状态特性和元编程的作用,依赖注入(inject)不如 Java 中那么重要。

在 Java 等语言中,类通常定义对象的蓝图,这些对象必须在运行时通过导入它们的任何内容进行实例化。当您导入一个类时,您只会获得该类的配方。

相反,在 Python 中导入模块可以做更多的事情。在导入期间,您实际上是在命名空间内运行模块的代码 - 这意味着该模块不仅可以构造模块本身引用的单例,而且甚至可以执行复杂的任务,例如在执行导入期间连接到数据库。当两个模块导入相同的引用模块时,第二个模块会继承 Python 首次导入时的模块评估概念,保留和更改第一个导入器可能所做的操作。此外,在 Python 和 Ruby 中扫描子模块比在 Java 中要轻松得多,与 Java 中相比,更多框架使用模块放置来指示函数(例如 Django 中的 models.py)(Java 通常倾向于注释)。

TLDR:Python(和 Ruby)中的模块和类是有状态的,而在 Java 中复制是痛苦的或不可能的,并且 import 语句的机制提供了依赖注入(inject)的大部分有趣部分(尽管不是 IoC)。它并不是不存在,只是没有必要。

另请参阅:Why is IoC / DI not common in Python?

关于java - 静态和动态语言中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33267018/

相关文章:

ruby - 转换集合

ruby - 有没有可以更改 google-talk 状态的 API?

java - 架构组件 : How does the ViewModelProvider know which constructor to call?

java - Android中从URL读取XML文件

python - 在opencv中调整图像大小

ruby - 有效地抓取一些符合条件的子集

java - log4j 文件追加器不工作

java - 为什么 Vert.x 为 http 服务器创建一个新的事件循环?

Python Vigenere 元组错误

python - 是否可以在 aws lambda 函数中安装 s3fs-fuse?