<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # 簡介 1. AOP:面向切面(方面)編程,擴展功能不修改源代碼實現 2. AOP采取橫向抽取機制,取代了傳統縱向繼承體系重復性代碼 3. AOP底層使用動態代理實現 * 有接口情況使用動態代理創建接口實現類代理對象 * 沒有接口情況使用動態代理創建類的子類代理對象 ~~~ import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; /** * 使用AOP記錄訪問日志 * 使用@Before在切入點開始處切入內容 * 使用@After在切入點結尾處切入內容 * 使用@AfterReturning在切入點return內容之后切入內容(可以用來對處理返回值做一些加工處理) * 使用@Around在切入點前后切入內容,并自己控制何時執行切入點自身的內容 * 使用@AfterThrowing用來處理當切入內容部分拋出異常之后的處理邏輯 * * 注解: * Aspect:AOP * Component:Bean * Slf4j:可以直接使用log輸出日志 * Order:多個AOP切同一個方法時的優先級,越小優先級越高越大。 * 在切入點前的操作,按order的值由小到大執行 * 在切入點后的操作,按order的值由大到小執行 */ @Aspect @Component @Slf4j @Order(1) public class LogAspect { /** * 線程存放信息 */ ThreadLocal<Long> startTime = new ThreadLocal<>(); /** * 定義切入點 * 第一個*:標識所有返回類型 * 字母路徑:包路徑 * 兩個點..:當前包以及子包 * 第二個*:所有的類 * 第三個*:所有的方法 * 最后的兩個點:所有類型的參數 */ @Pointcut("execution(public * net.codingme.boot.controller..*.*(..))") public void webLog() { } /** * 在切入點開始處切入內容 * * @param joinPoint */ @Before("webLog()") public void doBefore(JoinPoint joinPoint) { // 記錄請求時間 startTime.set(System.currentTimeMillis()); // 獲取請求域 ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); // 記錄請求內容 log.info("Aspect-URL: " + request.getRequestURI().toLowerCase()); log.info("Aspect-HTTP_METHOD: " + request.getMethod()); log.info("Aspect-IP: " + request.getRemoteAddr()); log.info("Aspect-REQUEST_METHOD: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); log.info("Aspect-Args: " + Arrays.toString(joinPoint.getArgs())); } /** * 在切入點之后處理內容 */ @After("webLog()") public void doAfter() { } /** * 在切入點return內容之后切入內容(可以用來對處理返回值做一些加工處理) */ @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { log.info("Aspect-Response: " + ret); Long endTime = System.currentTimeMillis(); log.info("Aspect-SpeedTime: " + (endTime - startTime.get()) + "ms"); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看