【问题标题】:What is the point of dependency injection as used in Spring?Spring中使用的依赖注入有什么意义?
【发布时间】:2013-10-22 11:58:56
【问题描述】:

我已经阅读 Spring in Action 一书几周了,以了解 Spring 框架。我有大约 2 年的编程经验,主要是在 java 中,在 Ruby 和 Python 中也有一些干扰。

在阅读了前几章之后,我并没有完全明白 Spring 中的依赖注入有什么大不了的。我期待一个 AHAAA 时刻,但还没有完全体验到。我确定我错过了一些重要的东西。

我为什么要在 xml 中连接我的 bean,而不是使用 = new myclass(); 以旧的方式实例化它们

我知道我可以通过构造函数参数和属性在 xml 中连接 bean,以及在 spring 中配置数据源,以便我可以在 xml 文件中隐藏连接详细信息。但为什么?这还有更多,尤其是在良好的软件设计方面。有人能解释一下大事吗?

【问题讨论】:

  • 你当然应该阅读这篇文章 - martinfowler.com/articles/injection.html
  • 看起来您已经阅读了一本旧的 Spring in Action Book。从 Spring 3.0 开始,xml 中就没有那么多 bean 定义了。
  • 我确实读过 Spring 3。你得帮我解释一下 xml 配置有多少 = 控制反转。怎么可能?
  • 拉尔夫,你能解释一下吗? spring 3 xml 是如何减少的。自动装配如何允许解耦?

标签: java spring spring-mvc dependency-injection


【解决方案1】:

三个字:控制反转

简而言之: 一旦您实例化“旧方法”,您就会创建紧密耦合,例如:您的控制器依赖于特定的模板引擎,您的实体依赖于具体的数据库层等。这就是您想要防止的事情以及依赖注入容器的位置(DIC) 非常方便。它管理您的服务,您不必再关心具体的实现,只要它们实现相同的接口即可。

想象一个名为InMemoryLayer 的简单存储层类,您可以在需要时对其进行实例化。现在你想把它换成一个很棒的新的开源 github 解决方案,叫做SuperSecretRemoteCloudLayer。通常,您现在可以在您选择的 IDE 中点击“搜索和替换”,并将所有出现的InMemoryLayer 替换为SuperSecretRemoteCloudLayer。但这不是很方便而且很容易出错,你为什么要手动完成所有这些艰苦的工作呢? DIC 可以为您和所有 做这件事,就是*Layer 都实现了相同的接口(这样您的应用程序就不会中断)。

【讨论】:

  • 说得好。如果我们使用注解,我们必须再次在 IDE 中搜索并找到接口,它必须更改。我不相信。你的看法是什么?
  • 这是另一个更小的好处吗?:以“旧方式”显式调用构造函数,即使使用相同的实现也容易重构,但具有并更新其构造函数参数?如果构造函数获得了一个添加的参数,并且使用了 DI,那么该构造函数的类只需要自动装配新参数,并且不需要显式的构造函数调用重构? (参考:“更改 Person 构造函数的签名”javacreed.com/why-should-we-use-dependency-injection
  • 在使用 SuperSecretRemoteCloudLayer 切换 InMemoryLayer 的情况下,我可以简单地实例化存储层一次,并将其引用作为公共静态成员。如果我这样做,我将只需要在存储层实例化的地方更改一次。
【解决方案2】:

Spring 的重点在于依赖注入,而不是基于 XML 的配置。正如其他人所指出的,Spring 已经远离基于 XML 的配置。但是 DI 是 Spring 的核心。

不得不说的是,DI 提供了一种不同的模型来将组件连接在一起。不是组件直接相互创建(因此紧密耦合),而是组件停止这样做,并且您从中心位置注入链接。事实证明,这尤其有助于测试和事务管理。

【讨论】:

    【解决方案3】:

    除非你不得不以艰难的方式做事,否则你不会真正欣赏 Spring。在没有连贯框架的情况下维护多个大型项目的艰难方法。如果您有 4 个大型企业级应用程序,它们都有自己的启动方式和管理资源的方式,那么您会很头疼。如果您知道每个应用程序都使用spring,那么只需查找应用程序上下文xml!这也使得为不同的环境和测试用例设置新的上下文变得非常容易,所有这些都不会破坏您的代码库。

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 2012-07-07
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多