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类型异常,并且给出了相应的实践代码,在实践过程中大家如果遇到问题可以随时提问。
Spring框架知识总结-注入Bean的各类异常的更多相关文章
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- 采用dom4j和反射模拟Spring框架的依赖注入功能
Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...
- Spring框架(2)---IOC装配Bean(xml配置方式)
IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...
- spring框架之依赖注入(DI)
1. IOC和DI的概念 * IOC -- Inverse of Control,控制反转,将对象的创建权反转给Spring!! * DI -- Dependency Injection,依赖注入,在 ...
- Spring框架的属性注入
1. 对于类成员变量,常用的注入方式有两种 * 构造函数注入(没有空的构造方法注入) * 属性setter方法注入(有空的构造方法注入) 2. 在Spring框架中提供了前两种的属性注入的方式 1. ...
- Spring中如何动态注入Bean实例教程
前言 在Spring中提供了非常多的方式注入实例,但是由于在初始化顺序的不同,基于标注的注入方式,容易出现未被正确注入成功的情况. 本文将介绍一种在实际项目中基于动态的方式来提取Spring管理的Be ...
- Spring框架知识梳理(一) IOC
1 写在前面 Spring框架是在大一的时候学习的,但是经过几个项目下来发现自己只不过会用某些常用的东西,对于Spring家族,虽然现在大都使用Spring Boot开发,但是我发现Spring框架的 ...
- Spring 框架基础(02):Bean的生命周期,作用域,装配总结
本文源码:GitHub·点这里 || GitEE·点这里 一.装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为B ...
- Spring框架是怎么解决Bean之间的循环依赖的 (转)
问题: 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图: 如何理解“依赖”呢,在Spring中有: 构造器循 ...
随机推荐
- showModalDialog-父窗体子窗体
showModalDialog使用例子,父窗口向子窗口传递值,子窗口设置父窗口的值,子窗口关闭的时候返回值到父窗口. farther.html --------------------------- ...
- 准备开发一个基于canvas的图表库,记录一些东西(一)
开源的图表库已经有很多了,这里从头写个自己的,主要还是 提高自己js的水平,增加复杂代码组织的经验 首先写一个画图的库,供以后画图表使用.经过2天的开发,算是能拿出点东西了,虽然功能还很弱,但是有了一 ...
- ssh登陆设置快捷方式
在自己的环境下配置 ~/.ssh/config Host k231 HostName 192.168.1.231 User kyee 原来ssh 登陆192.168.1.231 的命令是 ssh ky ...
- 深度围观block:第三集
深度围观block:第三集 发布于:2013-07-12 10:09阅读数:7804 本文是深度围观block的第三篇文章,也是最后一篇.希望读者阅读了之后,对block有更加深入的理解,同时也希望之 ...
- UICollectionView 讲解-备
什么是UICollectionView UICollectionView是一种新的数据展示方式,简单来说可以把他理解成多列的UITableView(请一定注意这是UICollectionView的最最 ...
- Android实现三级联动下拉框 下拉列表spinner
Android实现(省.市.县)三级联动下拉框 下拉列表spinner 转载请注明出处: http://www.goteny.com/articles/2013/11/46.html http://w ...
- Linux iptables 应用控制访问SSH服务
Title:Linux iptables 应用控制访问SSH服务 --2012-02-23 17:51 今天用到了以前从来没有用到过的,iptables控制访问,只允许外部访问SSH服务(22号端口 ...
- Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记
2016年,.net 会有很多大更新 ASP.NET 5 在此之前我都是用着古老的.net做开发的 (WebForm + IIS) 为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC ...
- Eric Pement的单行awk命令收集
超实用的. awk1line_zh-CN.txt 可惜中文版的网址好像不能访问了.. HANDY ONE-LINE SCRIPTS FOR AWK 30 April 2008 Compiled by ...
- Activity的四种状态
Running状态:一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态.Paused状态:当Activity被另一个透明或者Dialog样式的A ...