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

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

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

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

例如将BeanB自动注入到BeanAide

@Component
public class BeanA {ui

@Autowired
private BeanB dependency;

}this

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

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类型异常,而且给出了相应的实践代码,在实践过程当中你们若是遇到问题能够随时提问。

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

相关文章
相关标签/搜索