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

SpringAop中的Advice通知實例

 更新時間:2023年09月25日 11:06:53   作者:至學者  
這篇文章主要介紹了SpringAop中的Advice通知詳解,Spring的AOP功能中一個關鍵概念是通知Advice與切點Pointcut表達式相關聯(lián)在特定節(jié)點織入一些邏輯,Spring提供了五種類型的通知,需要的朋友可以參考下

一 概述

  • @Before:前置通知
  • @After :后置通知,方法執(zhí)行完之后
  • @AfterReturning:返回通知,完成執(zhí)行之后
  • @AfterThrowing:異常通知,拋出異常之后
  • @Around:環(huán)繞通知

二 Advice應用實例

通過環(huán)繞通知獲取方法執(zhí)行時間

@Component
@Aspect
public class RepositoryAspect {
    @Pointcut("execution(* com.repository..*(..))")
    private void crud() {
    }
    //環(huán)繞通知
    @Around("crud()")
    public Object logPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTimes = System.currentTimeMillis();
        Object result = null;
        String name = "-";
        try {
            name = joinPoint.getSignature().toShortString();
            result = joinPoint.proceed();
            return result;
        } catch (Throwable t) {
            throw t;
        } finally {
            long duration = System.currentTimeMillis() - startTimes;
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(name);
            System.out.println(stringBuilder+"執(zhí)行時間為"+duration)
        }
    }
}
public class AbstractAspect {
	protected ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
	protected ThreadLocal<Map<String, Object>> getThreadLocal(){
		if (threadLocal.get() == null){
			threadLocal.set(new HashMap<>());
		}
		return threadLocal;
	}
}
@Component
@Aspect
public class ControllerAspect extends AbstractAspect {
    //對于controller包下所有類和方法進行獲取,除被注解NoHealth標注的類除外。
    @Pointcut("execution(* com.controller..*(..))&&!@annotation(NoHealth)")
    private void controllerPointCut() {
    }
    //在方法執(zhí)行之前對參數(shù)進行處理 
    @Before(value = "controllerPointCut()")
    public void doBefore(JoinPoint joinPoint) {
        try {
            getThreadLocal().get().put(joinPoint.getSignature().toString(), System.currentTimeMillis());
            Object[] args = joinPoint.getArgs();
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            String[] parameterNamesArray = methodSignature.getParameterNames();
            int i = 0;
            List<String> argsList = new ArrayList<>();
            if (!ObjectUtils.isEmpty(args)) {
                for (Object object : args) {
                    if (ObjectUtils.isEmpty(object)
                            || (object instanceof BeanPropertyBindingResult)
                            || (object instanceof HttpServletResponse)
                            || (object instanceof Boolean)
                            || (object instanceof String)
                            || (object instanceof Integer)) {
                        if ((object instanceof Boolean) || (object instanceof String) || (object instanceof Integer)) {
                            StringBuilder stringBuilder = new StringBuilder();
                            stringBuilder.append("{\"");
                            stringBuilder.append(parameterNamesArray[i]);
                            stringBuilder.append("\":\"");
                            stringBuilder.append(object);
                            stringBuilder.append("\"}");
                            argsList.add(JSONObject.fromObject(String.valueOf(stringBuilder)).toString());
                        }
                        i++;
                        continue;//跳出當前循環(huán),且不執(zhí)行此語句后面的語句!
                    }
                    if (!(object instanceof HttpServletRequest)) {
                        argsList.add(JSONObject.fromObject(object).toString());
                    } else {
                        HttpServletRequest request = (HttpServletRequest) object;
                        Enumeration<String> parameterNames = request.getParameterNames();
                        Map<String, String> argsMap = new HashMap<>();
                        while (parameterNames.hasMoreElements()) {
                            String elementName = parameterNames.nextElement();
                            argsMap.put(elementName, request.getAttribute(elementName).toString());
                        }
                        if (!ObjectUtils.isEmpty(argsMap)) {
                            argsList.add(JSONObject.fromObject(argsMap).toString());
                        }
                    }
                    i++;
                }
            }
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(JSONArray.fromObject(argsList));
        } catch (Exception e) {
        }
    }
    //對方法執(zhí)行之后的返回值進行某種操作
    @AfterReturning(value = "controllerPointCut()", returning = "response")
    public void responseLog(JoinPoint joinPoint, Object response) {
        try {
            if (response == null) {
                response = new Object();
            }
            long duration = System.currentTimeMillis() - (Long) threadLocal.get().get(joinPoint.getSignature().toString());
            StringBuilder stringB uilder = new StringBuilder();
            stringBuilder.append(JSONObject.fromObject(response));
        } catch (Exception e) {
        }
    }
    //對方法拋出的異常進行操作
    @AfterThrowing(value = "controllerPointCut()", throwing = "e")
    public void exceptionLog(Exception e) {
    }
}

