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)
有没有办法取消固定注入的beana
,以便我可以将其强制转换为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
}