Java 是否可以取消固定春豆?

Java 是否可以取消固定春豆?,java,spring,Java,Spring,我有一个春豆,比如说: @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="AI

我有一个春豆,比如说:

@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"/>
但不能:

@Inject @Named("aImpl")
private AImpl a;
因此,我不能嘲笑我的依赖性

请注意,将
void setSomeDependency(D dependency)
添加到接口
A
不是一个选项,因为它没有业务意义。它都没有使用代理目标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 4.2.RC1的推出,现在在
Spring测试
模块中有了一个专用的实用程序类,可以为您处理这个案例

该类称为
AopTestUtils
,提供了以下方法:

  • getTargetObject
    (仅打开顶级代理)
  • getUltimateTargetObject
    (如果存在多级代理,则展开它们)

查看相关的以及相应的。

谢谢,你真的救了我。顺便说一句,我刚刚第一次访问奥斯陆,现在我不奇怪你为什么花这么多时间在这里(无意冒犯,但天气不好):)很高兴我能帮忙。我非常喜欢你的评论,甚至在我的个人资料页上引用了它;-)。@skaffman的可能重复:谢谢你指出它,我把这个问题添加到spring标签FAQ中。谢谢你提供了一个更新的答案,这对大多数人来说是一个更好的解决方案,因为它需要更少的逻辑。
def unwrapProxy(a: AnyRef) = a match {
    case advised: Advised if(AopUtils.isAopProxy(advised)) => 
                            advised.getTargetSource.getTarget
    case notProxy => notProxy
}