如何选择获取依赖关系的方法?

时间:2010-08-18 19:01:27

标签: java dependency-injection static-factory

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

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

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

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

您可以提供哪种指导最合适的情况?

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

我更喜欢依赖注入

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

  1. 它受IDE支持(错误检查,可视化)。
  2. 您可以设置其他所需的东西,如AOP,属性加载,......
  3. 您有大的配置可能性 - XML,注释,JavaConfig
  4. 也可以在桌面应用程序中使用。
  5. 这些不平衡每个负面因素,例如对另一个图书馆的依赖。我为什么要使用其他方法?

答案 2 :(得分:1)

这实际上取决于上下文。如果您正在编写自包含的Maths API,则可能需要使用静态工厂,因为代码将不那么冗长,无需设置且可能更高效。如果您需要访问/提供远程依赖项,JNDI / LDAP查找或ESB消息传递将很好地工作。要将服务/ DAO /数据源注入到典型的企业服务器代码中,最好使用常见的D.I.像Google Guice或Spring这样的框架。

软件设计中没有单一的“最佳”解决方案;它始终是一种权衡。