如何对@Autowired强制执行限制

时间:2011-10-20 08:13:38

标签: spring

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

3 个答案:

答案 0 :(得分:2)

不幸的是,单个应用程序上下文中的bean是 flat ,即它们都是等效的。但是,如果您定义了两个应用程序上下文(父级和子级),那么来自子级的bean可以从父级访问bean,但不能相反。在子上下文中定义的Bean对于父级是不可见的。

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

答案 1 :(得分:1)

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

@Autowired
@FooQualifier
private YourService service;

否则它很快会变成一个混乱的实现被注入到哪里。

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

答案 2 :(得分:0)

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