最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文搞懂Spring AOP的五大通知類型

 更新時間:2022年06月17日 08:46:39   作者:倔強(qiáng)的牛角  
本文將詳細(xì)為大家介紹Spring AOP的五種通知類型(前置通知、后置通知、返回通知、異常通知、環(huán)繞通知),感興趣的朋友可以了解一下

一、通知類型

Advice 直譯為通知,也有人翻譯為 “增強(qiáng)處理”,共有 5 種類型,如下表所示。

通知類型注解說明
before(前置通知)@Before通知方法在目標(biāo)方法調(diào)用之前執(zhí)行
after(后置通知)@After通知方法在目標(biāo)方法返回或異常后調(diào)用
after-returning(返回通知)@AfterReturning通知方法會在目標(biāo)方法返回后調(diào)用
after-throwing(異常通知)@AfterThrowing通知方法會在目標(biāo)方法拋出異常后調(diào)用
around(環(huán)繞通知)@Around通知方法會將目標(biāo)方法封裝起來

二、環(huán)境準(zhǔn)備

添加AOP依賴

pom.xml文件里添加Spring AOPAspectJ的jar包依賴

<dependencies>
    <!--包含Spring AOP:有基本的AOP功能-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <!--AspectJ框架有更強(qiáng)大的AOP功能-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>
</dependencies>

創(chuàng)建目標(biāo)接口和實(shí)現(xiàn)類

/*UserDao接口*/
public interface UserDao {
    public void save();
    public int update();
}
/*UserDaoImpl實(shí)現(xiàn)類*/
@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("正在執(zhí)行 UserDao 的 save 方法");
    }
    @Override
    public int update() {
        System.out.println("正在執(zhí)行 UserDao 的 update 方法");
        return 1;
    }
}

創(chuàng)建通知類

創(chuàng)建通知類,并指定切入點(diǎn)

/*通知類*/
@Component//將這個類定義成 Bean
@Aspect//將這個Bean定義為切面
public class MyAdvice {
    //指定UserDao類中的save方法為切入點(diǎn)
    @Pointcut("execution(void com.bighorn.dao.UserDao.save())")
    private void pt1(){}
    //指定UserDao類中的update方法為切入點(diǎn)
    @Pointcut("execution(int com.bighorn.dao.UserDao.update())")
    private void pt2(){}
}

創(chuàng)建Spring核心配置類

/*Spring核心配置類*/
@Configuration
@ComponentScan("com.bighorn") //開啟注解掃描
@EnableAspectJAutoProxy //開啟 AspectJ 的自動代理
public class SpringConfig {
}

編寫運(yùn)行程序

public class App {
    public static void main(String[] args) throws SQLException {
        //獲取配置類初始化容器
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //從容器中獲取UserDao對象
        UserDao userDao = context.getBean(UserDao.class);
        //調(diào)用userDao的方法
        userDao.save();
    }
}

三、添加通知

普通通知

MyAdvice這個通知類中添加前置通知、后置通知、返回后通知異常后通知及相關(guān)注解。

//前置通知
@Before("pt1()")
public void before() {
    System.out.println("before advice ...");
}
//后置通知
@After("pt1()")
public void after() {
    System.out.println("after advice ...");
}
//返回后通知
@AfterReturning("pt1()")
public void afterReturning() {
    System.out.println("afterReturning advice ...");
}
//異常后通知
@AfterThrowing("pt1()")
public void afterThrowing() {
    System.out.println("afterThrowing advice ...");
}

觀察運(yùn)行App程序后的截圖,發(fā)現(xiàn)并沒有顯示異常后通知

手動在save()方法中添加一行代碼:int i = 1/0,造成異常后再次運(yùn)行App。

發(fā)現(xiàn)異常后通知有了,但是運(yùn)行后通知卻消失了。

綜上所述: 前置通知和后置通知是一定會執(zhí)行的,而返回后通知是需要在原始方法正常執(zhí)行后才會被執(zhí)行,異常后通知是需要原始方法拋出異常才會被執(zhí)行

環(huán)繞通知(重點(diǎn))

環(huán)繞通知是非常強(qiáng)大的通知,能夠完成上述四種通知的所有功能。

/**
     * 環(huán)繞通知需要攜帶ProceedingJoinPoint類型的參數(shù)
     * 環(huán)繞通知類似于動態(tài)代理的全過程:ProceedingJoinPoint類型的參數(shù)可以決定是否執(zhí)行目標(biāo)方法
     * 環(huán)繞通知必須要有返回值,返回值即為目標(biāo)方法的返回值
     * @param pjp
     * @return Object
     */
@Around("pt2()")
public Object around(ProceedingJoinPoint pjp) {
    Object result = null;
    try {
        System.out.println("這是環(huán)繞通知中的前置通知......");
        //執(zhí)行目標(biāo)方法
        result = pjp.proceed();
        System.out.println("這是環(huán)繞通知中的返回通知......");
    } catch (Throwable e) {
        System.out.println("這是環(huán)繞通知中的異常通知......");
    }
    System.out.println("這是環(huán)繞通知中的后置通知......");
    return result;
}

修改App類,調(diào)用UserDao的update()方法,運(yùn)行程序,觀察結(jié)果。

