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

淺析Spring基于注解的AOP

 更新時間:2022年11月10日 10:07:27   作者:學(xué)習(xí)使我快樂T  
Spring是一個廣泛應(yīng)用的框架,SpringAOP則是Spring提供的一個標(biāo)準(zhǔn)易用的aop框架,依托Spring的IOC容器,提供了極強(qiáng)的AOP擴(kuò)展增強(qiáng)能力,對項目開發(fā)提供了極大地便利

一、準(zhǔn)備工作

①創(chuàng)建一個Maven工程

②添加依賴

在IOC所需依賴基礎(chǔ)上再加入下面依賴即可:

<!-- spring-aspects會幫我們傳遞過來aspectjweaver -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.1</version>
</dependency>

③把上節(jié)的接口和實現(xiàn)類復(fù)制過來,因為我們要在這個環(huán)境里面測試

二、基于注解的AOP之前置通知

如果我們要實現(xiàn)AOP的話,它也是要在我們的IOC的基礎(chǔ)上實現(xiàn)的,所以說我們必須要把切面還有目標(biāo)對象交給IOC容器來管理

AOP 抽橫切關(guān)注點(非核心業(yè)務(wù)代碼)

①創(chuàng)建切面類并配置

/**
 * 在切面中,需要通過指定的注解將方法標(biāo)識為通知方法
 * @Before:前置通知,在目標(biāo)對象方法執(zhí)行之前執(zhí)行
 */
@Component
@Aspect //將當(dāng)前組件標(biāo)識為切面
public class LoggerAspect {
    @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
    public void beforeAdviceMethod() {
        System.out.println("LoggerAspect,前置通知");
    }
}

②創(chuàng)建Spring配置文件,讓ioc對我們的目標(biāo)對象進(jìn)行管理

    <!--
        AOP的注意事項:
        切面類和目標(biāo)類都需要交給IOC容器管理
        切面類必須通過@Aspect注解標(biāo)識為一個切面
        在Spring的配置文件中設(shè)置<aop:aspectj-autoproxy />開啟基于注解的AOP
    -->
    <context:component-scan base-package="com.tian.spring.aop.annotation"></context:component-scan>
    <!--開啟基于注解的AOP-->
    <aop:aspectj-autoproxy/>

測試類:

public class AOPTest {
    @Test
    public void testAOPByAnnotation() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
        Calculator calculator = ioc.getBean(Calculator.class);
        calculator.add(1,2);
    }
}

三、基于注解的AOP之切入點表達(dá)式的語法和重用以及獲取連接點的信息

1.在切面中,需要通過指定的注解將方法標(biāo)識為通知方法

@Before:前置通知,在目標(biāo)對象方法執(zhí)行之前執(zhí)行

2.切入點表達(dá)式:設(shè)置在標(biāo)識通知的value屬性中

execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))

execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))

第一個*表示任意的訪問修飾符和返回值類型

第二個*表示類中任意的方法

..表示任意的參數(shù)列表

類的地方也可以使用*,表示包下所有的類

①切入點表達(dá)式的語法

上述已經(jīng)將我們的前置通知,通過切入點表達(dá)式作用到了我們的連接點上,下面我們來說是細(xì)節(jié)問題,因為我們設(shè)置得還不是很完美,就比如上面實現(xiàn)了后只能作用與我們的add方法,因為我們的切入點表達(dá)式是寫死了的,下面我就來進(jìn)行更完美的代碼實現(xiàn)

將切面類中的切入點表達(dá)式修改為如下

/**
 * 
 * 切入點表達(dá)式:設(shè)置在標(biāo)識通知的value屬性中
 * execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))
 * execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))
 * 第一個*表示任意的訪問修飾符和返回值類型
 * 第二個*表示類中任意的方法
 * ..表示任意的參數(shù)列表
 * 類的地方也可以使用*,表示包下所有的類
 */
@Component
@Aspect //將當(dāng)前組件標(biāo)識為切面
public class LoggerAspect {
//    @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
    @Before("execution(* com.tian.spring.aop.annotation.*.*(..))")
    public void beforeAdviceMethod() {
        System.out.println("LoggerAspect,前置通知");
    }
}

測試類:

public class AOPTest {
    @Test
    public void testAOPByAnnotation() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
        Calculator calculator = ioc.getBean(Calculator.class);
        calculator.sub(1,2);
    }
}

②獲取連接點的信息

獲取連接點的信息

在通知方法的參數(shù)位置,設(shè)置JoinPoint類型的參數(shù),就可以獲取連接點所對應(yīng)方法的信息 獲取連接點所對應(yīng)方法的簽名信息

Signature signature = joinPoint.getSignature();

獲取連接點所對應(yīng)方法的參數(shù)

Object[] args = joinPoint.getArgs();

System.out.println("LoggerAspect,方法:" + signature.getName() + ",參數(shù)" + Arrays.toString(args));

