【问题标题】:How to enforce restrictions on @Autowired如何对@Autowired 实施限制
【发布时间】:2011-10-20 08:13:38
【问题描述】:

我们在一个项目中使用 Spring,@Autowired 用于自动注入依赖项。我想禁止从特定模块自动装配某些 bean,例如,可以在模块 B 中从模块 A 自动装配 bean,但不能在模块 C 中自动装配 bean。Spring 可以吗?

【问题讨论】:

    标签: spring


    【解决方案1】:

    不幸的是,单个应用程序上下文中的 bean 是 flat 即它们都是等价的。但是,如果您定义了两个应用程序上下文,父级和子级,则来自子级的 bean 可以访问来自父级的 bean,但反之则不行。在子上下文中定义的 Bean 对父级是不可见的。

    在您的情况下,您将模块 A 和 B 放在父上下文中,将 C 放在子上下文中。

    【讨论】:

      【解决方案2】:

      解决问题的最佳方法是通过javax.inject qualifiers。使用适当的限定符注释您的 bean,然后在注入点使用它:

      @Autowired
      @FooQualifier
      private YourService service;
      

      否则,哪个实现注入到哪里很快就会变得一团糟。

      另一种选择是将一个 bean 指定为 @Primary - 对于给定的注入点,它将优先于其他 bean。

      【讨论】:

      • 但是,这并不能解决问题。我仍然可以在任何其他类中注入 bean。
      • @saberduck 是的,它不能回答您的问题,但它是最佳实践,应该优先于您的方法
      【解决方案3】:

      是的,这是可能的,但不是“漂亮”。你可以使用BeanPostProcessor,当你得到一个bean时,检查它是否是你的“父”类型之一,以及它的所有子bean是否都是允许的类型。否则,您可以抛出异常或将这些字段设置为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-05
        • 2016-05-07
        • 2016-10-24
        • 2016-02-27
        • 2017-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多