public class App {
    public static void main(String[] args) throws SQLException {
        //獲取配置類初始化容器
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //從容器中獲取UserDao對象
        UserDao userDao = context.getBean(UserDao.class);
        //調(diào)用userDao的update方法
        userDao.update();
    }
}

運(yùn)行結(jié)果如下

注意點(diǎn)

使用環(huán)繞通知必須傳入形參ProceedingJoinPoint,并使用pjp.proceed()方法實(shí)現(xiàn)對原始方法的調(diào)用,進(jìn)而實(shí)現(xiàn)原始方法調(diào)用前后同時添加通知

通知中如果未使用使用pjp.proceed()方法實(shí)現(xiàn)對原始方法的調(diào)用,則將跳過原始方法的執(zhí)行

原始方法的返回值類型決定環(huán)繞通知的返回值類型。原始方法若不接收返回值,通知方法的返回值類型可以設(shè)置成void,也可以設(shè)置成Object;如果接收返回值,最好設(shè)定為Object類型。

由于無法預(yù)知原始方法運(yùn)行后是否會拋出異常,因此環(huán)繞通知方法必須要處理Throwable異常

以上就是一文搞懂Spring AOP的五大通知類型的詳細(xì)內(nèi)容,更多關(guān)于Spring AOP通知類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringMVC MVC架構(gòu)與Servlet使用詳解

    SpringMVC MVC架構(gòu)與Servlet使用詳解

    MVC設(shè)計模式一般指 MVC 框架,M(Model)指數(shù)據(jù)模型層,V(View)指視圖層,C(Controller)指控制層。使用 MVC 的目的是將 M 和 V 的實(shí)現(xiàn)代碼分離,使同一個程序可以有不同的表現(xiàn)形式。其中,View 的定義比較清晰,就是用戶界面
    2022-10-10
  • Spring Security使用中Preflight請求和跨域問題詳解

    Spring Security使用中Preflight請求和跨域問題詳解

    這篇文章主要給大家介紹了關(guān)于Spring Security使用中Preflight請求和跨域問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Java中多線程與并發(fā)_volatile關(guān)鍵字的深入理解

    Java中多線程與并發(fā)_volatile關(guān)鍵字的深入理解

    這篇文章主要給大家介紹了關(guān)于Java中多線程與并發(fā)_volatile關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java Arrays.sort()如何實(shí)現(xiàn)對int類型數(shù)組倒序排序

    Java Arrays.sort()如何實(shí)現(xiàn)對int類型數(shù)組倒序排序

    這篇文章主要介紹了Java Arrays.sort()如何實(shí)現(xiàn)對int類型數(shù)組倒序排序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 解決Kibana報錯[security_exception] current license is non-compliant for [security]問題

    解決Kibana報錯[security_exception] current license&nbs

    ElasticSearch 5.1.1因安全許可證過期報錯,解決方法:官網(wǎng)申請新許可證,下載JSON文件并上傳至服務(wù)器,執(zhí)行代碼時切換root權(quán)限,配置host為服務(wù)器IP,端口9200,替換原license文件
    2025-07-07
  • java集合之CopyOnWriteArrayList源碼解析

    java集合之CopyOnWriteArrayList源碼解析

    這篇文章主要介紹了java集合之CopyOnWriteArrayList源碼解析,容器array是volatile修飾的,即set和get方法都是線程安全的,整個添加過程上了鎖,所以整體是通過volatile和lock來保證的線程安全,需要的朋友可以參考下
    2023-12-12
  • Java Mybatis框架增刪查改與核心配置詳解流程與用法

    Java Mybatis框架增刪查改與核心配置詳解流程與用法

    MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO為數(shù)據(jù)庫中的記錄
    2021-10-10
  • springboot整合druid連接池的步驟

    springboot整合druid連接池的步驟

    這篇文章主要介紹了springboot整合druid連接池的步驟,幫助大家更好的理解和學(xué)習(xí)springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • spring中的@Value讀取配置文件的細(xì)節(jié)處理過程

    spring中的@Value讀取配置文件的細(xì)節(jié)處理過程

    這篇文章主要介紹了spring中的@Value讀取配置文件的細(xì)節(jié)處理過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解Java類加載機(jī)制中的雙親委派模型

    詳解Java類加載機(jī)制中的雙親委派模型

    Java的雙親委派模型是一種類加載機(jī)制,它用于保證Java類的安全性和穩(wěn)定性,在這個模型中,當(dāng)一個類需要被加載時,Java虛擬機(jī)會先檢查自己是否已經(jīng)加載了該類,本文就給大家講解一下Java類加載機(jī)制中的雙親委派模型,需要的朋友可以參考下
    2023-09-09

最新評論

澄江县| 时尚| 教育| 溧阳市| 武冈市| 黑山县| 察雅县| 荥经县| 临西县| 绵竹市| 三门峡市| 河东区| 舟山市| 雅江县| 阿图什市| 建宁县| 凉城县| 绍兴市| 无棣县| 徐州市| 岫岩| 河北区| 扎囊县| 莒南县| 金寨县| 图们市| 和顺县| 琼结县| 广宗县| 丹寨县| 赣榆县| 清丰县| 沐川县| 涟水县| 泰宁县| 梁山县| 屯门区| 隆化县| 宁阳县| 平潭县| 尉氏县|