Bean named 'XXX' is expected to be of type [XXX] but was actually of type ‘com.sun.proxy.$Proxy11’

情况1

当你在Spring中AOP正确配置好后,出现这种问题,很可能就是因为,在测试时,创建对象的类型为接口的实现类,而不是接口类型
就如我下面这种情况,UserMapperImpl为UserMapper的实现类

UserMapperImpl mapperImpl = context.getBean("u", UserMapperImpl.class);

我们需要将其改为

UserMapper mapperImpl = (UserMapper) context.getBean("u");

为什么会出现这种问题?
因为AOP底层是代理模式的实现,而代理模式,要求被代理的是接口,而不是接口的实现类。

情况2

将配置文件中< aop:aspectj-autoproxy/> 修改成<aop:aspectj-autoproxy proxy-target-class=“true”/>

这么做的原因是什么?那就来解释一下这些参数
解析
<aop:aspectj-autoproxy />声明自动为spring容器中那些配置@AspectJ切面的bean创建代理,织入切面。
<aop:aspectj-autoproxy />的proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强。当配为<aop:aspectj-autoproxy poxy-target-class=“true”/>时,表示使用CGLib动态代理技术织入增强。如果proxy-target-class设置为false,但是目标类没有声明接口,则spring将自动使用CGLib动态代理。

但是一般情况下,若采用了注解,不会报这种错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方圆想当图灵

嘿嘿,小赏就行,不赏俺也不争你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值