4

我已经看到了至少三种在 Java 对象中获取依赖项的方法,而无需将对象与依赖项的创建耦合;

依赖注入 - 一些框架基于外部配置将所需对象注入到另一个对象中,例如:Spring managed beans

依赖项查找 - 一个类在某种目录服务中查找所需的依赖项,例如:Java EE 容器中的 JNDI 查找

静态工厂 - 全局范围内的对象按需提供实例 - 标准 Java SE API 似乎到处都是这些,例如:java.util.Logger.getLogger(name)java.util.Calendar.getInstance()

对于哪种情况最适合您,您可以提供哪些指导?

4

3 回答 3

6

我更喜欢依赖注入,因为对象不需要知道它如何获取它需要的引用。

依赖查找仍然需要对象了解查找服务及其 URL。

静态工厂类似于查找服务。

于 2010-08-18T19:04:38.043 回答
2

我更喜欢依赖注入

当我用 Spring Framework 谈论 DI 时,我看到以下内容

  1. IDE 支持它(错误检查、可视化)。
  2. 您可以设置其他需要的东西,例如 AOP、属性加载、...
  3. 您有很大的配置可能性 - XML、注释、JavaConfig
  4. 也可以在桌面应用程序中使用。

这些平衡了所有负面因素,例如对另一个库的依赖。为什么我应该使用另一种方法?

于 2010-08-18T19:23:39.230 回答
1

This really depends on the context. If you are writing a self-contained Maths API you might want to use static factories because the code will be less verbose, setup-free and maybe more efficient. If you need to access/provide a remote dependency, a JNDI/LDAP lookup, or ESB messaging would work well. For injecting your services/DAO's/datasources into your typical enterprise server code you'd be better off using one of the common D.I. frameworks like Google Guice or Spring.

There is no single 'best' solution in software design; it's always a tradeoff.

于 2010-08-18T21:31:32.977 回答