Spring框架系列之AOP思想

微信公衆號:compassblog
前端

歡迎關注、轉發,互相學習,共同進步!spring

有任何問題,請後臺留言聯繫!編程

一、AOP概述

(1)、什麼是 AOPbash

AOP 爲 Aspect Oriented Programming 的縮寫,意爲「面向切面編程」。AOP 是 OOP (面向對象)的延續,能夠對業務的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性和開發效率。微信

(2)、AOP 思想圖解:橫向重複,縱向切取框架

  • 過濾器ide


  • 攔截器性能


  • 事務管理學習


(3)、AOP 能夠實現的功能ui

  • 權限驗證

  • 日誌記錄

  • 性能控制

  • 事務控制

(4)、AOP 底層實現的兩種代理機制

  • JDK的動態代理 :針對實現了接口的類產生代理

  • Cglib的動態代理 :針對沒有實現接口的類產生代理,應用的是底層的字節碼加強的技術生成當前類的子類對象

二、Spring底層AOP實現原理

(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);
    }
}
複製代碼

三、Spring 基於 AspectJ AOP 開發的相關術語

  • Joinpoint(鏈接點):所謂鏈接點是指那些被攔截到的點。在 spring 中,這些點指的是方法,由於 spring 只支持方法類型的鏈接點

  • Pointcut(切入點):所謂切入點是指咱們要對哪些 Joinpoint 進行攔截的定義

  • Advice(通知/加強):所謂通知是指攔截到 Joinpoint 以後所要作的事情就是通知,通知分爲前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)

  • Introduction(引介):引介是一種特殊的通知,在不修改類代碼的前提下, Introduction 能夠在運行期爲類動態地添加一些方法或 Field

  • Target(目標對象):代理的目標對象

  • Weaving(織入):是指把加強應用到目標對象來建立新的代理對象的過程。spring 採用動態代理織入,而 AspectJ 採用編譯期織入和類裝在期織入

  • Proxy(代理):一個類被 AOP 織入加強後,就產生一個結果代理類

  • Aspect(切面):是切入點和通知(引介)的結合

您可能還喜歡:


本系列後期仍會持續更新,歡迎關注!


若是你認爲這篇文章有用,歡迎轉發分享給你的好友!

本號文章能夠任意轉載,轉載請註明出處!


                             掃描關注微信公衆號,瞭解更多

                                    

相關文章
相關標籤/搜索