Java 使用依赖项注入容器时使依赖项显式

Java 使用依赖项注入容器时使依赖项显式,java,php,dependency-injection,Java,Php,Dependency Injection,依赖项注入的一个优点是类的依赖项是在其接口(即构造函数)中显式定义的。但是,如果使用依赖项注入容器,许多依赖项将合并到一个依赖项(容器)中。因此,类的许多真正依赖项都隐藏在容器后面。如何避免这种情况,以便在使用依赖项注入容器时仍然显式定义依赖项?似乎可以在bean定义中使用“dependen-on”属性在代码中添加显式依赖项。我在这里发现了一个类似的问题 您似乎可以在bean定义中使用'depends-on'属性在代码中添加显式依赖项。我在这里发现了一个类似的问题 是和否,这取决于依赖项注入容器

依赖项注入的一个优点是类的依赖项是在其接口(即构造函数)中显式定义的。但是,如果使用依赖项注入容器,许多依赖项将合并到一个依赖项(容器)中。因此,类的许多真正依赖项都隐藏在容器后面。如何避免这种情况,以便在使用依赖项注入容器时仍然显式定义依赖项?

似乎可以在bean定义中使用“dependen-on”属性在代码中添加显式依赖项。我在这里发现了一个类似的问题


您似乎可以在bean定义中使用'depends-on'属性在代码中添加显式依赖项。我在这里发现了一个类似的问题


是和否,这取决于依赖项注入容器的工作方式

我认为这种代码没有任何问题:

class Class1 {
    /**
     * @Inject
     * @var Class2
     */
    private $class2;
}

即使容器将注入依赖项,
Class1
依赖于
Class2
这一事实相当明确。(这里使用的依赖项注入容器是)

是和否,这实际上取决于依赖项注入容器的工作方式

我认为这种代码没有任何问题:

class Class1 {
    /**
     * @Inject
     * @var Class2
     */
    private $class2;
}

即使容器将注入依赖项,
Class1
依赖于
Class2
这一事实相当明确。(这里使用的依赖注入容器是)

我三年前问过这个问题,从那时起,我开始理解并喜欢静态类型语言中的DI

当我问这个问题时,我似乎不理解“服务定位器”和“依赖注入容器”(DIC)之间的区别

DIC在应用程序的“下方”运行,并负责构建对象和构建对象图,通常在引导期间,但如果完全引导,则在应用程序之前类不应该知道DIC,也不应该依赖它。DIC应该构造类的所有依赖项,并像手动实例化类一样注入它们

服务定位器是在系统中传递并用于查找依赖项的对象。使用服务定位器会模糊依赖关系(我在学习这些内容时注意到的最初问题),并创建系统范围的依赖关系(即服务定位器本身)

通常,我会避免使用服务定位器模式(有人称之为“反模式”)。使用像Ninject或Symfony 2的DIC这样的好的DIC可以让您的类专注于其中的业务逻辑,而不是查找依赖项


阅读Martin Fowlers关于依赖注入的文章:

我三年前问过这个问题,从那时起,我开始理解并喜欢静态类型语言中的DI

当我问这个问题时,我似乎不理解“服务定位器”和“依赖注入容器”(DIC)之间的区别

DIC在应用程序的“下方”运行,并负责构建对象和构建对象图,通常在引导期间,但如果完全引导,则在应用程序之前类不应该知道DIC,也不应该依赖它。DIC应该构造类的所有依赖项,并像手动实例化类一样注入它们

服务定位器是在系统中传递并用于查找依赖项的对象。使用服务定位器会模糊依赖关系(我在学习这些内容时注意到的最初问题),并创建系统范围的依赖关系(即服务定位器本身)

通常,我会避免使用服务定位器模式(有人称之为“反模式”)。使用像Ninject或Symfony 2的DIC这样的好的DIC可以让您的类专注于其中的业务逻辑,而不是查找依赖项


阅读Martin Fowlers关于依赖项注入的文章:

没有一致使用构造函数注入的类依赖于DI容器。您可以使用容器连接这些类,但也不必这样做。如果类A是使用DI容器构造的,并且A有-A B,B有-A C,那么C如何访问它所需的依赖项呢?调用堆栈下面几层的类如何访问依赖项?它们也使用构造函数注入。所以,如果C依赖于D,它就通过它的构造函数得到它。所以我所有的类都应该有这样的构造函数:u construct(DatabaseAdapter$db,Cache$Cache,Logger$Logger,…)?是和否:它们很可能不应该依赖于Cache,logger和其他横切关注点:没有一致使用构造函数注入的类依赖于DI容器。您可以使用容器连接这些类,但也不必这样做。如果类A是使用DI容器构造的,并且A有-A B,B有-A C,那么C如何访问它所需的依赖项呢?调用堆栈下面几层的类如何访问依赖项?它们也使用构造函数注入。因此,如果C依赖于D,它就通过它的构造函数得到它。所以我所有的类都应该有这样的构造函数:uu construct(DatabaseAdapter$db,Cache$Cache,Logger$Logger,…)?是和否:它们很可能不应该依赖于Cache,Logger和其他交叉关注点: