spring簡單回顧二
用JDK做代理的前提是被代理對象具有接口,通過代理對象實現被代理對象的接口來進行代理。
用CGLib則沒有這方面的要求,下面看下CGLib的實現:
package com.li.info.manager;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGLibProxyObjectFactory implements MethodInterceptor {
private Object targetObject;
public Object createProxyInstance (Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer(); // 該類用於生成代理對象
enhancer.setSuperclass(this.targetObject.getClass()); // 設置父類
enhancer.setCallback(this); // 設置調用對象爲本身
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
Object retVal;
if (method.getName().equals("add")) {
System.out.println("before method"); //前置
retVal = methodProxy.invoke(targetObject, args);
System.out.println("after method");
}
retVal = method.invoke(targetObject, args);
return retVal;
}
}
Aspect(切面):指橫切性關注點的抽象即爲切面,它與類相似,只是兩者的關注點不一樣,類是對物體特徵的抽象,而切面石堆橫切性關注點的抽象。
jointpoint(連接點):所謂連接點是指那些攔截到的的點,在spring中,這些點指的是方法,因爲spring只支持方法類型的連接點,實際上joinpoint還可以是field或類構造器。
Pointcut(切入點):所謂切入點是指那些我們要對那些joinpoint進行攔截的定義。
Advice(通知):所謂通知是指攔截到jointpoint之前的即爲前置通知,之後的即爲後置通知,異常通知,最終通知,環繞通知。
Target(目標對象):代理的目標對象
Weave(織入):指將aspect應用到target對象並導致proxy對象創建的過程稱爲織入。
Introduction(引入):在不修改類代碼的前提下,Introduction可以在運行期爲類動態地添加一些方法或Field。
使用Spring進行面向切面(AOP)編程
Spring提供了兩種切面的使用方式,實際工作中我們可以選用其中一種:
基於XML配置方式進行AOP開發
基於註解方式進行AOP開發
方法一,基於註解方式聲明切面:
<aop:aspectj-autoproxy />
目的打開aopnnotation 註釋處理器