老师,我在编写自研框架时,使用JDK动态代理生成代理类的话,在进行IOC时会报错

来源:9-11 实现自研框架AOP1.0(四)

weixin_慕仙6522334

2020-09-20

老师,我在编写自研框架时,使用JDK动态代理生成代理类完成逻辑织入后,下一步进行IOC时会报错。

java.lang.IllegalArgumentException: Can not set com.zjc.shop.service.RegisterService field com.zjc.shop.controller.UserController.registerService to com.sun.proxy.$Proxy16

我debug了一下发现是因为在aspect的织入逻辑中把容器里面被代理的bean替换成了代理类的bean,但是key还是被代理类class的,因此在进行IOC时会获取到被代理类的Filed字段进行依赖注入,但是代理类的bean好像没有了成员变量,所以报错。想请教一下老师,Spring框架中是如何解决这个问题的?

写回答

2回答

翔仔

2020-09-21

同学好,能否举例说明一下,没太明白同学的意思呢,是说自己引用了自己么 ,有没有相关的代码?

0
0

weixin_慕仙6522334

提问者

2020-09-21

  1. 我有一个bean UserServiceImpl,它需要注入另外一个bean UserMapper

    //img1.sycdn.imooc.com/szimg/5f6828da0971089207210254.jpg

  2. 在AOP的时候我使用代理类的bean Proxy$UserServiceImpl替换了被代理类的bean UserServiceImpl

    //img.mukewang.com/szimg/5f682993092f0f2b09980173.jpg

  3. 最后进行IOC的依赖注入(DI)的时候出错。因为我使用jdk动态代理生成的bean Proxy$UserServiceImpl没有了UserMapper成员变量。

    //img.mukewang.com/szimg/5f682b1809ec870208900226.jpg

    //img.mukewang.com/szimg/5f682cac09aca50205970307.jpg



0
3
慕田峪8546099
回复
weixin_慕仙6522334
你好,你解决了嘛? 我使用CGLIB代理遇到了同样的问题,在给Controller注入Service属性的时候包无法注入的异常,异常信息: Caused by: java.lang.IllegalArgumentException: Can not set com.simple.service.DemoService field com.simple.controller.DemoController.demoService to org.simpleframework.core.annotation.Controller$$EnhancerByCGLIB$$9467a766 at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75) at java.lang.reflect.Field.set(Field.java:764) at org.simpleframework.util.ClassUtil.setField(ClassUtil.java:131) ... 70 more
2023-03-07
共3条回复

剑指Java自研框架,决胜Spring源码

快速入门Spring核心源码+从零开发自研框架

1498 学习 · 495 问题

查看课程