老师为什么在xml要加<aop:config proxy-target-class="true">这句运行才不报错

老师为什么在xml要加<aop:config proxy-target-class="true">这句运行才不报错

我执行一下代码,报错:

ApplicationContext context = new ClassPathXmlApplicationContext( "classpath:applicationContext.xml" );
UserService userService = (UserService) context.getBean( "userServiceImpl", UserServiceImpl.class );
userService.create();

​报错如下:

Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'userServiceImpl' is expected to be of type 'com.imooc.spring.aop.service.UserServiceImpl' but was actually of type 'com.sun.proxy.$Proxy17'
at org.springframework.beans.factory.support.AbstractBeanFactory.adaptBeanInstance(AbstractBeanFactory.java:417)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:398)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1160)
at com.imooc.spring.aop.application.SpringApplication.main(SpringApplication.java:27)

但是我在xml中<aop:config>标签中添加proxy-target-class="true"这个才不报错,是为什么

http://img1.sycdn.imooc.com//climg/609a6d1f092d4f8816800789.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿园 2021-05-12 19:09:10

同学你好,JDK动态代理是面向接口的代理模式;JDK动态代理只能对实现了接口的类生成代理,而不能针对类;所以如果使用JDK的动态代理,应该注入的是Dao,而不是Dao实现类,

而CGLIB是针对类实现代理;所以如果要使用Dao实现类则需要使用CGLib动态代理;

而xml配置不是默认使用CGLIB动态代理,所以需要通过proxy-target-class="true"设置成CGLib动态代理

同学暂时先记住这两者的区别,关于底层同学可以等知识储备达到一定程度后再来研究

祝学习愉快~


好帮手慕阿园 2021-05-12 11:07:42

 同学你好,因为这里同学使用的是实现类,所以需要设置proxy-target-class="true"

http://img1.sycdn.imooc.com//climg/609b467b090970ca06010135.jpg

同学改成Dao试试,如下

<bean id="userDao" class="com.imooc.spring.aop.dao.UserDao"/>
<bean id="userService" class="com.imooc.spring.aop.service.UserService">
<property name="userDao" ref="userDao"/>
</bean>

祝学习愉快~

  • 提问者 浅梦sky #1

    老师,为什么实现类就要加proxy-target-class="true",加这个是使用CGLib代理,而这个UserDaoImpl实现了UserDao,UserServiceImpl实现了UserService接口,老师视频里面讲过如果目标类实现了接口则spring默认使用jdk动态代理,所以有点不是很理解了

    2021-05-12 17:29:30
  • 提问者 浅梦sky #2

    如果注入的为接口的话会报错

    http://img1.sycdn.imooc.com//climg/609be70d09b068b209540174.jpg

    2021-05-12 22:32:51
  • 好帮手慕阿园 回复 提问者 浅梦sky #3

    同学你好,建议同学才在源码试试,看看下载源码是否报错,如果不报错,建议同学跟源码进行对照下,看看哪里书写有误

    祝学习愉快~

    2021-05-13 09:34:26
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师