我已经看到了至少三种在Java对象中获取依赖关系的方法,而没有将对象耦合到依赖项的创建;
依赖注入 - 某个框架基于外部配置将所需对象注入另一个对象,例如:Spring managed beans
依赖性查找 - 类在某种目录服务中查找所需的依赖项,例如:Java EE容器中的JNDI查找
静态工厂 - 全局范围内的对象按需提供实例 - 标准Java SE API似乎充斥着这些实例,例如:java.util.Logger.getLogger(name),java.util.Calendar.getInstance()
您可以提供哪种指导最合适的情况?
答案 0 :(得分:6)
我更喜欢依赖注入,因为对象不需要知道它如何获取它所需的引用。
依赖项查找仍然需要对象了解查找服务及其URL。
静态工厂与查找服务类似。
答案 1 :(得分:2)
我更喜欢依赖注入。
当我用Spring Framework谈论DI时,我会看到以下
这些不平衡每个负面因素,例如对另一个图书馆的依赖。我为什么要使用其他方法?
答案 2 :(得分:1)
这实际上取决于上下文。如果您正在编写自包含的Maths API,则可能需要使用静态工厂,因为代码将不那么冗长,无需设置且可能更高效。如果您需要访问/提供远程依赖项,JNDI / LDAP查找或ESB消息传递将很好地工作。要将服务/ DAO /数据源注入到典型的企业服务器代码中,最好使用常见的D.I.像Google Guice或Spring这样的框架。
软件设计中没有单一的“最佳”解决方案;它始终是一种权衡。