【问题标题】:Java based dependency injection in SpringSpring中基于Java的依赖注入
【发布时间】:2014-12-18 21:10:15
【问题描述】:

我在 webapp 中工作,这是我第一次使用基于 Java 的配置。我有一堆类要全部配置:

  • 应用程序上下文
  • PersistenceContext
  • 安全上下文
  • WebAppInitializer
  • WebMvcContext

现在我正在定义 Spring Data 存储库和服务层,因此我需要在其中注入存储库。通常我会使用 Autowired 但我读过它is preferable to define the injections manually 所以问题是,在哪里?

也许以前的配置类都不适合这样的任务,但是,我是否必须创建一个类来定义所有注入,或者更好地为每个功能都启用?如果项目增长过多会怎样?

我认为主要问题是在 Spring 项目中组织依赖项的最佳方式是什么。你是做什么的?

我在此处添加项目结构的图像作为请愿书。我正在尝试解耦层,现在我需要将 UserRepository 注入到 UserService。

【问题讨论】:

  • 你能添加一些示例代码吗?它有助于展示您正在尝试的内容。
  • 请链接到但我已经读到最好手动定义注入或添加一些上下文。
  • 我添加了链接。很抱歉。
  • @superbAfterSemperPhi 我添加了一个带有项目结构的图像。希望对您有所帮助。
  • 反对自动装配的建议已经过时。当您只拥有 XML 时,自动装配确实会造成困难,但是通过注释,您总是可以清楚地看到被自动装配的属性的类型。 @Qualifier 很好地解决了按类型自动装配不起作用的罕见情况。

标签: java spring spring-mvc dependency-injection spring-data-jpa


【解决方案1】:

不,我不会定义一个类来完成所有的注入。你所有的类都是这样耦合的。

我不明白“手动定义注射”是什么意思。您必须在 XML 或注释中指定它们。据我所知,没有其他方法。

你没有说你是使用 XML 还是注解配置。我发现自己更多地使用后者,只有足够的 XML 配置来告诉 Spring 应用程序上下文扫描注释。

如果您使用 XML,Spring 惯用语会让您分层指定配置。注释是一个有争议的问题,因为它们会进入您的源代码。

您的应用程序将在启动时读取 Spring 上下文,实例化所有 bean,并将必要的依赖项连接在一起。从那以后你就可以走了。

我不同意您提供的链接。避免自动装配?没有。

【讨论】:

  • 我正在使用注释(如我在帖子中所说的基于 Java 的配置),我可以使用 Autowired 注释而不是在 Java 文件或 XML 中手动定义它们。
  • 您将这些注释添加到您的源代码中,这是一个 Java 文件。您需要 XML 来告诉 Spring 扫描注解和要查看的包。
  • 我现在不使用任何 XML 文件。我使用注释来做到这一点。
  • 你能解释一下你为什么不同意吗?我真的很感兴趣。我发现有些人评论说应该避免使用自动接线,我想听听代表使用它的意见。
  • 同一个应用程序中的不同实现?您将拥有不同的 bean id,其属性可以区分您想要哪一个。这些确实适用于 XML 配置,而不是注释。一个示例是与多个不同端点 URL 建立连接的单个 Web 服务客户端类。 “在大型项目中维护混乱” - 不是我的经验。在你尝试之前不要说出来。
【解决方案2】:

文章说他推荐大型项目使用 XML 配置。在这一点上,这是一个非常小的项目。在我看来,即使按照文章作者的话,带有注释的自动连接也可以。

【讨论】:

  • 当然。我两天前开始了这个项目,但我还有更多。如果我现在可以这样做(如果需要),我不想稍后移动所有注射剂