Spring中的aop(1)
阿新 • • 發佈:2018-12-26
Spring中的aop
今天介紹一下Spring aop技術,即面向切面的技術,不知道為什麼,聽著就覺得很牛逼。
一、什麼是aop:
二、為什麼學習 AOP
對程式進行增強:不修改原始碼的情況下.
AOP 可以進行許可權校驗,日誌記錄,效能監控,事務控制
三、Spring 的 AOP 的由來:
AOP 最早由 AOP 聯盟的組織提出的,制定了一套規範.Spring 將 AOP 思想引入到框架中,必須遵守 AOP 聯盟規範
四、底層實現
動態代理機制:
Spring 的 AOP 的底層用到兩種代理機制:
- JDK 的動態代理 :針對實現了介面的類產生代理.
- Cglib 的動態代理 :針對沒有實現介面的類產生代理. 應用的是底層的位元組碼增強的技術 生成當前類的子類物件
cglib
實現MethodInterceptor介面,
Enhancer en=new Enhancer();//幫我們生成代理對,cglib核心類
en.setSuperclass(UserServiceImpl.class);//設定對誰進行代理
en.setCallback(this);//代理要做什麼
實現intercept(...)方法
methodProxy.invokeSuper(proxyObj, args);//放行
總結一點:動態代理即面向介面,cglib即生成當前類的代理子物件
package cn.hncu.proxy;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import cn.hncu.service.UserService;
import cn.hncu.service.UserServiceImpl;
public class UserServiceProxyFactory2 implements MethodInterceptor{
public UserService getUserServiceProxy() {
Enhancer en=new Enhancer();//幫我們生成代理物件
en.setSuperclass(UserServiceImpl.class);//設定對誰進行代理
en.setCallback(this);//代理要做什麼
UserService us = (UserService) en.create();
return us;
}
@Override
public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//開啟事務
System.out.println("開啟事務!");
//呼叫方法
Object returnValue =methodProxy.invokeSuper(proxyObj, args);
//在方法之後提交事務
System.out.println("提交事務!");
return returnValue;
}
}
五、Spring中的aop原理
六、Spting aop專業術語
joinpoint連線點:目標物件中,所有可以增強的方法
pointcut切入點:目標物件,以及增強的方法
advice通知/增強: 增強的程式碼
target目標物件:被代理的物件
weaving織入:將通知應用到切入點的過程
proxy代理:將通知織入到目標物件之後,形成代理物件
AOP中的一個重要等式:
- 切面(aspeect)=切點+通知
- advisor=cutpoint+advice
- 切面: 定義的一個攔截事件(動作)
- 切點: 要攔截哪些(個)類的哪些(個)方法
- 通知: 定義在方法的前面、後面、環繞、出異常 還是 正常返回的時候攔