<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 一、AOP * **連接點(Join point)** 表示你想在什么地方插代碼,比如方法執行的地方或者處理異常的地方; * **切入點(Pointcut)** 用來匹配一堆連接點; * **通知(Advice)** 在連接點上執行的代碼; * **切面(Aspect)** 切面文件里具體指明在哪個切入點執行什么通知(Advice) * **引入(Introduction)** 給類新增方法或者成員 * **目標對象(Target object)** 在誰身上切 * **織入(weaving)** 將切面和目標對象綁一塊兒 通知(Advice)的運行方式還有好幾種: * 連接點之前 * 連接點之后 * 圍繞連接點 * 發生異常的時候 * 管它正常還是異常 ## 二、引入步驟 在pom中引入依賴; ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` >[danger] 當我們需要使用CGLIB來實現AOP的時候,需要配置spring.aop.proxy-target-class=true,不然默認使用的是標準Java的實現。 ## 三、使用方法 使用@Aspect注解將一個java類定義為切面類; 使用@Pointcut定義一個切入點,可以是一個規則表達式,也可以是一個注解等; 使用@Before在切入點開始處切入內容(基于切入點來定義); 使用@After在切入點結尾處切入內容(基于切入點來定義); 使用@AfterReturning在切入點return內容之后切入內容(可以用來對處理返回值做一些加工處理); 使用@Around在切入點前后切入內容,并自己控制何時執行切入點自身的內容; 使用@AfterThrowing用來處理當切入內容部分拋出異常之后的處理邏輯; ### **@Pointcut** execution:用于匹配方法執行的連接點 within:用于匹配指定類型內的方法執行 this:用于匹配當前AOP代理對象類型的執行方法;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口也* 類型匹配 target:用于匹配當前目標對象類型的執行方法;注意是目標對象的類型匹配,這樣就不包括引入接口也類型匹配 args:用于匹配當前執行的方法傳入的參數為指定類型的執行方法 @within:用于匹配所以持有指定注解類型內的方法 @target:用于匹配當前目標對象類型的執行方法,其中目標對象持有指定的注解 @args:用于匹配當前執行的方法傳入的參數持有指定注解的執行 @annotation:用于匹配當前執行方法持有指定注解的方法 bean:Spring AOP擴展的,AspectJ沒有對于指示符,用于匹配特定名稱的Bean對象的執行方法 ## 四、注意事項 1、切面中定義基本類型會有同步問題(多線程調用),使用ThreadLocal來解決; 2、使用@Order(seq)注解來標識切面的優先級,seq的值越小,優先級越高,在切入點前的操作,按order的值由小到大執行;在切入點后的操作,按order的值由大到小執行; ## 五、例子 ``` @Aspect @Order(1) @Component public class RayLoggerAspect { private Logger logger = LoggerFactory.getLogger(this.getClass()); private ThreadLocal<Long> mehtodStartTime = new ThreadLocal<>();// 這里定義基本類型會有同步問題 /** * 定義的切入點為org.ray包下面的所有函數; */ @Pointcut("execution(public * org.ray.rayframework.system.controller..*.*(..))") public void logPoint() { } /** * 通過@Before實現,對請求內容的日志記錄 * @param joinPoint * @throws Throwable */ @Before("logPoint()") public void doActionBefore(JoinPoint joinPoint) throws Throwable { mehtodStartTime.set(System.currentTimeMillis()); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes != null) { HttpServletRequest request = attributes.getRequest(); logger.error("request url is{}" + request.getRequestURL().toString()); logger.error("request ip is{}" + request.getRemoteAddr()); logger.error("request parameters is{}" + Arrays.toString(joinPoint.getArgs())); } } /** * 通過@AfterReturning 記錄請求返回的對象 * @param returnObject * @throws Throwable */ @AfterReturning(returning = "returnObject", pointcut = "logPoint()") public void doActionAfterReturning(Object returnObject) throws Throwable { logger.warn("returnObject is {} " + returnObject); logger.warn("method cost time is {} " + (System.currentTimeMillis() - mehtodStartTime.get())); } } ```
                  <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>

                              哎呀哎呀视频在线观看