zoukankan      html  css  js  c++  java
  • 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类型异常,并且给出了相应的实践代码,在实践过程中大家如果遇到问题可以随时提问。

  • 相关阅读:
    Android AHandle AMessage
    android java 与C 通过 JNI双向通信
    android 系统给应用的jar
    UE4 unreliable 同步问题
    UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
    UE4 Run On owing Client解析(RPC测试)
    UE4 TSubclassOf VS Native Pointer
    UE4 内容示例网络同步Learn
    UE4 多人FPS VR游戏制作笔记
    UE4 分层材质 Layerd Materials
  • 原文地址:https://www.cnblogs.com/Code-Engineering/p/5745539.html
Copyright © 2011-2022 走看看