org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘calculatorImpl‘ is exp

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'calculatorImpl' is expected to be of type 'com.zzf.spring6.aop.annoaop.CalculatorImpl' but was actually of type 'jdk.proxy2.$Proxy20' 问题解决

首先看一下类之间的关系这里用的是注解的形式实例化对象

这里实现上边的接口

这里使用前置通知

 这里获取对象调用方法,运行就抛出以上异常

 解决办法

        分析异常

        这个异常是 Spring AOP 中常见的错误之一,通常发生在使用基于接口的 AOP 代理时。

首先,让我们理解一下产生这个异常的原因:

  1. Spring AOP 原理:Spring AOP 默认使用基于 JDK 动态代理来实现切面。当你使用基于接口的目标对象(被代理的类)时,Spring 将使用 JDK 动态代理生成一个代理对象,该代理对象实现了目标对象所实现的所有接口,并将方法调用委托给切面逻辑。
  2. 目标对象类型问题:在你的代码中,你期望从 Spring 容器中获取一个类型为 CalculatorImpl 的 Bean。然而,由于 Spring 使用了 JDK 动态代理,实际上返回的对象类型是 $Proxy20,这是代理对象的类名。
  3. 代理对象类型不匹配:由于代理对象类型不匹配期望的类型,因此在运行时会抛出 BeanNotOfRequiredTypeException 异常。

        解决异常

  • 使用CGLIB代理:如果你确实需要使用目标对象类型而不是接口类型,可以配置 Spring 使用 CGLIB 代理而不是 JDK 动态代理。在配置文件(XML文件)中添加以下代码,强制使用 CGLIB 代理。
<aop:aspectj-autoproxy proxy-target-class="true"/>
  • 类型转换:如果你确定获取的代理对象实际上是 CalculatorImpl 类型,并且你只是想解决类型不匹配的问题,可以尝试进行类型转换。
  • //转换成其接口类型
    Calculator calculator = context.getBean("calculatorImpl", Calculator.class);
    

最终解决问题

注:小白一个,如果有什么不当的地方,请留言谢谢!!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到了一种问题解决方法,当使用Junit单元测试时,如果将待加载到Spring容器中且被@Configuration注解修饰的配置类定义为单元测试类的内部类,会导致解析失败。解决方法是将相关内部类移动到单元测试类的外部。例如,在示例代码中,将Config、Bean1和Bean2类移到TestApplicationContext类的外部。 引用中给出了一个测试AnnotationConfigApplicationContext()方法的示例代码。该代码演示了如何使用AnnotationConfigApplicationContext容器,并通过@Configuration注解定义了一个配置类Config,其中定义了两个Bean:Bean1和Bean2。 引用中提到了一个异常:org.springframework.beans.factory.NoSuchBeanDefinitionException,该异常表示找不到匹配类型的Bean。这可能是因为在Spring容器中找不到与指定的类型匹配的Bean定义。 综上所述,问题中的异常Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo的产生可能是因为在Spring容器中找不到匹配指定类型的Bean。您可以检查您的配置类和组件扫描是否正确,并确保正确加载了所需的Bean定义。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Caused by:org.springframework.beans.factory.NoSuchBeanDefinitionException:No qualifying bean of type](https://blog.csdn.net/qq_38505969/article/details/123751384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer异常](https://download.csdn.net/download/weixin_38642864/12723222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值