文档章节

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

宋建国
 宋建国
发布于 2016/08/07 09:03
字数 926
阅读 936
收藏 54

近日整合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类型异常,并且给出了相应的实践代码,在实践过程中大家如果遇到问题可以随时提问。

获取最新文章请扫描下面二维码

© 著作权归作者所有

共有 人打赏支持
宋建国
粉丝 13
博文 127
码字总数 14847
作品 0
闸北
Spring IOC知识点一网打尽!

前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工...

Java3y
05/22
0
0
Spring基础知识汇总 Java开发必看

Spring简介 Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关...

像风一样i
08/14
0
0
Java笔记——看完这个,打通Spring难度系数

写在前面经过一段时间的整理,希望读者看完后对自己的知识点有所帮助。 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc之后,你就可以不再手动创建对象...

简祥
09/14
0
0
spring oxm入门(包含demo)

O/X Mapper 是什么? Spring 3.0 的一个新特性是 O/X Mapper。O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML。它的目的是在 Java 对象(几乎总是一个 plain old Java object,或简...

疯狂的兔子
2014/09/09
0
0
Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的。我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反射创建一个原始的 ...

coolblog.xyz
06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

5whys分析法在美团工程师中的实践

前言 网站的质量和稳定性对于用户和公司来说至关重要,但是在网站的快速发展过程中,由于各种原因导致事故不可避免的发生,这些大大小小的事故对公司难免会造成一些负面的影响,为了避免同类...

Skqing
22分钟前
0
0
Android 接收监听开机完成,并且开机自启动

1,定义一个广播接收者的类 ,并重写抽象方法 public class BootCompleteReceiver extends BroadcastReceiver 2,在Androidmanifest 注册 <receiver android:name=".receiver.BootCompleteRece......

lanyu96
26分钟前
1
0
小程序记录

1、button的边框、角等需要在伪元素after修改去除

originDu
28分钟前
0
0
微博什么技术啊……还说支持八个明星并发出轨,结果…

是的,大家可能都知道了,女神张靓颖结婚了。。 我去,写错了,是————赵丽颖。 为什么我头脑一瞬间出现的是张靓颖,作为一个码农,技术宅,拼音缩小都是 ZLY,博主我真有点傻傻分不清楚了...

Java技术栈
28分钟前
3
0
模块化

1,什么是模块化? 模块化是指将一个复杂的系统分解为多个模块,方便编码。 2,为什么要用模块化? 降低复杂性,降低代码耦合度,部署方便,提高效率。 3,模块化的好处? a,避免命名冲突,减少...

羊皮卷
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部