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

Spring中AOP注解@Aspect的使用詳解

 更新時間:2024年01月18日 08:36:43   作者:可以簡單點  
這篇文章主要介紹了Spring中AOP注解@Aspect的使用詳解,AOP是種面向切面的編程思想,面向切面編程是將程序抽象成各個切面,將那些影響了多個類的公共行為抽取到一個可重用模塊里,減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,增強代碼的可操作性和可維護性,需要的朋友可以參考下

AOP思想

AOP(Aspect Oriented Programming)是一種面向切面的編程思想。面向切面編程是將程序抽象成各個切面,即解剖對象的內(nèi)部,將那些影響了多個類的公共行為抽取到一個可重用模塊里,減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,增強代碼的可操作性和可維護性。AOP把軟件系統(tǒng)分為兩個部分:核心關(guān)注點和橫切關(guān)注點。業(yè)務(wù)處理的主要流程是核心關(guān)注點,與之關(guān)系不大的部分是橫切關(guān)注點。橫切關(guān)注點的一個特點是,他們經(jīng)常發(fā)生在核心關(guān)注點的多處,而各處都基本相似。比如權(quán)限認證、日志、事務(wù)處理、增強處理。

AOP的使用場景

權(quán)限認證、日志、事務(wù)處理、增強處理

@Aspect的使用以及基本概念

1.切面類 @Aspect: 定義切面類,加上@Aspect、@Component注解

@Aspect
@Component
//設(shè)置注解執(zhí)行的順序
@Order(2)
public class AnnotationAspectTest 

2.切點 @Pointcut

/**
 * 定義切點,切點為對應(yīng)controller
 */
@Pointcut("execution(public * com.example.zcs.Aop.controller.*.*(..))")
public void aopPointCut(){
}
注:execution表達式第一個*表示匹配任意的方法返回值,第二個*表示所有controller包下的類,第三個*表示所有方法,第一個..表示任意參數(shù)個數(shù)。

3.Advice,在切入點上執(zhí)行的增強處理,主要有五個注解:

@Before  在切點方法之前執(zhí)行

@After  在切點方法之后執(zhí)行

@AfterReturning 切點方法返回后執(zhí)行

@AfterThrowing 切點方法拋異常執(zhí)行

@Around 屬于環(huán)繞增強,能控制切點執(zhí)行前,執(zhí)行后

4.JoinPoint :方法中的參數(shù)JoinPoint為連接點對象,它可以獲取當(dāng)前切入的方法的參數(shù)、代理類等信息,因此可以記錄一些信息,驗證一些信息等;

5.使用&&、||、!、三種運算符來組合切點表達式,表示與或非的關(guān)系;

6.@annotation(annotationType) 匹配指定注解為切入點的方法;

具體代碼實現(xiàn)

1.AopController,用于校驗aop是否生效:
@Controller
@RequestMapping("aop")
public class AopController {
    @RequestMapping("test")
    @ResponseBody
    public String aopTest(User user) {
       // System.out.println(user);
        System.out.println("aop測試");
        return "success";
    }
    @TestAnnotation(flag = false)
    @RequestMapping("aopAnnotationTest")
    @ResponseBody
    public String aopAnnotationTest(User user) {
        // System.out.println(user);
        System.out.println("aopAnnotationTest");
        return "success";
    }
}

2.AspectTest,具體的切面類,用于添加橫切邏輯,切點使用execution表達式進行匹配

@Aspect
@Component
//設(shè)置注解執(zhí)行的順序
@Order(1)
public class AspectTest {
    /**
     * 定義切點,切點為對應(yīng)controller
     */
    @Pointcut("execution(public * com.example.zcs.Aop.controller.*.*(..))")
    public void aopPointCut(){
    }
    @Before("aopPointCut()")
    public void testbefor(JoinPoint joinPoint) {
        illegalParam(joinPoint);
        System.out.println("執(zhí)行方法之前執(zhí)行。。。。。");
    }
    @After("aopPointCut()")
    public void testAfter(JoinPoint joinPoint) {
        //illegalParam(joinPoint);
        System.out.println("執(zhí)行方法之后執(zhí)行。。。。。");
    }
    /**
     *獲取請求參數(shù)
     * @param joinPoint
     * @return
     */
    private static void  illegalParam(JoinPoint joinPoint) {
        if(joinPoint == null){
            return;
        }
        boolean flag = false;
        try{
            // 參數(shù)值
            Object[] args = joinPoint.getArgs();
            if (args != null) {
                for (Object o : args) {
                    System.out.println(o);
                }
            }
        }catch(Exception e){
        }
    }
}

3.AnnotationAspectTest類,具體的切面類,用于添加橫切邏輯,切點指定注解

