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