我将以下bean定义为A.jar
的一部分package abc;
@Component
public class ParentInterceptor implements ClientInterceptor {
}
我通过扩展ParentInerceptor
在不同的包下创建了另一个beanpackage xyz;
@Component
public class ChildInterceptor extends ParentInterceptor {
}
在我的SpringBoot应用程序中,我有一个类似于下面的
定义的bean@ComponentScan({"abc","xyz"})
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
@Bean
public Data dataRepo(ParentInterceptor p){
}
}
当我运行main方法时,我希望看到NoUniqueBeanDefinitionException,因为2个bean的类型相同。但是我看到两个bean都已加载并且正在使用ParentInterceptor。有没有理由不抛出错误?
修改
然而,当我做下面的事情时,我能够看到错误被抛出。但是我仍然无法理解为什么在上面列出的案例中没有抛出错误。
package xyz;
@Component
public class ChildInterceptor1 extends ChildInterceptor {
}
申请类:
@ComponentScan({"abc","xyz"})
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
@Bean
public Data dataRepo(ChildInterceptor p){
}
}
编辑2
我还尝试使用下面的代码检查子bean是否确实扩展了父代 -
ctx.getBeansOfType(ParentInterceptor.class)
这将返回ParentInterceptor& ChildInterceptor。所以我不确定为什么Spring没有返回错误!
答案 0 :(得分:0)
在你的第一个例子(Parent和Child)中,我有正确的行为,即抛出NoUniqueBeanDefinitionException。
如果要指定要注入的bean,可以使用@Qualifier注释:
@Bean
public Data dataRepo(@Qualifier("parentInterceptor") ParentInterceptor p) {
}
您可以选择为组件命名:
@Component("foo")
并相应地更改@Qualifier。