根據(jù)這些實例就可以參照寫一些簡單的SpringAOP實例了!

到此這篇關于SpringAop中的Advice通知詳解的文章就介紹到這了,更多相關Advice通知內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot使用外置tomcat啟動方式

    springboot使用外置tomcat啟動方式

    這篇文章主要介紹了springboot使用外置tomcat啟動方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Logstash配置Java日志格式的方法小結

    Logstash配置Java日志格式的方法小結

    Logstash 是用于日志收集的開源工具,通常與 Elasticsearch 和 Kibana 一起使用,形成 ELK Stack,Logstash 非常靈活,可以通過配置文件(通常是 .conf 文件)來定義數(shù)據(jù)的輸入、處理和輸出,本文給大家介紹了Logstash配置Java日志格式的方法,需要的朋友可以參考下
    2024-09-09
  • SpringBoot Event實現(xiàn)異步消費機制的示例代碼

    SpringBoot Event實現(xiàn)異步消費機制的示例代碼

    這篇文章主要介紹了SpringBoot Event實現(xiàn)異步消費機制,ApplicationEvent以及Listener是Spring為我們提供的一個事件監(jiān)聽、訂閱的實現(xiàn),內部實現(xiàn)原理是觀察者設計模式,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-04-04
  • springboot2整合redis使用lettuce連接池的方法(解決lettuce連接池無效問題)

    springboot2整合redis使用lettuce連接池的方法(解決lettuce連接池無效問題)

    這篇文章主要介紹了springboot2整合redis使用lettuce連接池(解決lettuce連接池無效問題),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 五種JAVA GUI布局管理的方式

    五種JAVA GUI布局管理的方式

    這篇文章主要介紹了JAVA幾種GUI布局管理的相關知識,文中代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • 完美解決java讀取大文件內存溢出的問題

    完美解決java讀取大文件內存溢出的問題

    下面小編就為大家?guī)硪黄昝澜鉀Qjava讀取大文件內存溢出的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java多線程三種上鎖方式小結

    java多線程三種上鎖方式小結

    本文主要介紹了java多線程三種上鎖方式小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • 利用Java實現(xiàn)網(wǎng)站聚合工具

    利用Java實現(xiàn)網(wǎng)站聚合工具

    互聯(lián)網(wǎng)上有數(shù)以萬億計的網(wǎng)站,每個網(wǎng)站大都具有一定的功能。搜索引擎雖然對互聯(lián)網(wǎng)上的部分網(wǎng)站建立了索引,但是其作為一個大而全的搜索系統(tǒng),無法很好的定位到一些特殊的需求。因此本文將介紹一個用java實現(xiàn)的網(wǎng)站數(shù)據(jù)聚合工具,需要的可以參考一下
    2022-01-01
  • Java序列化反序列化原理及漏洞解決方案

    Java序列化反序列化原理及漏洞解決方案

    這篇文章主要介紹了Java序列化反序列化原理及漏洞解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java實現(xiàn)文件上傳至服務器的方法

    Java實現(xiàn)文件上傳至服務器的方法

    這篇文章主要為大家詳細介紹了Java實現(xiàn)文件上傳至服務器的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論