私有方法上的方法拦截器

时间:2010-09-02 12:20:59

标签: java spring spring-aop

这是一个问题:我有方法digest(byte[] data)。它应该是私人的,因为我们真的不需要它在课外,但是如果我公开的话,如果它有帮助,我就不会死。
问题是:我可以以某种方式附加拦截器吗?问题是它不像getBean('MyBean').digest()那样被调用,它通过getBean('MyBean').sign(data)调用,其中符号就像是

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

THX。

4 个答案:

答案 0 :(得分:3)

即使该方法是公共的,Spring也不能拦截从包含该方法的对象中生成的方法调用。要实现这一点,您必须使用AspectJ。

答案 1 :(得分:1)

完整的AspectJ voodoo排序,您需要制作截获的方法public。如果您不希望将bean的digest()方法公开为public,但仍希望应用拦截器,那么我建议您重构代码以将摘要逻辑提取到一个单独的类中一个新的摘要界面,并将拦截器应用于该界面。

这有点笨拙,但它确实迫使你把你的顾虑分开,这不是坏事。

答案 2 :(得分:0)

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

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

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

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

private final Digester digester;

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

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

答案 3 :(得分:0)

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

但是,一旦调用最终到达目标对象,任何方法都会调用它自身,,如Digest(Data),将针对此引用调用,而不是代理< /强>

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

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

这完全将你的代码耦合到Spring AOP,它使类本身意识到它正在AOP上下文中使用,它在AOP面前飞行。