久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      Spring AOP 注解詳解

      Spring AOP 注解詳解

      切面:Aspect

      切面=切入點(diǎn)+通知。在老的spring版本中通常用xml配置,現(xiàn)在通常是一個(gè)類帶上@Aspect注解。切面負(fù)責(zé)將 橫切邏輯(通知) 編織 到指定的連接點(diǎn)中。

      目標(biāo)對象:Target

      將要被增強(qiáng)的對象。

      連接點(diǎn):JoinPoint

      可以被攔截到的程序執(zhí)行點(diǎn),在spring中就是類中的方法。

      切入點(diǎn):PointCut

      需要執(zhí)行攔截的方法,也就是具體實(shí)施了橫切邏輯的方法。切入點(diǎn)的規(guī)則在spring中通過AspectJ pointcut expression language來描述。

      切入點(diǎn)與連接點(diǎn)的區(qū)別:連接點(diǎn)是所有可以被"切"的點(diǎn);切入點(diǎn)是真正要切的點(diǎn)。

      通知:Advice

      針對切入點(diǎn)的橫切邏輯,包含“around”、“before”和“after”等不同類型的通知。

      通知的作用點(diǎn)如其命名:

      • before:在切入點(diǎn)之前執(zhí)行

      • after:在切入點(diǎn)之后執(zhí)行

      • around:在切入點(diǎn)攔截方法,自定義前后,更靈活

      還有一些異常處理的通知,這里不一一舉例

      織入:Weaving

      將切面和目標(biāo)對象連接起來,創(chuàng)建代理對象的過程。spring中用的是動(dòng)態(tài)代理。假如目標(biāo)對象有接口,使用jdk動(dòng)態(tài)代理;否則使用cglib動(dòng)態(tài)代理。

      說了這么多概念,看看代碼實(shí)現(xiàn)可能會使讀者理解的更深刻一些,這里簡單寫一個(gè)通過注解增強(qiáng)方法的AOP-Demo。
      首先是切面類:

      package com.example.demo.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component;  /**  * @author Fcb  * @date 2020/6/20  * @description 切面類=切入點(diǎn)+通知  */ @Aspect @Component public class LogAspect {    //這個(gè)方法定義了切入點(diǎn)   @Pointcut("@annotation(com.example.demo.aop.anno.MyLog)")   public void pointCut() {}    //這個(gè)方法定義了具體的通知   @After("pointCut()")   public void recordRequestParam(JoinPoint joinPoint) {     for (Object s : joinPoint.getArgs()) {       //打印所有參數(shù),實(shí)際中就是記錄日志了       System.out.println("after advice : " + s);     }   }    //這個(gè)方法定義了具體的通知   @Before("pointCut()")   public void startRecord(JoinPoint joinPoint) {     for (Object s : joinPoint.getArgs()) {       //打印所有參數(shù)       System.out.println("before advice : " + s);     }   }    //這個(gè)方法定義了具體的通知   @Around("pointCut()")   public Object aroundRecord(ProceedingJoinPoint pjp) throws Throwable {     for (Object s : pjp.getArgs()) {       //打印所有參數(shù)       System.out.println("around advice : " + s);     }     return pjp.proceed();   } }

      注解:

      package com.example.demo.aop.anno; import java.lang.annotation.*; /**  * @author Fcb  * @date 2020/6/20  * @description  */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface MyLog { }

      目標(biāo)類:

      package com.example.demo.aop.target;  import com.example.demo.aop.anno.MyLog; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;  /**  * @author Fcb  * @date 2020/6/20  * @description  */ @RestController public class MockController {    @RequestMapping("/hello")   @MyLog   public String helloAop(@RequestParam String key) {     System.out.println("do something...");     return "hello world";   }  }

      最后是測試類:

      package com.example.demo.aop.target;  import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; /**  * @author Fcb  * @date 2020/6/20  * @description  */ @SpringBootTest class MockControllerTest {   @Autowired   MockController mockController;    @Test   void helloAop() {     mockController.helloAop("aop");   } }

      控制臺結(jié)果:

      around advice : aop
      before advice : aop
      do something…
      after advice : aop

      推薦教程:《Java教程》

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號