微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以取消对Spring bean的代理?

如何解决是否可以取消对Spring bean的代理?

尝试这个:

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,可以这样说:

@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?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。