日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、為什么需要面向切面編程?

面向對象編程(OOP)的好處是顯而易見的,缺點也同樣明顯。當需要為多個不具有繼承關系的對象添加一個公共的方法的時候,例如日志記錄、性能監控等,如果采用面向對象編程的方法,需要在每個對象里面都添加相同的方法,這樣就產生了較大的重復工作量和大量的重復代碼,不利于維護。面向切面編程(AOP)是面向對象編程的補充,簡單來說就是統一處理某一“切面”的問題的編程思想。如果使用AOP的方式進行日志的記錄和處理,所有的日志代碼都集中于一處,不需要再每個方法里面都去添加,極大減少了重復代碼。

二、Spring AOP術語

原來這才是Spring Boot使用AOP的正確姿勢

 

通知(Advice)包含了需要用于多個應用對象的橫切行為,完全聽不懂,沒關系,通俗一點說就是定義了“什么時候”和“做什么”。

連接點(Join Point)是程序執行過程中能夠應用通知的所有點。

切點(Poincut)是定義了在“什么地方”進行切入,哪些連接點會得到通知。顯然,切點一定是連接點。

切面(Aspect)是通知和切點的結合。通知和切點共同定義了切面的全部內容——是什么,何時,何地完成功能。

引入(Introduction)允許我們向現有的類中添加新方法或者屬性。

織入(Weaving)是把切面應用到目標對象并創建新的代理對象的過程,分為編譯期織入、類加載期織入和運行期織入。

三、Spring Boot AOP實戰

3.1 引入依賴

Spring Boot使用AOP需要添加spring-boot-starter-aop依賴,如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

不需要再添加aspectjweaver的依賴了,因為spring-boot-starter-aop包含了aspectjweaver,并且版本是較新的版本,如果再添加老版本(如1.5.4)啟動會報錯。

原來這才是Spring Boot使用AOP的正確姿勢

 

3.2 編寫用于攔截的bean

直接定義一個controller,代碼如下:

@RestController
public class AopController {
    @RequestMApping("/hello")
    public String sayHello(){
        System.out.println("hello");
        return "hello";
    }}

3.3 定義切面

Spring采用@AspectJ注解對POJO進行標注,該注解表明該類不僅僅是一個POJO,還是一個切面。切面是切點和通知的結合,那么定義一個切面就需要編寫切點和通知。在代碼中,只需要添加@Aspect注解即可。

3.3.1 定義切點

切點是通過@Pointcut注解和切點表達式定義的。

@Pointcut注解可以在一個切面內定義可重用的切點。

由于Spring切面粒度最小是達到方法級別,而execution表達式可以用于明確指定方法返回類型,類名,方法名和參數名等與方法相關的部件,并且實際中,大部分需要使用AOP的業務場景也只需要達到方法級別即可,因而execution表達式的使用是最為廣泛的。如圖是execution表達式的語法:

execution表示在方法執行的時候觸發。以“”開頭,表明方法返回值類型為任意類型。然后是全限定的類名和方法名,“”可以表示任意類和任意方法。對于方法參數列表,可以使用“..”表示參數為任意類型。如果需要多個表達式,可以使用“&&”、“||”和“!”完成與、或、非的操作。

原來這才是Spring Boot使用AOP的正確姿勢

 

3.3.2 定義通知

通知有五種類型,分別是:

前置通知(@Before):在目標方法調用之前調用通知

后置通知(@After):在目標方法完成之后調用通知

環繞通知(@Around):在被通知的方法調用之前和調用之后執行自定義的方法

返回通知(@AfterReturning):在目標方法成功執行之后調用通知

異常通知(@AfterThrowing):在目標方法拋出異常之后調用通知

代碼中定義了三種類型的通知,使用@Before注解標識前置通知,打印“beforeAdvice...”,使用@After注解標識后置通知,打印“AfterAdvice...”,使用@Around注解標識環繞通知,在方法執行前和執行之后分別打印“before”和“after”。這樣一個切面就定義好了,代碼如下:

@Aspect
@Component
public class AopAdvice {
    @Pointcut("execution (* com.shangguan.aop.controller.*.*(..))")
    public void test() {    }    @Before("test()")
    public void beforeAdvice() {        System.out.println("beforeAdvice...");
    }    @After("test()")
    public void afterAdvice() {
        System.out.println("afterAdvice...");
    }    @Around("test()")
    public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
        System.out.println("before");
        try {
            proceedingJoinPoint.proceed();
        } catch (Throwable t) {
            t.printStackTrace();
        }        System.out.println("after");
    }}

3.4 啟動測試

完成之后的代碼結構如圖所示:

原來這才是Spring Boot使用AOP的正確姿勢

 

運行AopApplication,在瀏覽器訪問http://localhost:8080/hello,不出意外,控制臺輸出如圖所示:

原來這才是Spring Boot使用AOP的正確姿勢

 

作者:James_Shangguan

原文鏈接:https://www.cnblogs.com/sgh1023/p/13363679.html

分享到:
標簽:Spring Boot AOP
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定