【问题标题】:ApplicationContextAware Vs Setter InjectionApplicationContextAware 与 Setter 注入
【发布时间】:2013-01-20 18:50:48
【问题描述】:

ApplicationContextAware 相对于 Setter Injection 有什么优势。通过 Setter Injection 我们也可以从 Spring Container 中获取 bean。

【问题讨论】:

    标签: java spring jakarta-ee


    【解决方案1】:

    使用ApplicationContextAware,您可以获得对当前上下文的引用,以便您可以对其进行编辑,例如添加或删除bean。通常这是一个坏主意,除非在某些测试场景中。

    Spring 还强调,使用 ApplicationContextAware 与使用带有 setter 的简单 POJO 相比,您更依赖 Spring 框架。

    【讨论】:

    • 如果我们的类中需要许多实用程序 bean,您更喜欢哪一个。编写大量的 setter/getter 会使类看起来很复杂
    • 如果您需要许多实用程序 bean,您应该考虑您的 bean 是否具有正确的角色(如果它做了太多事情/有太多责任),或者您的实用程序 bean 是否被分成了良好的逻辑组。这样你应该能够减少不必要的依赖。我能想到任何理由在任何生产 bean 中 ApplicationContextAware
    【解决方案2】:

    你不应该使用ApplicationContextAware,除非你真的需要它。如果您可以通过 setter/field/constructor 注入来支持您的所有业务需求,请不要使用ApplicationContextAware

    有些人可能会想使用ApplicationContextAware 来获取原型作用域bean 的新实例(实际上BeanFactoryAware 就足够了)。但是有更好的工具,即lookup-method

    【讨论】:

      【解决方案3】:

      这是两种不同的模式。当您使用ApplicationContextAware 时,您实现了服务定位器模式,但设置器注入指的是依赖注入模式。在开发低耦合应用程序时,后者更可取。

      这两种模式的区别描述为herehere

      【讨论】:

        【解决方案4】:

        在大多数情况下,setter 注入就足够了,它提供了更好的解决方案,帮助您维护实例之间的关系。因为类不直接依赖于容器,也就是说它们是Pojos,不需要知道容器的存在,这会给单元测试和以后的迁移带来很多方便。

        如果你真的需要从容器中取出一些东西,例如对某些类型的 bean 进行一些增强,那么是时候使用 ApplicationContextAware 了。通常,不建议通过实现 ApplicationContextAware 在类中手动获取依赖关系,尤其是对于业务对象。他们不应该对自己的组装负责”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 2020-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多