代码之家  ›  专栏  ›  技术社区  ›  foret

私有方法上的方法拦截器

  •  5
  • foret  · 技术社区  · 15 年前

    digest(byte[] data) . 它应该是私有的,因为我们真的不需要它在课堂之外,但是如果我公开它,如果它有帮助的话,我不会死。
    问题是:我能在它上面附加拦截器吗?问题是它不叫like getBean('MyBean').digest() ,它叫通 getBean('MyBean').sign(data) smth的标志是什么

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

    4 回复  |  直到 15 年前
        1
  •  3
  •   Cid54    15 年前

        2
  •  1
  •   skaffman    15 年前

    有点像完整的AspectJ巫毒,你需要让你的拦截方法 public . 如果你不想暴露 digest() 公众的 ,但仍然希望应用拦截器,那么我建议重构代码,将摘要逻辑提取到实现新摘要接口的单独类中,并将拦截器应用到该类中。

    这有点笨拙,但它确实迫使你分离你的关注点,这不是坏事。

        3
  •  0
  •   Eran Harel    15 年前

    另一种实现方法是创建一个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
  •  0
  •   nKn    12 年前

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

    例如Digest(Data),将针对this引用而不是代理调用

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

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

    Spring AOP ,它使类本身意识到它正在AOP上下文中使用的事实,这与AOP是背道而驰的。

    推荐文章