5

我是 Spring 的初学者,我正在尝试通过阅读散布在互联网上的一些代码来学习它。当我查看这些代码的 pom.xml 时,我几乎总是看到人们使用彼此相邻的“spring-core”和“spring-context”作为该项目的附加依赖项。当我查看依赖层次结构时,我看到 spring-core 已经在 spring-context 中。

所以我的问题是:是否有必要同时使用两者?“spring-context”中的“spring-core”和“spring-core”作为单独的工件有区别吗?

4

2 回答 2

16

这称为传递依赖。如果你不声明 spring-core,你仍然会得到它,因为 spring-context 声明了它。

今天,无论您是否声明 spring-core,您的代码都可以工作,因为由于传递依赖机制,您无论如何都能得到它。所以这是一个最佳实践问题,而不是它是否有效。

要问的问题是,为什么我需要弹簧芯?

  • 如果您的代码没有直接引用它,那么您就不需要它,即使 spring-context 确实如此。所以,让 spring-context 负责声明它需要 spring-core。不要自己声明。
  • 如果您的代码确实直接引用了 spring-core 中的某些内容,那么您确实需要它,无论 spring-context 是否需要它。也许在未来的版本中,spring-context 将不再依赖于 spring-core。所以,你应该声明spring-core。

一句话,你应该明确声明那些你自己使用的依赖,即使它们也是传递引入的。

这对玩具项目并不重要。但它使大型项目的长期维护变得容易得多。

编辑: spring-core 和 spring-context 联系紧密,上述建议无关紧要。一个重要的常见情况,当您拥有依赖于日志记录包 L 的库 A 时。如果您自己的代码使用 L,那么您最好显式声明该依赖关系,因为 A 将来可以很容易地切换为使用不同的日志记录包裹。另一方面,spring-context 不太可能切换到另一个提供者来提供 spring-core 的功能......

于 2013-05-21T16:00:09.377 回答
7

Andrew 和 Gus 都对你的问题做了充分的判断。我只想从 Spring 方面详细说明一些事情。如果您刚刚开始使用 Spring,我认为可以肯定地假设您可能正在努力了解依赖注入的工作原理。

您必须使用BeanFactory和来检查样本ApplicationContext。事物的 bean 方面包含在spring-beansjar 中(如XmlBeanFactory等),事物的上下文方面(如ClassPathXmlApplicationContext等)包含在spring-contextjar 中。

但是,要使用两个依赖注入容器中的任何一个,您将使用core.io 包提供的某些公共类(如ClassPathResource、 ),这也是您的应用程序也依赖于jar 的原因。FileSystemResourcespring-core

此外,请注意您定义的“字符串”属性值如何web.xml自动转换为正确的数据类型,如原始类型或包装类型。这通过 jar 也提供的 Propert Editor 支持来实现spring-core

于 2013-05-21T16:16:04.510 回答