Java DI容器与工厂
我知道依赖注入上有很多ARICLE和线程,但依赖注入容器上没有那么多。我发现它非常有用,尽管它的目标是PHP。然而,当我读到更多关于这些容器的文章时,我得出这样的结论:这些容器仅仅是工厂方法的简单集合,这是真的吗 更深入、更具体的观点: 向对象注入依赖项时Java DI容器与工厂,java,c#,dependency-injection,di-containers,Java,C#,Dependency Injection,Di Containers,我知道依赖注入上有很多ARICLE和线程,但依赖注入容器上没有那么多。我发现它非常有用,尽管它的目标是PHP。然而,当我读到更多关于这些容器的文章时,我得出这样的结论:这些容器仅仅是工厂方法的简单集合,这是真的吗 更深入、更具体的观点: 向对象注入依赖项时 foo.Bar = new Dependency(); 我也会写作 foo.Bar = new myFactory.CreateDependency(); 或者用一个容器 foo.Bar = myContainer.CreateDepen
foo.Bar = new Dependency();
我也会写作
foo.Bar = new myFactory.CreateDependency();
或者用一个容器
foo.Bar = myContainer.CreateDependency();
在这里,上一种方法中的容器不仅有一个,还有许多其他方法来创建其他类型,因此它只是工厂方法的容器,对吗?DI容器可以被视为一大组智能工厂方法,它使用多种方式(代码、xml、自动映射)进行配置。我称这些工厂方法为智能方法,因为容器跟踪其注册的类型,并使用它们创建更复杂的对象。
当使用工厂时,您需要自己设置这些依赖项,否则您已经在使用依赖项容器。DI容器的全部要点是您永远不需要/应该编写类似这样的代码
foo.Bar = myContainer.CreateDependency();
它被认为是一种反模式。DI容器在组合根目录中只能使用一次(它是主要的DI容器使用模式)
DI容器根据配置通过构造函数或属性自动构造对象并注入依赖项。在工厂里,你必须自己做每件事。除了创建DI容器之外,它还为您提供:
终身管理。所以每次需要依赖项时,容器都可能注入相同的对象(单例生存期),或者每次都返回新的
有限的AOP功能,如方法调用拦截和在方法前后执行自定义逻辑
你可以看看这本书。这对我理解DI容器、使用模式和依赖注入有很大帮助。理想情况下,代码应该不知道它正在使用DI运行。
它只是将其依赖项外部化,并假设它们是被提供的 您可以将DI容器/库视为一个工厂框架,包含许多高级对象构造方法(通过反射)。它很有用,因为通常您不必编写任何高级方法,例如,加载插件程序集和获取插件数据类型。但缺点是反射速度慢,在应用程序初始化阶段使用反射是合理的。但是,如果您想在运行时使用它创建许多小对象,它会降低您的速度 另一方面,您自己的工厂是定制的,通常包含具体实现的列表和大型开关箱,或地图或类似的东西。它们工作得更快,但您必须自己编写所有对象构造逻辑
你不必在这两个选项中做出选择,你可以将它们结合起来。例如,您可以通过DI构建复杂的工厂,但contaienr如何知道何时构建任何类的新实例?当然,应该显式调用DI容器,这应该在某个“入口点”完成。例如,在web应用程序中,这一点是创建一个名为container.resolve的控制器。但某些控制器本身并不知道使用了DI容器。这就是构成根模式的本质。