【发布时间】:2011-10-20 08:13:38
【问题描述】:
我们在一个项目中使用 Spring,@Autowired 用于自动注入依赖项。我想禁止从特定模块自动装配某些 bean,例如,可以在模块 B 中从模块 A 自动装配 bean,但不能在模块 C 中自动装配 bean。Spring 可以吗?
【问题讨论】:
标签: spring
我们在一个项目中使用 Spring,@Autowired 用于自动注入依赖项。我想禁止从特定模块自动装配某些 bean,例如,可以在模块 B 中从模块 A 自动装配 bean,但不能在模块 C 中自动装配 bean。Spring 可以吗?
【问题讨论】:
标签: spring
不幸的是,单个应用程序上下文中的 bean 是 flat 即它们都是等价的。但是,如果您定义了两个应用程序上下文,父级和子级,则来自子级的 bean 可以访问来自父级的 bean,但反之则不行。在子上下文中定义的 Bean 对父级是不可见的。
在您的情况下,您将模块 A 和 B 放在父上下文中,将 C 放在子上下文中。
【讨论】:
解决问题的最佳方法是通过javax.inject qualifiers。使用适当的限定符注释您的 bean,然后在注入点使用它:
@Autowired
@FooQualifier
private YourService service;
否则,哪个实现注入到哪里很快就会变得一团糟。
另一种选择是将一个 bean 指定为 @Primary - 对于给定的注入点,它将优先于其他 bean。
【讨论】:
是的,这是可能的,但不是“漂亮”。你可以使用BeanPostProcessor,当你得到一个bean时,检查它是否是你的“父”类型之一,以及它的所有子bean是否都是允许的类型。否则,您可以抛出异常或将这些字段设置为空。
【讨论】: