java - 为什么我们不应该使用查找而不是依赖注入(inject)?

标签 java spring dependency-injection

是否有任何充分的理由不在应用程序上下文中查找对象而不是“假设”注入(inject)了依赖项? 例如:

public Dependency getDependency(){
     if (dependency  == null){
        dependency = (Dependency) applicationContext.getBean("dependency");
     }
     return dependency;
}

有争议的论点

使用 Spring 特定对象污染对象

有些人可能会提示使用应用程序上下文会将实现与 Spring 内容绑定(bind)。但是,创建一个 applicationContext 的间接连接可以轻松解决这个问题。好吧...让我举例说明:

public Dependency getDependency(){
     if (dependency  == null){
        dependency = (Dependency) serviceLocator.getBean("dependency");
     }
     return dependency;
}

很难改变实现

首先,它(依赖对象)可以在应用程序上下文中轻松更改。但是,可以使用通常的更改器(mutator)直接插入模拟,甚至更容易:

public void setDependency(Dependency dep){
     this.dependency = dep;
}

历史问题

很久以前,Java 世界中的每个人都在使用服务定位器(在名为 JNDI 的技术的目录服务中)来拥有可互换的对象基础结构。我们可以在目录服务中绑定(bind)三种对象:可序列化数据、引用或 Dircontext。它还允许您在分布式环境中查找对象。

然后,我们有了 Spring 革命,现在大多数情况下都使用 DI(依赖注入(inject))。

但是,Spring 并没有禁止服务定位器模式。例如,使用 ApplicationContext 允许我们以服务定位器的方式查找 bean。我们可以认为 Spring 框架提供了一个具有集中配置的大型对象工厂、依赖注入(inject)工具以及可以轻松处理的服务目录。最后一部分几乎被遗忘了。

相关问题

Why is Spring's ApplicationContext.getBean considered bad?

我不认为这些答案虽然有启发性,但并没有启发上面提出的观点。

最佳答案

我个人对此的看法。 通过注释轻松使用 DI,而不是通过 applicationContext 获取 bean。 但归根结底,我认为主要区别在于依赖项的定位方式。 服务位置需要客户端代码请求相关的特定依赖项,而使用依赖项注入(inject),容器创建所有对象并将这些依赖项作为构造函数参数注入(inject)。 坦率地说,归根结底,两者都是可行的,但请考虑这一点:据我所知,JNDI 查找在性能方面相当昂贵,因此最终建议您缓存它们。

关于java - 为什么我们不应该使用查找而不是依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29030704/

相关文章:

java - 如何找出创建垃圾对象的代码

asp.net-mvc - 组合 ASP.NET MVC Web 应用程序的最佳实践(MEF、Areas、DI)

Spring RestTemplate 交换帖子不适用于 SSL 抛出 SunCertPathBuilderException

java - mvn 测试失败,但从 IntelliJ IDEA 运行测试通过

java - 从 Java Spring MVC 调用 Node.Js Rest API(POST)

java - 摆脱Guice依赖

java - 在Java中的测试类中实例化要测试的类

java - 如何检查我们现在是否位于两个日期时间对象之间?

java - 如何使用 struts2-json-plugin 将 JSON 绑定(bind)到 Struts2 中的 Java 对象

java - 在finally{}中捕获异常?必须?