一.问题分析
1.报错背景
遇到这个问题是在类型转换时,如下:
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
PassApiServiceImpl service = (PassApiServiceImpl) wac.getBean("passApiService");
2.错误分析
2.1 知识点:
Spring AOP实现方式有两种
1:使用JDK动态代理,如果被代理的目标实现了至少一个接口,则会使用JDK动态代理,所有该目标类型实现的接口都将被代理。
2:通过CGLIB来为目标对象创建代理,若该目标对象没有实现任何接口,则创建一个CGLIB代理,创建的代理类是目标类的子类。
2.2 错误分析
那根据我遇到的情况分析,我的PassApiServiceImpl实现了PassApiService接口,aop应该是使用了JDK Proxy。
而报错的原因,是不能用接口的实现类(PassApiServiceImpl)来转换Proxy的实现类,它们是同级,应该用共同的接口(PassApiService)来转换。
二.解决方案
1.使用接口来进行类型转换,将PassApiServiceImpl改为PassApiService。
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
PassApiService service = (PassApiService) wac.getBean("passApiService");
三.其他解决方案
看到有一种解决方案是强制使用CGLIB创建代理,需要引用jar包并修改spring配置文件。我没有使用,有机会再进行了解吧。
网友评论