为啥没有适用于 python 的 Spring DI(组件生命周期)框架?
Posted
技术标签:
【中文标题】为啥没有适用于 python 的 Spring DI(组件生命周期)框架?【英文标题】:Why isn't there a Spring DI (component lifecycle) framework for python?为什么没有适用于 python 的 Spring DI(组件生命周期)框架? 【发布时间】:2011-11-19 23:02:01 【问题描述】:本题关注的不是DAO、MVC、Messaging等Spring闻名的组件框架,而是Core。
据我了解,Spring 早期的优势在于它管理组件生命周期,提供了一个单例工厂,该工厂在启动时读取的配置文件中创建对象。
然后,单例工厂根据请求将所有服务 bean 创建为单例。这是 Spring 的一大胜利,因为它使用更少的内存并且 JVM 中的垃圾收集更少。另一方面,数据对象仍然被创建和销毁,通常不是单例。
为什么依赖注入对 python 或其他语言没有这么大的优势?还是他们被这样使用?
【问题讨论】:
去看看这是否回应你的要求***.com/questions/2461702/… 有 spring python springpython.webfactional.com 这只是 DI 的想法,因为它在 java 领域并不是那么流行(无论是对还是错)。 zope 组件架构可以满足一些与 DI 相同的需求,然后再满足一些需求。与 spring python 相比,它更受欢迎,但也有一些人讨厌 zca。 【参考方案1】:嗯,我从来没有觉得有必要在 Python 中使用这样的东西——而且我认识的大多数 Python 程序员也没有寻找这样的东西。我的印象是 Python 对象总体上是轻量级的,与其为了优化而使用单例对象,不如创建大量对象并避免可变对象的固有问题。
无论如何,如果真的想要某种单例,通常的方法是在模块中创建一个值:
# Module stuff.py
class Stuff(object):
# ....
pass
singleton = new Stuff()
那你就用它吧:
import stuff
stuff.singleton.do_something()
您甚至可以替换模块中的值,就像交换 Spring 的 applicationContext.xml
文件一样。它在测试中很有用,例如:
import stuff
stuff.singleton = MockedStuff()
class MyTestCase(TestCase):
def testMockStuff(self):
# Component can be a class which uses the singleton
component = Component()
# Proceed with tests
其实,你甚至可以模拟整个班级:
import stuff
stuff.Stuff = MockedStuff
class MyTestCase(TestCase):
def testMockStuff(self):
# Component creates some instance of stuff.Stuff, which is mocked now
component = Component()
# Proceed with tests
总结:恕我直言,Python 程序员并不觉得 Spring DI 之类的东西的必要性。如果需要 Spring DI 的一些功能,通过纯 Python 代码很容易实现。
(根据我的经验有几点。我相信更多的人可以指出另一个原因。)
【讨论】:
【参考方案2】:Python 有不同的相对操作成本。它使用引用计数代替垃圾回收,这意味着释放对象不像在 Java 中那样昂贵。在我看来,仅仅为了加速而使用单例并不是很好的设计,因为它会使系统的不同部分之间产生更多的相互依赖关系。
另一方面,依赖注入的设计优势(更清晰的代码,更好的封装)也适用于 Python,并且存在这样的框架: Python Dependency Injection Framework
【讨论】:
以上是关于为啥没有适用于 python 的 Spring DI(组件生命周期)框架?的主要内容,如果未能解决你的问题,请参考以下文章
为啥没有适用于所有浏览器的通用 HTML5 视频编解码器标准?
为啥图形布局(适用于 android)不出现在 Eclipse 中?
为啥空声明适用于带有 int 参数的定义,但不适用于 float 参数?
iOS 8:为啥 NSLayoutAttributeCenterX 无法将我的视图居中? (适用于 iOS 7)