情况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动态代理。
但是一般情况下,若采用了注解,不会报这种错误。