要注意的地方
SpringAOP 要注意的地方有很多,下面就举一个,之后想到了再列出
来:"
(1)SpringAOP 对于最外层的函数只拦截 public 方法,不拦截
protected 和 private 方法,另外不会对最外层的 public 方法内部调用
的其他方法也进行拦截,即只停留于代理对象所调用的方法。如下案
例:"
B 类有两个 public 方法,foo1()和 foo2(),foo1 内部调用了 foo2,简
单如下:"
Java 代码""
1. publicvoidfoo2(){
2. System.out.println("foo2");
3. }
4.
5. publicvoidfoo1(){
6. System.out.println("foo1");
7. this.foo2();
8. }
假如都对这两个方法进行拦截。当你调用,B 对象.foo1()仅仅对 foo1 整
个方法拦截,对于它内部调用的 foo2()方法不会进行拦截。"
源码分析:"
判断上述 this.foo2()方法是否被拦截的最本质的东西是看 this 到底是谁?
有如下对象 B 类的对象 b,和 cglib 生成的代理对象 bProxy,代理对象
bProxy 内部拥有 b。如果调用 b 对象的任何方法,肯定不会发生任何
拦截,当调用 bProxy 的方法则都会进入拦截函数。"
当我们调用 bProxy 对象的 foo1()方法时,先执行 cglib 之前设置的
callback 对象的 intercept 拦截函数,如下:"
Java 代码""
1. publicObjectintercept(Objectproxy,Methodmethod,Object[]args,Me
thodProxymethodProxy)throwsThrowable{
2. ObjectoldProxy=null;
3. booleansetProxyContext=false;
4. Class<?>targetClass=null;
5. Objecttarget=null;
6. try{
7. if(this.advised.exposeProxy){
8. //Makeinvocationavailableifnecessary.
9. oldProxy=AopContext.setCurrentProxy(proxy);
10. setProxyContext=true;
11. }