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文件,从而转型,获取到代理对象

本文标签: 报错Springxxxxxtype