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

基于AspectJ注解方式實現(xiàn)AOP

 更新時間:2023年09月08日 10:56:41   作者:96歲對抗java  
這篇文章主要介紹了基于AspectJ注解方式實現(xiàn)AOP,使用AspectJ的注解可以更方便地編寫和管理切面邏輯,而Spring AOP也是使用了AspectJ提供的注解來實現(xiàn)切面編程,需要的朋友可以參考下

基于AspectJ實現(xiàn)AOP(注解方式)

這里我們采用的是非完全注解方式

1. 創(chuàng)建類, 在類里面定義方法(連接點)

package com.ffyc.spring.aop;
//被增強的類(也就是被代理的類)
public class User {
    //被增強的方法(也就是被代理的方法)
    public void add(){
        System.out.println("add...");
    }
}

2. 創(chuàng)建增強類, 編寫增強邏輯

  • 注意: 此時我們并沒有給增強類添加注解來生成代理對象, 也沒有配置通知(增強的邏輯)
package com.ffyc.spring.aop;
//增強類
public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before");
    }
    //這里還有后置通知, 異常通知, 環(huán)繞通知, 最終通知等, 現(xiàn)在邏輯先省略
}

3. 進行通知的配置

①: 在spring配置文件中, 開啟注解掃描與開啟注解自動生成代理對象

  • 注解掃描大家都知道: 就是componentScan
  • 注解自動生成代理對象是什么?
    • 就是開啟了注解自動生成代理對象之后當SpringIOC容器掃描basePackages的時候如果掃描到某個類上面有@Aspect注解, 則會生成該類的代理對象放到SpringIOC容器中由SpringIOC容器管理
      • 所以@Aspect注解就是在增強(通知)類上添加的
<!--    開啟組件掃描, 開啟了組件掃描之后我們的spring容器就會在對應的base-package位置進行一個掃描-->
    <!--    注意: 其實我們的組件掃描也是可以通過使用注解的方式進行配置-->
        <context:component-scan base-package="com.ffyc.spring"></context:component-scan>
<!--    開啟Aspectj自動生成代理對象-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

②: 使用注解創(chuàng)建User和UserProxy類的對象

  • 也就是讓SpringIOC容器幫我們創(chuàng)建
  • 在User類和UserProxy類上加上@Component注解即可
package com.ffyc.spring.aop;
import org.springframework.stereotype.Component;
//被增強的類(也就是被代理的類)
@Component
public class User {
    //被增強的方法(也就是被代理的方法)
    public void add(){
        System.out.println("add...");
    }
}
package com.ffyc.spring.aop;
import org.springframework.stereotype.Component;
//增強類
@Component
public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before");
    }
}

③: 在增強類上面添加注解@Aspect

  • 這里注意: @Aspect注解要和@Component注解一起使用, 原因在最后
package com.ffyc.spring.aop;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
//增強類
@Component
@Aspect
public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before");
    }
}

4. 配置不同類型的通知

  • 在增強類里面, 在作為通知的方法上面添加對應的通知類型的注解, 并使用切入點表達式將對應的通知配置到某個切入點上
    • 這樣Spring底層就會幫我們根據(jù)我們添加的注解來創(chuàng)建代理對象
package com.ffyc.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//增強類
@Component
@Aspect
public class UserProxy {
    @Pointcut(value = "execution(* com.ffyc.spring.aop.User.add(..))")
    private void method(){
    }
    //前置通知
    @Before(value = "execution (* com.ffyc.spring.aop.User.add(..))")
    public void before(){
        System.out.println("before...");
    }
    @AfterReturning(value = "method()")
    public void afterReturning(){
        System.out.println("afterReturning...");
    }
    @After(value = "execution(* com.ffyc.spring.aop.User.add(..))")
    public void after(){
        System.out.println("after...");
    }
    @AfterThrowing(value = "method()")
    public void afterThrowing(){
        System.out.println("afterThrowing...");
    }
    @Around(value = "method()")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("環(huán)繞前...");
        proceedingJoinPoint.proceed();
        System.out.println("環(huán)繞之后...");
    }
}
  • @PointCut注解用來創(chuàng)建一個切入點, 該注解的value屬性(String類型)為切入點表達式
  • @Around, @Before, @After, @AfterReturning, @AfterThrowing注解的value屬性(String類型)都為切入點表達式
  • @AfterThrowing針對的是被代理方法拋出異常, 如果異常在內(nèi)部被解決, 那么并不會執(zhí)行@AfterThrowing通知
  • 我們通過JVM的學習可以知道, 如果方法是通過異常結(jié)束(指拋出異常), 那么肯定就不是正常退出(return), 那么也就意味著@AfterReturning(后置通知), 和@AfterThrowing(異常通知)只能同時觸發(fā)一個
  • @Around注解使用的時候要在參數(shù)位置預留一個ProceedingJoinPoint類型的參數(shù), 最終會通過這個通知類構(gòu)建一個被代理類的代理對象, 這個代理對象是由Spring幫我們創(chuàng)建的, 所以這個通知類也是Spring容器幫我們?nèi)呙璧? 對應的@Around注解標注的方法肯定也是由Spring幫我們調(diào)用的, 而Spring調(diào)用的方法我們可以在參數(shù)位置寫一個形參, 這個時候Spring默認會對該參數(shù)類型進行一個自動裝配(基于類型的自動裝配), 這里就會由Spring幫我們裝配一個ProceedingJoinPoint對象, 我們可以調(diào)用其中的proceed()方法, 調(diào)用proceed()方法就會執(zhí)行切入點方法(被增強的方法)
    • ProceedingJoinPoint : 正在進行的連接點

