是否可以取消对Spring bean的代理?
我有一个Spring bean,可以这样说:
@TransactionAttribute(TransactionAttributeType.REQUIRED) public class AImpl implements A {
public void setSomeDependency(D dependency) {
// This setter DOES NOT BELONG to interface A
}
}
<bean id="aImpl" class="AImpl"/>
现在,我想对其进行集成测试,但是首先,我需要模拟依赖项D
,因为它做了很多事情。由于该AImpl
实现实现了一个接口并包含一个事务注释,因此生成的代理仅与interface
兼容A
,因此我可以这样做:
@Inject @Named("aImpl")private A a;
但不能:
@Inject @Named("aImpl")private AImpl a;
结果,我无法嘲笑我的依赖关系。
请注意,添加void setSomeDependency(D dependency)
到界面A不是一种选择,因为它没有任何商业意义。它都不使用proxy-target-class="true"
,因为它会破坏很多其他bean(此属性会影响上下文中的所有bean)。
有没有办法取消注入的bean的代理A,所以我可以将其转换为AImpl?
回答:
尝试这个:
if(AopUtils.isAopProxy(a) && a instanceof Advised) { Object target = ((Advised)a).getTargetSource().getTarget();
AImpl ai = (AImpl)target;
}
奖励:在Scala中,我出于相同的目的使用以下等效函数:
def unwrapProxy(a: AnyRef) = a match { case advised: Advised if(AopUtils.isAopProxy(advised)) =>
advised.getTargetSource.getTarget
case notProxy => notProxy
}
以上是 是否可以取消对Spring bean的代理? 的全部内容, 来源链接: utcz.com/qa/412203.html