栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

模拟CGLIB代理服务的属性不起作用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

模拟CGLIB代理服务的属性不起作用

Short answer

你必须解开代理并在目标对象上设置字段:

ReflectionTestUtils.setField(unwrapFooService(), "fooDao", mockFooDao);

在unwrapFooService()可被定义为如下:

private FooServiceImpl unwrapFooService() {  if(AopUtils.isAopProxy(fooService) && fooService instanceof Advised) {      Object target = ((Advised) fooService).getTargetSource().getTarget();      return (FooServiceImpl)target;  }  return null;}

…long one

这个问题很复杂,但是可以解决。你已经猜到这是使用CGLIB代理的副作用。原则上,Spring创建你的

FooServiceImpl
名为的子类,类似于
FooServiceImpl$EnhancerByCGLIB
。该子类包含对原始以及所有字段的引用(这是可以理解的-这是一个子类)。
FooServiceImplFooServiceImpl

因此实际上有两个变量:

FooServiceImpl$EnhancerByCGLIB.fooDao
FooServiceImpl.fooDao
。你分配一个模拟前者,但你的服务使用后者。我写了前段时间关于这个陷阱。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390601.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号