这个问题不关注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代码轻松实现。
根据我的经验有几点。我相信更多的人可以指出其他原因。