私有方法的方法拦截器
这是一个问题:我有方法digest(byte[] data)
。 它应该是私有的,因为我们真的不需要它在课外,但如果我公开它,如果它有帮助,我就不会死。
问题是:我可以以某种方式附加拦截器吗? 问题是它不像getBean('MyBean').digest()
那样调用getBean('MyBean').digest()
,它通过getBean('MyBean').sign(data)
调用getBean('MyBean').sign(data)
,其中符号是smth像
public byte[] sign(byte[] data){ ... b = digest(data); ... return signature; }
谢谢。
即使该方法是公共的,Spring也不能拦截从包含该方法的对象中生成的方法调用。 要实现这一点,您必须使用AspectJ。
完整的AspectJ voodoo,您需要将截获的方法public
。 如果您不希望将bean的digest()
方法public
为public
,但仍希望应用拦截器,那么我建议您重构代码以将摘要逻辑提取到实现新摘要接口的单独类中,并且将拦截器应用于此。
这有点笨拙,但它确实迫使你把你的顾虑分开,这不是坏事。
实现你想要的另一种方法是创建一个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; }
这里要理解的关键是,当使用Aspect
编程时,对该对象引用的方法调用将是对代理的调用,因此代理将能够委托给与之相关的所有拦截器(通知)。特定方法调用。
但是,一旦调用最终到达目标对象,将调用它自己可以进行的任何方法调用, 例如Digest(Data),将针对此引用而不是代理调用 。
这具有重要意义。 这意味着自我调用不会导致与方法调用相关的建议有机会执行。 但有一种方法可以做到:
public byte[] sign(byte[] data){ ... b = (Digester)AopContext.currentProxy()).Digest(Data); ... return signature; }
这完全将您的代码耦合到Spring AOP
,它使类本身意识到它正在AOP上下文中使用,它在AOP面前飞行。