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