【问题标题】:Method Interceptor on private methods私有方法上的方法拦截器
【发布时间】:2010-09-02 12:20:58
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 我试图格式化你的代码,但它仍然是非法的。请正确粘贴。

标签: java spring spring-aop


【解决方案1】:

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

【讨论】:

  • 正确,Spring AOP 与动态代理一起工作,这意味着您只能拦截接口中公开的方法,并且代理能够直接委托给公开的方法。
  • 这仅适用于 JDK 动态代理。 Spring AOP 也可以与 CGLIB 子类代理一起工作,在这种情况下,公共方法的自调用就可以正常工作。
  • @Cid54 我无法理解“Spring 无法拦截从包含该方法的对象中进行的方法调用”的意思——你的意思是说 Spring 没有能力如果它们在同一个类中,则从另一个调用一个方法
  • @skaffman 当我们使用 JDK 动态代理时,一个方法不能调用同一类中的其他方法?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    实现你想要的另一种方法是创建一个 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;
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

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

      这完全将您的代码与Spring AOP 耦合在一起,并且它使类本身意识到它是在 AOP 上下文中使用的事实,它与 AOP 背道而驰。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-31
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 2011-04-16
        • 2015-08-14
        相关资源
        最近更新 更多