NoUniqueBeanDefinitionException:没有类型的限定bean:不返回

时间:2015-10-26 16:11:22

标签: java spring spring-boot

我将以下bean定义为A.jar

的一部分
package abc;

@Component
public class ParentInterceptor implements ClientInterceptor {

}

我通过扩展ParentInerceptor

在不同的包下创建了另一个bean
package 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没有返回错误!

1 个答案:

答案 0 :(得分:0)

在你的第一个例子(Parent和Child)中,我有正确的行为,即抛出NoUniqueBeanDefinitionException。

如果要指定要注入的bean,可以使用@Qualifier注释:

@Bean
public Data dataRepo(@Qualifier("parentInterceptor") ParentInterceptor p) {

}

您可以选择为组件命名:

@Component("foo") 

并相应地更改@Qualifier。