@Aspect
@Component
//設(shè)置注解執(zhí)行的順序
@Order(2)
public class AnnotationAspectTest {
    /**
     * 定義切點,切點為添加了注解的方法
     */
    @Pointcut("@annotation(com.example.zcs.Aop.annotation.TestAnnotation)")
    public void aopPointCut(){
    }
    @Around("aopPointCut()")
    public Object Around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("AnnotationAspectTest Around start ");
        //獲取注解和注解的值
        TestAnnotation annotation = getAnnotation(point);
       if (annotation != null) {
           boolean flag = annotation.flag();
           System.out.println("注解flags的值:" + flag);
       }
        //獲取參數(shù)
        Object[] args = point.getArgs();
        for (Object arg : args) {
            System.out.println("arg ==>" + arg);
        }
        //去調(diào)用被攔截的方法
        Object proceed = point.proceed();
        return proceed;
    }
    //獲取注解
    public TestAnnotation getAnnotation(ProceedingJoinPoint point) {
        Signature signature = point.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        if (method != null){
            return method.getAnnotation(TestAnnotation.class);
        }
        return null;
    }
}

4.注解類TestAnnotation

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestAnnotation {
    boolean flag() default true;
}

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

相關(guān)文章

  • Java正則表達式API邊界匹配

    Java正則表達式API邊界匹配

    這篇文章主要介紹了Java正則表達式API邊界匹配,文章圍繞主題展開相應(yīng)的相關(guān)資料,具有一定的參考價值,需要的朋友可以參考一下
    2022-06-06
  • SpringMVC整合SpringSession 實現(xiàn)sessiong

    SpringMVC整合SpringSession 實現(xiàn)sessiong

    這篇文章主要介紹了SpringMVC整合SpringSession 實現(xiàn)session的實例代碼,本文通過實例相結(jié)合的形式給大家介紹的非常詳細,需要的朋友參考下吧
    2018-04-04
  • Java Testcontainers庫實現(xiàn)測試功能

    Java Testcontainers庫實現(xiàn)測試功能

    這篇文章主要介紹了Java Testcontainers庫實現(xiàn)測試功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 帶你全面認識Java中的異常處理

    帶你全面認識Java中的異常處理

    在你所寫過的代碼中,你已經(jīng)接觸過一些異常了,我們可以通過一些簡單的代碼讓我們理解一些簡單的異常,下面這篇文章主要給大家介紹了關(guān)于Java中異常處理的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • SpringBoot整合Hashids實現(xiàn)數(shù)據(jù)ID加密隱藏的全過程

    SpringBoot整合Hashids實現(xiàn)數(shù)據(jù)ID加密隱藏的全過程

    這篇文章主要為大家詳細介紹了SpringBoot整合Hashids實現(xiàn)數(shù)據(jù)ID加密隱藏的全過程,文中的示例代碼講解詳細,對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Java?Swing實現(xiàn)自定義按鈕組件的完整代碼

    Java?Swing實現(xiàn)自定義按鈕組件的完整代碼

    本文介紹了Java?Swing按鈕工具類,用于簡化按鈕創(chuàng)建,它封裝了多種按鈕樣式、圖標及事件處理,支持懸停效果,開發(fā)者僅需一行代碼即可創(chuàng)建規(guī)范按鈕,大幅提升開發(fā)效率,文中附有完整源碼
    2026-05-05
  • Java執(zhí)行.bat文件的四種高效方法

    Java執(zhí)行.bat文件的四種高效方法

    在Windows操作系統(tǒng)中,.bat 文件是一種批處理腳本文件,它可以包含一系列命令,用于執(zhí)行特定的任務(wù),在Java開發(fā)中,.bat 文件通常用于簡化Java程序的啟動和執(zhí)行過程,本文給大家介紹了Java執(zhí)行.bat文件的四種高效方法,需要的朋友可以參考下
    2025-08-08
  • 使用Spring CROS解決項目中的跨域問題詳解

    使用Spring CROS解決項目中的跨域問題詳解

    這篇文章主要介紹了使用Spring CROS解決項目中的跨域問題詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java concurrency線程池之線程池原理(一)_動力節(jié)點Java學(xué)院整理

    Java concurrency線程池之線程池原理(一)_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了Java concurrency線程池之線程池原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot項目如何修改Tomcat版本號

    SpringBoot項目如何修改Tomcat版本號

    本文介紹了Spring Boot項目默認使用內(nèi)嵌Tomcat Servlet容器打包部署,通過添加指定版本的Tomcat GA依賴,可以修改默認版本號,對于jar包和war包形式的部署,無需排除內(nèi)置Tomcat,此經(jīng)驗為個人見解,僅供參考
    2026-04-04

最新評論

黄梅县| 牡丹江市| 康平县| 都兰县| 东港市| 石河子市| 张家界市| 泾川县| 鹤山市| 罗田县| 桃江县| 农安县| 方城县| 承德县| 井陉县| 广德县| 博客| 神池县| 泌阳县| 西林县| 弥勒县| 都兰县| 静海县| 兰坪| 会理县| 渝北区| 陆川县| 桃江县| 岫岩| 旬邑县| 定安县| 曲松县| 乐业县| 东海县| 阿巴嘎旗| 蓬莱市| 固安县| 凤阳县| 吴旗县| 潮安县| 资兴市|