Spring框架知识总结-注入Bean的各类异常

近日整合sping和hibernate框架时遇到了一系列的异常,本次主要说明一下spring框架可能出现的异常及解决方案。

我们借助sping强大的bean容器管理机制,通过BeanFactory轻松的实现javabean的生命周期管理,然而在配置管理的时候难免会遇到一些异常:

异常1:No qualifying bean of type […] found for dependency

例如将BeanB自动注入到BeanA

@Component public class BeanA { @Autowired private BeanB dependency; ... }

如果此时BeanB没有定义在sping的Cntextl里,那么在启动时候就会抛出异常: the no such bean definition exception:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.baeldung.packageB.BeanB] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

问题的原因很简单 expected at least 1 bean which qualifies as autowire candidate for this dependency.至少需要要有一个定义的bean来依赖注入。当然还可能存在领一种原因就是,我们在使用注解,配置注解扫描的时候没有设置对包扫描的路径,那么除了这种情况之外就应该是没有定义bean了。

异常2:No qualifying bean of type […] is defined

这个异常的意思就是没有符合的类型Bean.原因是我们定义了两个或者多个相同的bean而不是唯一的bean,例如有一个接口IBeanB,它的两个实现类Bean1和Bean2

@Component public class BeanB1 implements IBeanB { // } @Component public class BeanB2 implements IBeanB { // }

此时如果BeanA注入了接口IBeanB,Spring 就不知道使用哪个实现类来注入

@Component public class BeanA { @Autowired private IBeanB dependency; ... }

此时,BeanFactory就会抛出异常NoSuchBeanDefinitionException

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

从异常 expected single matching bean but found 2”.可以看出未发现唯一的bean。

那么可以通过如下方法来解决

@Component public class BeanA { @Autowired @Qualifier("beanB2") private IBeanB dependency; ... }

sping 就会明确的知道是使用哪个Bean作为注入使用的对象。

异常3:No Bean Named […] is defined

当出现这个异常时,通过名字去Sping上下文查找bean,可能出现异常NoSuchBeanDefinitionException

@Component public class BeanA implements InitializingBean { @Autowired private ApplicationContext context; @Override public void afterPropertiesSet() { context.getBean("someBeanName"); } }

这里在查找时,不存在名字为someBeanName的定义,导致异常

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'someBeanName' is defined

很清晰的指出,不存在此名字的bean定义。

异常4:Proxied Beans

当一个bean在spring上下文中使用JDK动态代理机制,那么代理类不会继承目标对象,但它实现了相同的接口,因为这个原因,如果一个Bean注入了一个接口,那么不会出现问题,但是如果注入了是一个实现的类,Sping容器就会无法找到此时的bean,因为代理类没有继承目标类。一个bean被代理的原因很常见的一个场景就是使用spring的事务支持功能,可以使用注解@Transactional表示事务,也可以在配置文件里设置。

例如如果 ServiceA 注入 ServiceB, 并且同时两个services 都配置了事务 ,通过类注入那么将会出现问题。

@Service @Transactional public class ServiceA implements IServiceA{ @Autowired private ServiceB serviceB; ... } @Service @Transactional public class ServiceB implements IServiceB{ ... }

同样是这两个Services,如果使用接口注入将正常运行。

@Service @Transactional public class ServiceA implements IServiceA{ @Autowired private IServiceB serviceB; ... } @Service @Transactional public class ServiceB implements IServiceB{ ... }

总结一下:

上面主要讲述了几种sping常见的NoSuchBeanDefinitionException类型异常,并且给出了相应的实践代码,在实践过程中大家如果遇到问题可以随时提问。

原文发布于微信公众号 - 架构师之旅(TravelWithFrame)

原文发表时间:2016-08-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐百川的学习频道

做一个自动配置JDK环境变量的Powershell脚本

本来想把这篇的内容包括在我的Powershell系列文章之内的,后来写完之后才想起来,这时候我已经复制粘贴到简书、CSDN和SegmentFault三个地方了。...

2585
来自专栏别先生

Spring的控制反转和依赖注入

Spring的官网:https://spring.io/ Struts与Hibernate可以做什么事?   Struts,     Mvc中控制层解决...

18610
来自专栏数据之美

python 日志模块 logging 详解

Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j 类似。 Python ...

4937
来自专栏java学习

Spring学习笔记5_Spring注解配置Bean

本章目录 Spring学习笔记5_Spring注解配置Bean 1.完成bean注册操作 2.属性依赖注入 3.其他注解 4.Spring在web中开发应用 ...

3265
来自专栏王清培的专栏

spring rest 容易被忽视的后端服务 chunked 性能问题

spring boot 容易被忽视的后端服务 chunked 性能问题 标签(空格分隔): springboot springmvc chunked 背景 sp...

5228
来自专栏JackieZheng

Spring集成RabbitMQ-使用RabbitMQ更方便

如果提到Spring,你脑海中对他的印象还停留在SSH三大框架之一,那或许你该好好重新认识这个家伙。 在IT技术日新月异的今天,他还能让你忘不了并与他朝夕相处,...

2109
来自专栏Linyb极客之路

使用Spring Boot实现模块化

4902
来自专栏菩提树下的杨过

maven学习(上)- 基本入门用法

一、下载及安装 1.1 下载maven 3.1.1 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.1...

2158
来自专栏青玉伏案

JavaEE开发使用Maven管理的SpringMVC工程

前几篇博客已经陆陆续续的聊了一些Spring的东西,今天博客我们就来聊一下SpringMVC。SpringMVC目前在JavaEE开发中可谓占据一席之地,用起来...

23210
来自专栏Java技术栈

一张图搞懂Spring bean的完整生命周期。

一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任何一个环节怎么操...

36410

扫码关注云+社区

领取腾讯云代金券