当前位置: 首页 > 面试题库 >

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

谷德本
2023-03-14
问题内容

我有一个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豆(通过getBean())时,有没有办法从java代码中验证豆子是否已经用范围=原型定义了? Spring配置: Java: sc 我可以实例化它两次并比较对象,但是我想避免不必要的对象创建。这个答案的反义词可能会有用:https://stackoverflow.com/a/9125610/156477

  • 问题内容: 我想抢先获取要在中加载的网页的HTML代码,使用正则表达式解析它,并仅显示所需的HTML代码,同时让该网页仍然认为它已加载了所有内容。 有什么方法可以通过或类似方法来做到这一点? 编辑:我尝试过此: 该接口永远不会被调用 问题答案: 不得不使用HttpClient。无需Cookie,只需解析html:

  • 问题内容: 我使用ES6 Promises来管理我的所有网络数据检索,并且在某些情况下需要强制取消它们。 基本上,这种情况是这样的:我在UI上进行了预先输入搜索,在该UI中,将请求委派给后端必须基于部分输入执行搜索。尽管此网络请求(#1)可能需要一点时间,但用户继续输入,最终会触发另一个后端调用(#2) 这里#2自然优先于#1,因此我想取消Promise包装请求#1。我已经在数据层中缓存了所有Pr

  • 出于测试目的,我在Windows Azure中添加了对Azure Active Directory的访问。现在我意识到没有取消订阅的按钮: 正如这里所讨论的,“Office 365的基础目录是Azure Active directory(AAD)。这意味着,如果你有Office 365帐户,那么你在AAD中已经有一个目录或“租户”。” 1)这是否意味着这个特定的订阅一直存在 - 只是不可见? 2)

  • 问题内容: 我已经阅读了关于此的所有问题,但仍然没有找到答案。因此,请勿将其标记为重复项。 我正在将AngularFire与Angular 2和Typescript一起使用。我正在使用从端点提取24条最近记录的列表。这是我的代码: 如预期的那样,这将返回24个最新故事的列表,但是当我使用以下命令将它们呈现在页面上时: 它在顶部显示最旧的故事,在底部显示最新的故事。我了解为什么会这样,但我并不是说这