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 代理时。
首先,让我们理解一下产生这个异常的原因:
- Spring AOP 原理:Spring AOP 默认使用基于 JDK 动态代理来实现切面。当你使用基于接口的目标对象(被代理的类)时,Spring 将使用 JDK 动态代理生成一个代理对象,该代理对象实现了目标对象所实现的所有接口,并将方法调用委托给切面逻辑。
- 目标对象类型问题:在你的代码中,你期望从 Spring 容器中获取一个类型为
CalculatorImpl
的 Bean。然而,由于 Spring 使用了 JDK 动态代理,实际上返回的对象类型是$Proxy20
,这是代理对象的类名。 - 代理对象类型不匹配:由于代理对象类型不匹配期望的类型,因此在运行时会抛出
BeanNotOfRequiredTypeException
异常。
解决异常
- 使用CGLIB代理:如果你确实需要使用目标对象类型而不是接口类型,可以配置 Spring 使用 CGLIB 代理而不是 JDK 动态代理。在配置文件(XML文件)中添加以下代码,强制使用 CGLIB 代理。
<aop:aspectj-autoproxy proxy-target-class="true"/>
- 类型转换:如果你确定获取的代理对象实际上是
CalculatorImpl
类型,并且你只是想解决类型不匹配的问题,可以尝试进行类型转换。 -
//转换成其接口类型 Calculator calculator = context.getBean("calculatorImpl", Calculator.class);
最终解决问题![](https://i-blog.csdnimg.cn/blog_migrate/88a2b117a24e3f40e81ff3db6ccf0ef4.png)
注:小白一个,如果有什么不当的地方,请留言谢谢!!