为什么没有适用于python的Spring DI(组件生命周期)框架?



这个问题不关注DAO、MVC、Messaging和Spring所熟知的其他组件框架,而只关注核心。

据我所知,Spring早期的优势在于它管理组件生命周期,提供了一个Singleton Factory,它在启动时读取的配置文件中创建对象。

然后,单例工厂根据请求将所有服务bean创建为单例。这是Spring的一大优势,因为它使用的内存更少,JVM中的垃圾收集也少得多。另一方面,数据对象仍然是创建和销毁的,通常不是作为单例对象。

为什么依赖注入对python或其他语言没有这么大的优势?还是说它们被这样利用了?

Python有不同的相对操作成本。它不使用垃圾收集,而是使用引用计数,这意味着释放对象不像Java中那么昂贵。在我看来,仅仅为了加速而使用单例并不是很好的设计,因为它使系统的不同部分之间产生了更多的相互依赖。

另一方面,依赖注入的设计优势(更清晰的代码,更好的封装)也适用于Python,并且存在这样的框架:Python依赖注入框架

嗯,我从来没有觉得有必要在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代码轻松实现。

根据我的经验有几点。我相信更多的人可以指出其他原因。

最新更新