【问题标题】:Limiting Dependency on Spring Without Losing Power of Framework在不损失框架能力的情况下限制对 Spring 的依赖
【发布时间】:2010-07-26 14:10:59
【问题描述】:

Web 项目的简化架构

  • 战争

    • spring 依赖注入(大部分使用 XML)
  • 罐子

问题: 随着 Spring 3 和 2.5+ 的注释,构建存储库和服务变得更容易连接在一起。但是,因为通常@Service 在概念上属于 JAR 远远超过 WAR,当然还有自动连接的存储库和事务类。人们如何在实际 JAR 类中没有“弹簧依赖”的地方工作,我在多家公司发现这是一个目标。

显然,我知道如果你想使用注释和事务,你不能删除所有 spring 依赖项,因为它们实际上是 spring 类,但是如果 spring 发生变化或者有在 WAR 中使用比 JAR 中包含的更旧的 spring 版本的项目?

我假设这一定是一个常见问题,但如果不是,请询问,我会详细说明

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    基于注解的依赖注入本质上(非常方便)违反了关注点分离。你描述的依赖是这个的结果。如果您想避免它,您应该在单独的包中进行接线(即不使用注解进行依赖注入)。

    但是,可以根据您自己的自定义注释进行接线。根据您愿意走多远,这可以改进事情以仅留下一个弹簧依赖项(您的扩展注释)或完全删除依赖项。这仍然违反了 SoC,但对 Spring 的依赖要少得多。

    通常我发现要么忍受注释的缺点,要么完全不使用它们(使用 Java Config 或普通的旧 XML)是最易于维护的选项。自定义注释是另一个维护负担。

    【讨论】:

    • 有使用@Transactional 注释的经验吗?
    • @jboyd:其实很多,我喜欢它。可以从 xml 执行此操作,但这将在我列表的底部。您还可以使用 @TransactionAttribute(JPA 等效项)。
    • @iwein - 如果我使用 @TransactionAttribute 从 Spring 中删除我的依赖项,我是否需要通过 JPA 完成所有操作?或者我可以只使用 JPA 事务注释和 spring 实现吗?
    • @jboyd 您可以将@TransactionAttribute 与@Repository 的spring 实现一起使用,以避免服务层中的Spring 依赖项仍然存在于您的数据访问层中,但这有点牵强我会说。据我所知,这不受 Spring 的限制。
    • @iwein - 好吧,@TransactionAttribute 是一个 JPA 依赖项,所以如果你有它,使用 spring 实现,spring 依赖项将在运行时,而不是在编译时,所以你已经删除了所有从数据访问层弹出依赖项
    【解决方案2】:

    我已经使用 Spring 框架有一段时间了,我们在我目前的工作中广泛使用它。使用 Spring 的优点之一是它被设计为尽可能少的侵入性,也就是说,您很少需要实现一些 Spring 特定的接口等。

    不幸的是,就我而言,为了最大限度地减少由于使用注释而对 spring 类的依赖,最好的方法是使用 XML 配置文件,这也有其缺点。

    在我看来,归根结底,总要付出代价。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      相关资源
      最近更新 更多