gpt4 book ai didi

java - 是否可以取消代理 Spring bean?

转载 作者:IT老高 更新时间:2023-10-28 13:50:34 24 4
gpt4 key购买 nike

我有一个 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)并且包含了事务注解,所以生成的代理只兼容接口(interface)A,所以我可以这样做:

@Inject @Named("aImpl")
private A a;

但不能:

@Inject @Named("aImpl")
private AImpl a;

因此,我无法模拟我的依赖关系。

请注意,将 void setSomeDependency(D dependency) 添加到接口(interface) A 不是一个选项,因为它没有商业意义。它也没有使用 proxy-target-class="true",因为它破坏了很多其他 bean(此属性影响上下文中的所有 bean)。

有没有办法取消代理注入(inject)的 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
}

关于java - 是否可以取消代理 Spring bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8121551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com