微信公衆號:compassblog
前端歡迎關注、轉發,互相學習,共同進步!spring
有任何問題,請後臺留言聯繫!編程
(1)、什麼是 AOPbash
AOP 爲 Aspect Oriented Programming 的縮寫,意爲「面向切面編程」。AOP 是 OOP (面向對象)的延續,能夠對業務的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性和開發效率。微信
(2)、AOP 思想圖解:橫向重複,縱向切取框架
過濾器ide
攔截器性能
事務管理學習
(3)、AOP 能夠實現的功能ui
權限驗證
日誌記錄
性能控制
事務控制
(4)、AOP 底層實現的兩種代理機制
JDK的動態代理 :針對實現了接口的類產生代理
Cglib的動態代理 :針對沒有實現接口的類產生代理,應用的是底層的字節碼加強的技術生成當前類的子類對象
(1)、 JDK 動態代理加強一個類中方法:被代理對象必需要實現接口,才能產生代理對象。若是沒有接口將不能使用動態代理技術。
public class MyJDKProxy implements InvocationHandler {
private UserDao userDao;
public MyJDKProxy(UserDao userDao) {
this.userDao = userDao;
}
public UserDao createProxy(){
UserDao userDaoProxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this);
return userDaoProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
if("save".equals(method.getName())){
System.out.println("權限校驗============= } return method.invoke(userDao, args); } } 複製代碼
(2)、Cglib 動態代理加強一個類中的方法:能夠對任何類生成代理,代理的原理是對目標對象進行繼承代理。若是目標對象被final修飾,那麼該類沒法被cglib代理。
public class MyCglibProxy implements MethodInterceptor{
private CustomerDao customerDao;
public MyCglibProxy(CustomerDao customerDao){
this.customerDao = customerDao;
}
// 生成代理的方法:
public CustomerDao createProxy(){
// 建立Cglib的核心類:
Enhancer enhancer = new Enhancer();
// 設置父類:
enhancer.setSuperclass(CustomerDao.class);
// 設置回調:
enhancer.setCallback(this);
// 生成代理:
CustomerDao customerDaoProxy = (CustomerDao) enhancer.create();
return customerDaoProxy;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if("delete".equals(method.getName())){
Object obj = methodProxy.invokeSuper(proxy, args);
System.out.println("日誌記錄================");
return obj;
}
return methodProxy.invokeSuper(proxy, args);
}
}
複製代碼
Joinpoint(鏈接點):所謂鏈接點是指那些被攔截到的點。在 spring 中,這些點指的是方法,由於 spring 只支持方法類型的鏈接點
Pointcut(切入點):所謂切入點是指咱們要對哪些 Joinpoint 進行攔截的定義
Advice(通知/加強):所謂通知是指攔截到 Joinpoint 以後所要作的事情就是通知,通知分爲前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)
Introduction(引介):引介是一種特殊的通知,在不修改類代碼的前提下, Introduction 能夠在運行期爲類動態地添加一些方法或 Field
Target(目標對象):代理的目標對象
Weaving(織入):是指把加強應用到目標對象來建立新的代理對象的過程。spring 採用動態代理織入,而 AspectJ 採用編譯期織入和類裝在期織入
Proxy(代理):一個類被 AOP 織入加強後,就產生一個結果代理類
Aspect(切面):是切入點和通知(引介)的結合
您可能還喜歡:
本系列後期仍會持續更新,歡迎關注!
若是你認爲這篇文章有用,歡迎轉發分享給你的好友!
本號文章能夠任意轉載,轉載請註明出處!