解決spring使用動態代理類型轉換失敗的問題--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
今天在學習spring aop中的動態代理時,碰到了一個類型轉換的問題:java.lang.ClassCastException: com.sun.proxy.$Proxy8 cannot be cast to com.bjsxt.service.UserServiceImpl01_AOP.
首先介紹一下spring的動態代理。
spring使用的動態代理有兩種:JDK Proxy 和CGLIB。使用前者必須實現至少一個接口才能實現對方法的攔截。使用后者需要兩個jar包:asm.jar和cglib.jar,並修改spring配置文件。
我在測試時使用了JDK Proxy,經過查找資料找到了問題的原因。下面是我的測試用例:
ApplicationContext ac = new ClassPathXmlApplicationContext("./com/bjsxt/springconfig/annotation_01_AOP.xml");
UserServiceImpl01_AOP userService = (UserServiceImpl01_AOP)ac.getBean("userServiceImpl01_AOP");
userService.method3();
原因:紅色部分即為報錯的根源。不能用接口的實現類(UserServiceImpl01_AOP)來轉換Proxy的實現類,它們是同級,應該用共同的接口來轉換。將紅色代碼修改:
UserService01_AOP userService = (UserService01_AOP)ac.getBean("userServiceImpl01_AOP");//UserService01_AOP是接口
修改之后,程序運行正常。
讀者可以了解一下JDK Proxy的工作原理,然后會很容易理解這個錯誤出現的原因。