【发布时间】:2013-07-17 03:45:48
【问题描述】:
我想更好地了解 IoC 容器的工作原理并编写一些代码供自己使用。为容器创建类时是否有最佳实践?是单例吗?是静态的吗?它不是单例,而是只有一堆静态属性来保存已解析的对象吗?
【问题讨论】:
标签: java oop inversion-of-control
我想更好地了解 IoC 容器的工作原理并编写一些代码供自己使用。为容器创建类时是否有最佳实践?是单例吗?是静态的吗?它不是单例,而是只有一堆静态属性来保存已解析的对象吗?
【问题讨论】:
标签: java oop inversion-of-control
我所知道的 IoC 容器既不是静态的也不是单例的,我看不出有什么好的理由来制作它们。只需将其设为普通类并创建它的实例即可。在某些情况下,您可能希望使用多个实例来分离独立的关注点。
由于您想让组件与容器无关,即不要让它们引用容器。如果您的组件(由容器解析的对象)需要能够访问容器以获取新实例,您通常会为此抽象一个接口(通常称为Service Locator Pattern(.NET,但仅此而已)同样)),并让容器将自己注入到组件中。同样,没有理由使用静态类或方法。
遵循这种做法的一个很好的理由是,您可以交换容器实现,例如切换到“专业”IoC 框架,而根本无需接触您的组件。
除此之外,通常对静态类和方法有许多限制,这是您通常不希望的,尤其是当您的系统可能发生更改、增长和变得复杂时。提二:静态类不能实现接口。因此,您永远不能为了测试目的而模拟您的容器;容器的每次使用都需要对容器组件而不是合同的固定引用。您不能子类化静态类;
【讨论】: