Spring 依赖注入框架的目标是在程序初始化时连接整个程序吗?

Spring 依赖注入框架的目标是在程序初始化时连接整个程序吗?,spring,dependency-injection,guice,dagger-2,Spring,Dependency Injection,Guice,Dagger 2,DI框架如Dagger2、Guice或Spring允许连接整个对象图。但在某些情况下,这些对象图需要实例化(例如,在Dagger2中,这是通过使用代码中用于初始化对象(子)图的组件实现的)。 您应该如何使用这些框架? 在程序中初始化整个程序(对象图) 初始化阶段?明显的优点是您可以使用 类似于依赖项继承(例如 匕首2) 在代码中的不同位置初始化不同的子图并手动将它们连接在一起?如果依赖于仅在运行时具有的依赖项,因此需要添加到对象图初始值设定项,那么这可能是唯一的选项吗 这两种方法都是有效的,但

DI框架Dagger2、Guice或Spring允许连接整个对象图。但在某些情况下,这些对象图需要实例化(例如,在Dagger2中,这是通过使用代码中用于初始化对象(子)图的组件实现的)。

您应该如何使用这些框架?

  • 在程序中初始化整个程序(对象图)
    初始化阶段?明显的优点是您可以使用
    类似于依赖项继承(例如
    匕首2)
  • 在代码中的不同位置初始化不同的子图并手动将它们连接在一起?如果依赖于仅在运行时具有的依赖项,因此需要添加到对象图初始值设定项,那么这可能是唯一的选项吗

这两种方法都是有效的,但正如所述:

对于基于请求的应用程序(如网站和服务),只需配置一次容器,但要为每个传入的请求解析一个对象图


hk2()是专门为第二个用例设计的,因为它允许在任何时候动态重新布线。这对于可能具有插件体系结构的服务器非常有用,插件可以随时进出,但这不意味着我们仍然在初始化阶段连接整个应用程序,只针对每个请求吗?我们仍然只有一个包含所有程序依赖项的依赖项容器(不包括仅在运行时可用的依赖项)?正确。在启动时配置/注册所有内容一次(如果使用容器),但在每个请求上解析一个完整的对象图。出于好奇,除了容器还有什么其他选项?我不认为在一个用例中不在一个中心位置收集所有依赖项是有意义的。这不正是DI框架的用途吗。我同意,在一个中心位置之外组合依赖项是没有意义的。这个中心通常被称为“中心”。但是,在组合根中,有两个选项。要么使用DI容器,要么手工构建对象图,这种做法称为。了解DI是一种实践(不是一种技术)以及工具是有用的,但是可选的,这一点很重要