首頁 > 軟體

Spring深入探索AOP切面程式設計

2022-07-28 14:02:23

AOP概念的引入

傳統的登入原理:

如上圖所示這是一個基本的登入原理圖,但是如果我們想要在這個登入之上新增一些新的功能,比如許可權校驗

那麼我們能想到的就有兩種方法:

①:通過對原始碼的修改實現

②:不通過修改原始碼方式新增新的功能 (AOP)

AOP相關的概念

1、AOP的概述

什麼是AOP的技術?

在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計

AOP是一種程式設計正規化,隸屬於軟工範疇,指導開發者如何組織程式結構

AOP最早由AOP聯盟的組織提出的,制定了一套規範.Spring將AOP思想引入到框架中,必須遵守AOP聯盟的規範

通過預編譯方式或者執行期動態代理實現程式功能的統一維護的一種技術

AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍

生範型

利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可

重用性,同時提高了開發的效率

AOP採取橫向抽取機制,取代了傳統縱向繼承體系重複性程式碼(事務管理、安全檢查、快取)

為什麼要學習AOP,可以在不修改原始碼的前提下,對程式進行增強!!

2、AOP的優勢

執行期間,不修改原始碼的情況下對已有的方法進行增強

優勢:

  • 減少重複的程式碼
  • 提供開發的效率
  • 維護方便

3、AOP的底層原理

JDK的動態代理技術

1、為介面建立代理類的位元組碼檔案

2、使用ClassLoader將位元組碼檔案載入到JVM

3、建立代理類範例物件,執行物件的目標方法

cglib代理技術

為類生成代理物件,被代理類有沒

Spring的AOP技術-組態檔方式

1、AOP相關的術語

Joinpoint(連線點) 類裡面有哪些方法可以增強這些方法稱為連線點

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

Advice(通知/增強)-- 所謂通知是指攔截到Joinpoint之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)

Aspect(切面)-- 是 切入點+通知 的結合,以後咱們自己來編寫和設定的

增強:是對業務功能的擴充

2、基本準備工作

AspectJ是一個面向切面的框架,它擴充套件了Java語言。AspectJ定義了AOP語法,AspectJ實際上是對AOP程式設計思想的一個實踐.

2.1、aop的使用

建立被增強的類:

public class Demo {
    //要增強,成為---->連線點---->切入點
    public void login(){
        //int a=10/0;
        System.out.println("登入。。。");
    }   
}

將目標類設定到Spring中:

<bean id="demo" class="com.qcby.Demo"/>

定義切面類

package com.notice;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect   //表明我們是通知
public class Power {
    //前置通知的方法
    public void authentication(){
        System.out.println("登入前---許可權驗證。。。");
    }
}

在spring.xml中組態檔中定義切面類:

<bean id="power" class="com.notice.Power"/>

在spring.xml中設定切面:

<aop:config>
        <!--aspect:前置通知,在登入前執行-->
        <aop:aspect ref="power">
            <!--前置通知:-->
            <!--method:登入前執行的方法,許可權驗證的方法-->
            <!--pointcut:切入點,之後最終要執行的方法-->
            <!--前置通知:-->
                <aop:before method="authentication" pointcut="execution(public void com.qcby.Demo.login())"/>
        </aop:aspect>
    </aop:config>

測試:

public class DemoTest {
    @Test
    public void demo1(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("Spring.xml");
        Demo demo = (Demo) ac.getBean("demo");
        demo.login();
    }
}

2.2、組態檔的方式的aop5種通知方式

也可以在spring.xml中加入其他通知方式:

<aop:config>
        <!--aspect:前置通知,在登入前執行-->
        <aop:aspect ref="power">
            <!--前置通知:-->
            <!--method:登入前執行的方法,許可權驗證的方法-->
            <!--pointcut:切入點,之後最終要執行的方法-->
            <!--前置通知:-->
                <aop:before method="authentication" pointcut="execution(public void com.qcby.Demo.login())"/>
            <!--後置通知:當方法執行不成功的時候方法不執行-->
                <aop:after-returning method="authenticationEnd" pointcut="execution(public void com.qcby.Demo.login())"/>
            <!--當切入點(登入方法)發生異常的時候執行,沒有異常則不執行:-->
                <aop:after-throwing method="findThrowError" pointcut="execution(public void com.qcby.Demo.login())"/>
            <!--最終通知:無論切入點的方法執行成功與否,最終都執行的通知(增強)-->
                <aop:after method="finallyMethod" pointcut="execution(public void com.qcby.Demo.login())"/>
            <!--環繞通知:在切面前後執行方法-->
                <aop:around method="round" pointcut="execution(public void com.qcby.Demo.login())"/>
        </aop:aspect>
    </aop:config>

3、通知型別註解:用註解的方式加入通知

@Before – 前置通知

@AfterReturing – 後置通知

@Around – 環繞通知(目標物件方法預設不執行的,需要手動執行)

@After – 最終通知

@AfterThrowing – 異常丟擲通知

package com.notice;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect   //表明我們是通知
public class Power {
    //增強的方法:許可權驗證
    //@Before(value="execution(public void com.qcby.Demo.login())")
    //@AfterReturning(value="execution(public void com.qcby.Demo.login())")
    //前置通知
    @Before(value="execution(public void com.qcby.Demo.login())")
    public void authentication(){
        System.out.println("登入前---許可權驗證。。。");
    }
    //後置通知
    @AfterReturning(value="execution(public void com.qcby.Demo.login())")
    public void authenticationEnd(){
        System.out.println("登入後---許可權驗證。。。");
    }
    //發生異常時通知
    @AfterThrowing(value="execution(public void com.qcby.Demo.login())")
    public void findThrowError(){
        System.out.println("登入發現異常了");
    }
    //最終通知
    @After(value="execution(public void com.qcby.Demo.login())")
    public void finallyMethod(){
        System.out.println("最終都執行的通知");
    }
    //環繞通知
    @Around(value="execution(public void com.qcby.Demo.login())")
    public void round(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("在登入之前進行了許可權驗證");
    //之間執行登入的方法
    proceedingJoinPoint.proceed();
    System.out.println("在登入之後進行了許可權驗證");
  }
}

到此這篇關於Spring深入探索AOP切面程式設計的文章就介紹到這了,更多相關Spring AOP內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com