gpt4 book ai didi

java - 工厂类 vs Spring DI

转载 作者:搜寻专家 更新时间:2023-11-01 03:12:24 26 4
gpt4 key购买 nike

据我了解,工厂类和 Spring DI 都遵循依赖注入(inject)。我的意思是在这两种情况下都使用外部实体来插入依赖关系。 对吧?我的问题是,当我的意图只是获取对象时,我应该在工厂类和 Spring DI 之间选择哪一个。假设我不想要任何其他功能,如 aop、dao 支持等。唯一的目的是从工厂类或 Spring DI 获取对象。哪个更好。

在某些网站上阅读此声明

与工厂类相比,DI 松散耦合且侵入性较小

但无法理解 spring DI 如何松散耦合且比工厂类侵入性更小?在这两种情况下,我们都必须在核心程序中插入某种获取目标代码。

最佳答案

Spring DI 提倡松散耦合的代码,因为 Spring 容器会根据配置注入(inject)您的依赖项。如果您要注入(inject)接口(interface)实现,则不必更改代码来更改注入(inject)的特定实现,除非您考虑您的配置代码,许多人都会这样做。

如果您使用工厂来创建由其余代码使用的已配置对象,则您正在编写代码来创建对象、配置它们等。如果您想更改工厂返回的内容,则必须更改实际代码,有些人认为这是一个更具侵入性的变化。

通常,Spring 用于配置应用程序的各个层如何连接在一起。例如,X 服务采用这样那样的 DAO 实现。那是应用程序级别的组织。假设您有一个场景,想要为列表中的每一行创建一个按钮——在这种情况下,您可以使用工厂来创建按钮。此场景基于运行时情况,其中 GUI 具有您无法预先配置的不同元素(因为它基于数据),因此 DI 在这里意义不大。

编辑 - 根据您的评论问题,我认为这里的重点是您必须考虑的是 Spring 也是一个控制反转容器。这意味着您无需对应用程序中的哪些组件进行编程。没有 IoC,你可能会做类似的事情

MyServiceImpl extends MyService {
Dao1 = new Dao1Impl(); // you programmatically configure which components go in here
Dao2 = new Dao2Impl();
....
}

相反,你做类似的事情

MyServiceImpl extends MyService {
public Dao1; // you haven't specified which components, only interfaces
public Dao2;
....
}

在第二个代码示例中,Spring(或任何您使用的)将为您注入(inject)适当的 DAO 实例。您已将对使用哪些组件的控制移至更高级别。所以 IoC 和 DI 齐头并进,IoC 促进松散耦合,因为在您的组件定义(即接口(interface))中您只指定行为。

换句话说,IoC 和 DI 不是松散耦合所必需的;你也可以与工厂松散耦合

MyServiceImpl extends MyService {
public dao1
public dao2;

MyServiceImpl(){
dao1 = DaoFactory.getDao1();
...
}
....
}

这里您的服务仍然只依赖于 DAO 定义,您使用工厂来获取实现。需要注意的是,您的服务现在已耦合到工厂。如果你愿意,你可以通过将工厂传递给你的构造函数来让它更松散......

此外,不要忘记 Spring 提供了其他有用的功能,例如它的事务管理。这非常有用,即使您说您的应用程序不需要它。

关于java - 工厂类 vs Spring DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com