1,问题
例子:
public void method1(){
.........
method2();
...........
}
public void method2(){
...............
...............
}
结果:当你调用method1,并且在method1方法里面调用method2方法时,设置在method2上的“拦截/代理”是无效的。
2,原因
我们想想代理模式,代码如下:
public class ProxyObject {
// 被代理的对象
private ProxiedObject proxiedObject
public ProxyObject(proxiedObject proxiedObject) {
this.proxiedObject = proxiedObject;
}
public void method1() {
proxiedObject.method1();
}
}
解释:
在调用代理对象的方法时,内部其实调用的还是真正的实例(proxiedObject)方法。实例方法的method1被调用时,内部调用method2的方式是:this.method2()
,所以调用的是真正的method2,而不是被拦截的method2。
3,如何解决问题
1,可以使用Eclipse基金的AspectJ实现来解决。AspectJ使用编译期字节码织入(weave)的方式,在编译的时候,直接修改类的字节码,把所定义的切面代码逻辑插入到目标类中。而不像Spring是使用代理类的方式来做的。
2,如果想要使用Spring实现的话,可以用下面的方法实现,但这样的代码的耦合性就太强了,是个很差的方案。
public class SimplePojo implements Pojo {
public void foo() {
// this works, but... gah!
((Pojo) AopContext.currentProxy()).bar();
}
public void bar() {
// some logic...
}
}
参考: