5

这是一个问题:我有方法digest(byte[] data)。它应该是私有的,因为我们在课堂之外真的不需要它,但是如果我把它公开,我不会死的,如果它有帮助的话。
问题是:我能以某种方式附加拦截器吗?问题是它没有被称为 like getBean('MyBean').digest(),它是通过getBean('MyBean').sign(data)where sign is smth like来调用的

public byte[] sign(byte[] data){
   ...
   b = digest(data);
   ...
   return signature;
}

谢谢。

4

4 回答 4

3

即使该方法是公共的,Spring 也无法拦截从包含该方法的对象中进行的方法调用。为此,您必须使用 AspectJ。

于 2010-09-02T12:42:05.097 回答
1

有点完整的 AspectJ 巫术,你需要让你的拦截方法public。如果您不想将digest()bean 的方法公开为public,但仍想应用拦截器,那么我建议重构代码以将摘要逻辑提取到实现新摘要接口的单独类中,并将拦截器应用于那。

这有点笨拙,但它确实迫使您将关注点分开,这不是坏事。

于 2010-09-02T12:54:28.907 回答
0

实现您想要的另一种方法是创建一个 Digester 类并拦截对它的 digest() 方法的调用:

public interface Digester {
  public Foo digest(byte[] data);
}

class DigesterImpl implements Digester {
  public Foo digest(byte[] data) {...}
}

然后在你的 spring 代码中,你向你的类注入一个代理 DigesterImpl 并调用它:

private final Digester digester;

MyClass(Digester digester) {
  this.digester = digester;
}

public byte[] sign(byte[] data){
   ...
   b = digester.digest(data);
   ...
   return signature;
}
于 2010-09-04T09:04:07.090 回答
0

这里要理解的关键是,在使用Aspect编程时,对该对象引用的方法调用将是对代理的调用,因此代理将能够委托给与该特定对象相关的所有拦截器(建议)方法调用。

但是,一旦调用最终到达目标对象,它可能对自身进行的任何方法调用,例如 Digest(Data),都将针对 this 引用而不是代理调用

这具有重要意义。这意味着自调用不会导致与方法调用相关的建议有机会执行。但是有一种方法可以做到:

public byte[] sign(byte[] data){
   ...
   b = (Digester)AopContext.currentProxy()).Digest(Data);
   ...
   return signature;
}

这完全将您的代码耦合到Spring AOP,并且它使类本身意识到它正在 AOP 上下文中使用,这与 AOP 相悖。

于 2014-03-16T09:57:05.823 回答