01-Bean对象注入失败(NoSuchBeanDefinitionException)

报错日志如下:

  1. UnsatisfiedDependencyException:
  2. Error creating bean with name 'taskExecuteCancelServiceImpl':
  3. Unsatisfied dependency expressed through field 'taskControlService';
  4. nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
  5. No qualifying bean of type 'com.huawei.ip.TaskControlService' available:
  6. expected at least 1 bean which qualifies as autowire candidate.
  7. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

查看commonTaskMgr的代码:

  1. public class TaskExecuteCancelServiceImpl {
  2. /**
  3. * 任务流程控制
  4. */
  5. @Autowired
  6. private TaskControlService taskControlService;
  7. }

翻译:

  1. 创建名称为'taskExecuteCancelServiceImpl'bean时出错;
  2. 通过字段'taskControlService'查找的bean,不满足依赖关系;
  3. 异常原因是:没有找到指定 Bean Definition
  4. 没有合格的'com.huawei.ip.TaskControlService'类型的Bean
  5. 希望至少有一个这样的bean用于装配(expected at least 1 bean which qualifies as autowire candidate.
  6. Autowired(required=true) 自动装配为ture,就必须有一个

分析:

上述异常是控制台中报出来的,根据其意思是注入的Bean对象不存在,导致此问题的原因主要是看直接原因还是间接原因(也就这几种原因能导致此问题)。

直接原因:

1、Bean对象的注解标签没有添加 ( 如 @Controller, @Service,@Repository等等) 2、XML文件配置的需要检查:注解的扫描是否打开,即在applicationContext.xml 上下文中是否配置了 : 或者 3、如果是注解进行扫描的,需要检查@ComponentScan(“com.huanghe.package”)是否扫描到

间接原因:

1、代码编译问题导致。如,Myeclipse 或其他IDE工具。 这种clean 重新编译即可 2、配置冲突检查web.xml,applicationContext.xml 和aplicationContext-mvc.xml中注解相关配置是否正确。

02-Bean对象注入失败(NoUniqueBeanDefinitionException)

  1. Caused by:
  2. org.springframework.beans.factory.NoUniqueBeanDefinitionException:
  3. No qualifying bean of type [org.baeldung.packageB.IBeanB] is defined:
  4. expected single matching bean but found 2: beanB1,beanB2

仔细看异常信息会发现,并不是直接抛出 NSBDE,而是它的子类 NoUniqueBeanDefinitionException,这是 Spring 3.2.1 之后引入的新异常,目的就是为了和第一种找不到 Bean Definition 的情况作区分。

出现上述异常的代码:

  1. @Component
  2. public class BeanB1 implements IBeanB {
  3. ...
  4. }
  5. @Component
  6. public class BeanB2 implements IBeanB {
  7. ...
  8. }
  1. @Component
  2. public class BeanA {
  3. @Autowired
  4. private IBeanB dependency;
  5. }

解决办法1:

1、利用 @Qualifier 注解,明确指定要注入的 Bean 的名字(BeanB2 默认的名字就是 beanB2)。

  1. @Component
  2. public class BeanA {
  3. @Autowired
  4. @Qualifier("beanB2")
  5. private IBeanB dependency;
  6. }

2、@Primary注解,这样会选择加了 Primary 注解的 Bean 来注入,

  1. @Component
  2. @Primary
  3. public class BeanB1 implements IBeanB {
  4. }