我注意到在处理多个@Configuration
文件时,组件扫描和bean创建存在歧义。
假设我有方法级安全性的配置,它需要扫描包含需要代理AOP的类的包。这些类依赖于其他类,也是其他类的依赖项。
一切正常,直到我在不同的配置中扫描同一个包,例如root配置。然后开始出现诸如循环依赖和 bean in creation 之类的异常。似乎root配置也试图实例化相同的对象,但当然不能这样做,因为在某些时候AOP代理无法在此配置路径中应用,并且无法满足依赖性。
如果我最终准确地扫描了什么,那么一切都有效,但我很惊讶Spring无法自动编排bean创建顺序。这是真的吗,还是有什么可疑的事情?
答案 0 :(得分:1)
这不是腥。 bean存储在AppContext中。 spring的设计就像:你可以在同一个上下文中拥有同一个类的两个实例!如果通过配置两次配置MyService,应该自动连接哪个实例? 见这个例子:
@Autowired
private final MyService myService = null;
由于您的扫描工作了两次,您有两个可能的候选用于注入,而spring不能自动装配并给出异常(在这种情况下,spring寻找@Primary
- Annotation,但是因为你扫描了两次你有@Primary两次 - 所以在这种情况下可能没有用。)
让客户选择正确的服务是有效的:
@Autowired
private final MyService[] myServices = null;
这样可行,您拥有数组中的所有实例。
另一种选择是在同一个应用程序中有两个不同的AppContexts。