欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springbootAOP定義切點獲取/修改請求參數(shù)方式

 更新時間:2024年08月27日 08:38:06   作者:Yonu  
這篇文章主要介紹了springbootAOP定義切點獲取/修改請求參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

AOP介紹

1.六種通知方式

  • 環(huán)繞通知:在目標(biāo)方法執(zhí)行前和執(zhí)行后實施增強,可用于日志記錄,事務(wù)處理等
  • 前置通知:在目標(biāo)方法執(zhí)行前實施增強,可用于權(quán)限管控等
  • 后置返回通知:在目標(biāo)方法成功執(zhí)行后實施增強,可用于關(guān)閉流,刪除臨時文件等
  • 后置通知:在目標(biāo)方法執(zhí)行后實施增強(無論方法是否發(fā)生異常都執(zhí)行),可用于釋放資源
  • 異常通知:在目標(biāo)方法拋出異常時實施增強,可用于處理異常,記錄日志等
  • 引入通知:在目標(biāo)類中添加一些方法和屬性,用于修改目標(biāo)類

2.AspectJ相關(guān)注解

  • @Aspect:用于定義一個切面,注解在切面類上
  • @Pointcut:用于定義切點表達(dá)式,在使用時,需要定義一個切入點方法,該方法返回值為void,且方法體為空的普通方法
  • @Before:用于定義前置通知,通常為其指定value屬性,該值可以是已有切入點,也可以定義切點表達(dá)式
  • @AfterReturning:用于定義后置返回通知,通常為其指定value屬性,該值可以是已有切入點,也可以定義切點表達(dá)式
  • @Around:用于定義環(huán)繞通知,通常為其指定value屬性,該值可以是已有切入點,也可以定義切點表達(dá)式
  • AfterThrowing:用于定義異常通知,通常為其指定value屬性,該值可以是已有切入點,也可以定義切點表達(dá)式。另外還有一個 throwing屬性用于訪問目標(biāo)方法拋出的異常,該屬性值與異常通知方法中同名的形參一致
  • After:用于定義后置最終通知,通常為其指定value屬性,該值可以是已有切入點,也可以定義切點表達(dá)式

定義切入點的兩種方式

1.注解

//定義注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SafetyHarness {
    String defaultValue() default "";
}
//切入點
@Pointcut("@annotation(com.xx.xx.xx.web.annotation.SafetyHarness)")
    public void efficacyParameters(){
    }

2.表達(dá)式

//該controller所有方法,可以直接指定
/*
execution():表達(dá)式主體
第一個 * 表示返回類型,使用*表示所有類型,該 * 與包名之間有一個空格
第二個 * 表示類名
第三個 * 表示方法名
..表示任意參數(shù)
*/
@Pointcut("value = "execution(* com.xx.xx.xx.web.controller.*.* (..)))")
    public void efficacyParameters(){
    }

常用兩種通知獲取參數(shù)

1.@Before

@Before("efficacyParameters()")
    public void beforeEfficacyParameters(JoinPoint joinPoint){
            //獲取請求參數(shù)
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
            Map<String, String[]> parameterMap = request.getParameterMap();
        	//通過參數(shù)名獲取
            Object ext1 = parameterMap.get("ext1");
            Object ext2 = parameterMap.get("ext2");
    }

2.@Around

	@Around("efficacyParameters()")
    public T beforeEfficacyParameters(ProceedingJoinPoint joinPoint){
        	//接口返回結(jié)果,該結(jié)果可在業(yè)務(wù)前或業(yè)務(wù)后執(zhí)行
            Object proceed = joinPoint.proceed();
   			
            Object[] obj = joinPoint.getArgs();
            if (obj == null || obj.length == 0) {
                return T;
            }
           //獲取請求參數(shù) 
            Map<String, Object> fieldsName = getFieldsName(joinPoint);
            Object ext1 = fieldsName.get("ext1");
            //POST請求強轉(zhuǎn)
            SafetyAuditPageVo ext2 = (SafetyAuditPageVo) fieldsName.get("ext");

			//修改請求參數(shù)
			SafetyAuditPageVo vo = (SafetyAuditPageVo) obj[0];
                vo.setXxxx("XXXXXX");
                obj[0] = vo;
                return  joinPoint.proceed(obj);
    }

	private static Map<String, Object> getFieldsName(ProceedingJoinPoint joinPoint) {
      
        Object[] args = joinPoint.getArgs();
        ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        String[] parameterNames = pnd.getParameterNames(method);
        Map<String, Object> paramMap = new HashMap<>(32);
        for (int i = 0; i < parameterNames.length; i++) {
            paramMap.put(parameterNames[i], args[i]);
        }
        return paramMap;
    }

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Component和Configuration注解區(qū)別實例詳解

    Component和Configuration注解區(qū)別實例詳解

    這篇文章主要為大家介紹了Component和Configuration注解區(qū)別實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Spring中的依賴注入DI源碼詳細(xì)解析

    Spring中的依賴注入DI源碼詳細(xì)解析

    這篇文章主要介紹了Spring中的依賴注入DI源碼詳細(xì)解析,Spring的依賴注入(Dependency Injection,DI)是Spring框架核心的一部分,它是實現(xiàn)控制反轉(zhuǎn)(Inversion of Control,IoC)的一種方式,需要的朋友可以參考下
    2023-11-11
  • springboot?security驗證碼的登錄實例

    springboot?security驗證碼的登錄實例

    這篇文章主要介紹了springboot?security驗證碼的登錄實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java SSLContext創(chuàng)建方式

    java SSLContext創(chuàng)建方式

    這篇文章主要介紹了java SSLContext創(chuàng)建方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java與Unix時間戳的相互轉(zhuǎn)換詳解

    Java與Unix時間戳的相互轉(zhuǎn)換詳解

    這篇文章主要為大家詳細(xì)介紹了Java與Unix時間戳的相互轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Spring Boot項目@RestController使用重定向redirect方式

    Spring Boot項目@RestController使用重定向redirect方式

    這篇文章主要介紹了Spring Boot項目@RestController使用重定向redirect方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springboot注解之@Conditional使用解析

    springboot注解之@Conditional使用解析

    這篇文章主要介紹了springboot注解之@Conditional使用解析,conditional 這個英文單詞翻譯過來是有條件的,所以 @Conditional 注解是作為條件存在的,如果滿足配置的條件則執(zhí)行,如果沒有滿足的話就不執(zhí)行,需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實例代碼

    Java實現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實例代碼

    本文主要介紹了Java實現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Java面試題沖刺第十四天--PRC框架

    Java面試題沖刺第十四天--PRC框架

    這篇文章主要為大家分享了最有價值的三道關(guān)于PRC框架的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 一文吃透Spring集成MyBatis

    一文吃透Spring集成MyBatis

    spring能集成很多的框架,是spring一個優(yōu)勢功能,通過集成功能,讓開發(fā)人員使用其他框架更方便,本文將給大家詳細(xì)介紹Spring如何集成MyBatis,,需要的朋友可以參考下
    2023-05-05

最新評論