admin管理员组文章数量:1565830
在这里我先放一下报错的代码以及配置文件部分
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("Before/aop.xml");
System.out.println(MathI.class);
MathI math = ac.getBean("mathImpl",MathImpl.class);
math.add(1,1);
}
配置文件部分
<context:component-scan base-package="Before"></context:component-scan>
<!-- 开启aspectJ的代理功能 -->
<aop:aspectj-autoproxy />
解决办法
方法一
在配置文件中加一段代码
<aop:aspectj-autoproxy proxy-target-class="true"/>
方法二
MathI math = ac.getBean(“mathImpl”,MathImpl.class);
这一段代码中的MathImpl.class 改成 mathI.class(mathI是MathImpl的接口,MathImpl是实现类)
原因分析
我们看一下配置文件部分,我们开启了spring的自动代理
代理方式一共有两种JDK代理和cglib代理
spring的自动代理的默认的方式JDK代理,自定义的InvocationHandler引用该对象,然后创建一个代理类 和代理对象,客户端访问的是代理对象,代理对象后再调用实际对象的方法
然后我们再看报错的部分
MathI math = ac.getBean(“mathImpl”,MathImpl.class);
这儿也就是说他要去配置文件里面获取bean,而配置文件里面的bean是一个代理对象,如果在这里使用实现类对象去接收的话,代理对象和实际对象是兄弟关系,不能相互转换,所以会报错,应该使用他们共同的接口去接收该代理对象,从而获取到代理对象,调用方法进行下一步操作
所以再看两种解决方案
第一种改成true也就是使用Cglib动态代理来解决这个问题
第二种则是改成接口的class文件,从而转型,获取到代理对象
版权声明:本文标题:Spring报错--xx but was actually of type xxx 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726602063a1077148.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论