5. 測試:

package com.ffyc.spring.aop;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAop {
    @Test
    public void testAop(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = applicationContext.getBean("user", User.class);
        System.out.println(user);
        user.add();
    }
}
  • 當我們調(diào)用user對象的add()方法的時候其實會執(zhí)行代理對象的add()方法

各個通知的執(zhí)行順序:

環(huán)繞前[@Around(前)] --> 前置通知[@Before] --> 被增強方法(切入點) --> 環(huán)繞后(@Around(后)) --> 最終通知(@After) --> 后置通知[@AfterReturning] (或者異常通知[@AfterThrowing])

補充:

@Aspect注解為什么要和@Component注解一起使用, 按理將使用一個@Aspect注解不是就已經(jīng)是由SpringIOC榮IQ創(chuàng)建代理對象并交由SpringIOC容器管理了?

**官方文檔解釋如下: **

You may register aspect classes as regular beans in your Spring XML configuration, or autodetect them through classpath scanning - just like any other Spring-managed bean. However, note that the @Aspect annotation is not sufficient for autodetection in the classpath: For that purpose, you need to add a separate @Component annotation (or alternatively a custom stereotype annotation that qualifies, as per the rules of Spring’s component scanner).

翻譯:

您可以在Spring XML配置中注冊aspect類,或者通過類路徑掃描自動檢測它們,就像任何其他Spring管理bean一樣。但是,請注意,@aspect注釋對于在類路徑中自動檢測是不夠的:為了達到這個目的,您需要添加一個單獨的@component注解(或者根據(jù)Spring的組件掃描器的規(guī)則來定義一個定制的原型注解)

到此這篇關(guān)于基于AspectJ注解方式實現(xiàn)AOP的文章就介紹到這了,更多相關(guān)AspectJ實現(xiàn)AOP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Mybatis-Plus攔截器實現(xiàn)MySQL數(shù)據(jù)加解密的示例代碼

    基于Mybatis-Plus攔截器實現(xiàn)MySQL數(shù)據(jù)加解密的示例代碼

    用戶的一些敏感數(shù)據(jù),例如手機號、郵箱、身份證等信息,在數(shù)據(jù)庫以明文存儲時會存在數(shù)據(jù)泄露的風險,因此需要進行加密,解密等功能,接下來本文就給大家介紹基于Mybatis-Plus攔截器實現(xiàn)MySQL數(shù)據(jù)加解密,需要的朋友可以參考下
    2023-07-07
  • SpringCloud的@RefreshScope 注解你了解嗎

    SpringCloud的@RefreshScope 注解你了解嗎

    這篇文章主要介紹了Spring Cloud @RefreshScope 原理及使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-09-09
  • mybatis 實現(xiàn)多條update同時執(zhí)行

    mybatis 實現(xiàn)多條update同時執(zhí)行

    這篇文章主要介紹了mybatis 實現(xiàn)多條update同時執(zhí)行,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • JavaEE idea的smart tomcat插件使用

    JavaEE idea的smart tomcat插件使用

    這篇文章主要介紹了JavaEE idea的smart tomcat插件使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • idea2019.2安裝MybatisCodeHelper插件的超詳細教程

    idea2019.2安裝MybatisCodeHelper插件的超詳細教程

    這篇文章主要介紹了idea2019.2安裝MybatisCodeHelper插件的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • java線程之死鎖

    java線程之死鎖

    這篇文章主要介紹了Java線程之死鎖,死鎖是這樣一種情形-多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止
    2022-05-05
  • 基于Ajax用戶名驗證、服務條款加載、驗證碼生成的實現(xiàn)方法

    基于Ajax用戶名驗證、服務條款加載、驗證碼生成的實現(xiàn)方法

    本篇文章對Ajax用戶名驗證、服務條款加載、驗證碼生成的實現(xiàn)方法,進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • 對dbunit進行mybatis DAO層Excel單元測試(必看篇)

    對dbunit進行mybatis DAO層Excel單元測試(必看篇)

    下面小編就為大家?guī)硪黄獙bunit進行mybatis DAO層Excel單元測試(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 詳解Spring事務和事務傳播機制

    詳解Spring事務和事務傳播機制

    本文主要介紹了MySQL中的事務以及如何在Spring框架中實現(xiàn)事務管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • Java網(wǎng)絡編程之簡單的服務端客戶端應用實例

    Java網(wǎng)絡編程之簡單的服務端客戶端應用實例

    這篇文章主要介紹了Java網(wǎng)絡編程之簡單的服務端客戶端應用,以實例形式較為詳細的分析了java網(wǎng)絡編程的原理與服務器端客戶端的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04

最新評論

大邑县| 自贡市| 高平市| 自贡市| 天津市| 东莞市| 惠州市| 南皮县| 永川市| 琼海市| 肃宁县| 静安区| 玉龙| 安庆市| 凤庆县| 温州市| 毕节市| 图木舒克市| 鹤峰县| 平武县| 中阳县| 上思县| 罗城| 西青区| 秦安县| 丰原市| 镇巴县| 白河县| 渝中区| 高州市| 伊春市| 织金县| 南雄市| 会昌县| 嫩江县| 陆良县| 高州市| 财经| 丽水市| 赤峰市| 平度市|