Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 378|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-1 23:50:35 | 显示全部楼层 |阅读模式

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-4 06:51 , Processed in 0.058770 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表