我們在之前的動態(tài)代理里面,我們在前置通知的位置,也就是在我們目標(biāo)對象的方法執(zhí)行之前,然后我們在方法體中輸出的是我們要調(diào)用的方法的方法名,還有就是我們當(dāng)前的參數(shù)列表,但是我們用了前置通知之后,我們不知道如何獲取了,還沒有我們動態(tài)代理實現(xiàn)的功能多。而且連接點的信息我們都獲取不到,也就是我當(dāng)前要加入通知的方法,它的一些信息我們都獲取不到。其實我們也是可以獲取到的,下面我就來實現(xiàn)

//    @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
//    @Before("execution(* com.tian.spring.aop.annotation.*.*(..))")
    @Pointcut("pointCut()")
    public void beforeAdviceMethod(JoinPoint joinPoint) {
        //獲取連接點所對應(yīng)方法的簽名信息
        Signature signature = joinPoint.getSignature();
        //獲取連接點所對應(yīng)方法的參數(shù)
        Object[] args = joinPoint.getArgs();
        System.out.println("LoggerAspect,方法:" + signature.getName() + ",參數(shù)" + Arrays.toString(args));
    }

③重用寫入點表達(dá)式

重用切入點表達(dá)式

//@Pointcut聲明一個公共的切入點表達(dá)式

@Pointcut("execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))") public void pointCut() {}

使用方式:@Pointcut("pointCut()")

聲明

    @Pointcut("execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))")
    public void pointCut() {
    }

引用

    @After("pointCut()")
    public void afterAdviceMethod() {
    }

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

相關(guān)文章

  • springboot項目連接多種數(shù)據(jù)庫該如何操作詳析

    springboot項目連接多種數(shù)據(jù)庫該如何操作詳析

    在Spring Boot應(yīng)用中連接多個數(shù)據(jù)庫或數(shù)據(jù)源可以使用多種方式,下面這篇文章主要給大家介紹了關(guān)于springboot項目連接多種數(shù)據(jù)庫該如何操作的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 將15位身份證補全為18位身份證的算法示例詳解

    將15位身份證補全為18位身份證的算法示例詳解

    這篇文章主要給大家介紹了關(guān)于將15位身份證補全為18位身份證算法的相關(guān)資料,文中通過示例代碼給大家介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請求日志

    Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請求日志

    這篇文章主要介紹了Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請求日志的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot添加AOP日志配置詳解

    springboot添加AOP日志配置詳解

    這篇文章主要介紹了springboot添加AOP日志配置詳解,日志是一種在軟件開發(fā)中常用的技術(shù),用于記錄和跟蹤應(yīng)用程序的運行過程,通過AOP日志,開發(fā)人員可以實時監(jiān)控應(yīng)用程序的行為,包括方法的調(diào)用、參數(shù)的傳遞和返回值的獲取等,需要的朋友可以參考下
    2023-10-10
  • vue3使用vue-diff工具來比較數(shù)據(jù)差異

    vue3使用vue-diff工具來比較數(shù)據(jù)差異

    這篇文章主要為大家詳細(xì)介紹了vue3如何使用vue-diff工具來比較數(shù)據(jù)差異,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Java原生服務(wù)器接收上傳文件 不使用MultipartFile類

    Java原生服務(wù)器接收上傳文件 不使用MultipartFile類

    這篇文章主要為大家詳細(xì)介紹了Java原生服務(wù)器接收上傳文件,不使用MultipartFile類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 聊聊在獲取方法參數(shù)名方面,Spring真的就比Mybatis強(qiáng)?

    聊聊在獲取方法參數(shù)名方面,Spring真的就比Mybatis強(qiáng)?

    在獲取方法參數(shù)名方面,Spring真的就比Mybatis強(qiáng)嗎?今天就帶大家聊聊這個話題,如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot主鍵ID傳到前端后精度丟失的問題解決

    SpringBoot主鍵ID傳到前端后精度丟失的問題解決

    這篇文章主要通過示例為大家詳細(xì)介紹一些SpringBoot如何解決雪花算法主鍵ID傳到前端后精度丟失問題,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • Java異步編程之Callbacks與Futures模型詳解

    Java異步編程之Callbacks與Futures模型詳解

    這篇文章主要為大家詳細(xì)介紹了Java異步編程中Callbacks與Futures模型的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • java N皇后實現(xiàn)問題解析

    java N皇后實現(xiàn)問題解析

    將 n 個皇后擺放在一個 n x n 的棋盤上,使得每一個皇后都無法攻擊到其他皇后,N皇后問題是一個典型的約束求解問題,利用遞歸機(jī)制,可以很快的得到結(jié)果,本文將詳細(xì)介紹,需要了解的朋友可以參考下
    2012-11-11

最新評論

齐齐哈尔市| 庆云县| 太和县| 周至县| 营口市| 中方县| 巴塘县| 泰顺县| 焉耆| 深水埗区| 淮北市| 南开区| 和龙市| 育儿| 凤冈县| 绥德县| 长子县| 仙桃市| 绥阳县| 会泽县| 尉犁县| 乌什县| 铜山县| 新绛县| 长白| 上高县| 石屏县| 玛曲县| 松江区| 河南省| 五峰| 松滋市| 社旗县| 唐海县| 湛江市| 罗江县| 鄂伦春自治旗| 晴隆县| 北辰区| 大余县| 牙克石市|