spring 深入學習(三)--AOP實現(代碼測試)

前言

之前在學習一中就有提到AoP的作用,但並沒有深入理解。
現在開始深入一下AOP

AOP被稱爲面向切面,二切面也有目標——它必須要完成的工作。在AOP術語中,切面的工作被稱爲通知。

AOP是動態代理(這裏提一下九就好,不然理論太抽象,不懂)
使用AspectJ來實現切面

代碼實現

之前學習了bean裝配,代碼在這邊就不解釋了
spring 深入學習(二)–Bean裝配(代碼測試)

首先有一個接口

public interface IBase {
    void play();
}

裝配輸出一下

package cn.entity;

import org.springframework.stereotype.Component;
@Component
public class staff implements IBase {
    private String  name = "小王";

    @Override
    public void play(){
        System.out.println("name:"+name);
    }
}

定義切面

這些註解需要一個依賴包org.aspectj.lang.annotation.*;
ALt+enter導入就行

使用@Aspect來定義切面

切點

在這裏插入圖片描述

通知方法

 **
 * @After 通知方法會在目標方法返回或拋出異常後調用
 * @AfterReturning 通知方法會在目標方法返回後調用
 * @AfterThrowing 通知方法會在目標方法拋出異常後調用
 * @Around 通知方法會將目標方法封裝起來
 * @Before 通知方法會在目標方法調用之前執行
 * **

代碼

@Aspect
@Component
public class AopConfig {
  
  //  通過@Pointcut註解聲明頻繁使用的切點表達式
    @Pointcut("execution(* cn.entity.IBase.play(..))")
    public void play(){}

    @Before("play()")
    public void hello(){
        System.out.println("hello");
    }
    @AfterReturning("play()")
    public void godBye(){
        System.out.println("godBye");
    }


}

@Component聲明這也是一個bean,能被識別到

需要注意的是,除了註解和沒有實際操作的play()方法,AOPConfig類依然是一個POJO。我們能夠像使用其他的Java類那樣調用 它的方法,它的方法也能夠獨立地進行單元測試,這與其他的Java類並沒有什麼區別。AOPConfig只是一個Java類,只不過它通過註解表明會 作爲切面使用而已。

如果你就此止步的話,AOPConfig只會是Spring容器中的一個bean。即便使用了AspectJ註解,但它並不會被視爲切面,這些註解不會解析, 也不會創建將其轉換爲切面的代理。

代理

如果你使用JavaConfig的話,可以在配置類的類級別上通過使用EnableAspectJ-AutoProxy註解啓用自動代理功能。下

面展現lJavaConfig中啓用自動代理。

@ComponentScan
@EnableAspectJAutoProxy
public class staffConfig {
}

測試

代碼與之前沒什麼不同

看一下結果在輸出
name之前與之後都要
AOPConfig方法輸出,這就是AOP代理的作用,當然這也是一個基礎的作用
當然他的方法還不只這些還有環繞什麼的,這裏只介紹的通過java配置,理解AOP的實現方式。
在這裏插入圖片描述

友情提醒:看的話理解有降低,如果動手敲一遍代碼就有更大的提升

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章