一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

spring boot-aop的使用

 WindySky 2017-10-25 發(fā)布于廣東

一、添加aop starter依賴

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./xsd/maven-4.0.0.xsd">  
  4.     <modelVersion>4.0.0</modelVersion>  
  5.   
  6.     <groupId>com.chhliu.springboot.aop</groupId>  
  7.     <artifactId>springboot-aop</artifactId>  
  8.     <version>0.0.1-SNAPSHOT</version>  
  9.     <packaging>jar</packaging>  
  10.     <parent>  
  11.         <groupId>org.springframework.boot</groupId>  
  12.         <artifactId>spring-boot-starter-parent</artifactId>  
  13.         <version>1.5.1.RELEASE</version>  
  14.         <relativePath/> <!-- lookup parent from repository -->  
  15.     </parent>  
  16.   
  17.     <properties>  
  18.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  19.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
  20.         <java.version>1.8</java.version>  
  21.     </properties>  
  22.   
  23.     <dependencies>  
  24.         <dependency>  
  25.             <groupId>org.springframework.boot</groupId>  
  26.             <artifactId>spring-boot-starter-web</artifactId>  
  27.         </dependency>  
  28.           
  29.         <dependency><!-- spring boot aop starter依賴 -->  
  30.             <groupId>org.springframework.boot</groupId>  
  31.             <artifactId>spring-boot-starter-aop</artifactId>  
  32.         </dependency>  
  33.   
  34.         <dependency>  
  35.             <groupId>org.springframework.boot</groupId>  
  36.             <artifactId>spring-boot-starter-test</artifactId>  
  37.             <scope>test</scope>  
  38.         </dependency>  
  39.           
  40.         <!--druid -->  
  41.         <dependency>  
  42.             <groupId>com.alibaba</groupId>  
  43.             <artifactId>druid</artifactId>  
  44.             <version>1.0.27</version>  
  45.         </dependency>  
  46.     </dependencies>  
  47.     <build>  
  48.         <plugins>  
  49.             <plugin>  
  50.                 <groupId>org.springframework.boot</groupId>  
  51.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  52.             </plugin>  
  53.         </plugins>  
  54.     </build>  
  55. </project>  
二、配置文件中開啟支持

  1. spring.aop.auto=true  
三、編寫切面

  1. package com.chhliu.springboot.aop.aop;  
  2.   
  3. import java.util.Arrays;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6.   
  7. import org.aspectj.lang.JoinPoint;  
  8. import org.aspectj.lang.ProceedingJoinPoint;  
  9. import org.aspectj.lang.annotation.After;  
  10. import org.aspectj.lang.annotation.AfterReturning;  
  11. import org.aspectj.lang.annotation.AfterThrowing;  
  12. import org.aspectj.lang.annotation.Around;  
  13. import org.aspectj.lang.annotation.Aspect;  
  14. import org.aspectj.lang.annotation.Before;  
  15. import org.aspectj.lang.annotation.Pointcut;  
  16. import org.slf4j.Logger;  
  17. import org.slf4j.LoggerFactory;  
  18. import org.springframework.core.annotation.Order;  
  19. import org.springframework.stereotype.Component;  
  20. import org.springframework.web.context.request.RequestContextHolder;  
  21. import org.springframework.web.context.request.ServletRequestAttributes;  
  22.   
  23. import com.alibaba.druid.support.json.JSONUtils;  
  24.   
  25. @Component // 注冊到Spring容器,必須加入這個(gè)注解  
  26. @Aspect // 該注解標(biāo)示該類為切面類,切面是由通知和切點(diǎn)組成的。  
  27. public class ApiAspect {  
  28.       
  29.     private static final Logger logger =  LoggerFactory.getLogger(ApiAspect.class);  
  30.   
  31.     ThreadLocal<Long> startTime = new ThreadLocal<Long>();  
  32.   
  33.     @Pointcut("execution(* com.chhliu.springboot.aop.controller.HelloController.*(..))")// 定義切點(diǎn)表達(dá)式  
  34.     @Order(2)  
  35.     public void controllerPoint() {  
  36.     }  
  37.       
  38.     @Pointcut("@annotation(com.chhliu.springboot.aop.annotation.RedisCache)")// 定義注解類型的切點(diǎn),只要方法上有該注解,都會匹配  
  39.     @Order(1)  
  40.     public void annotationPoint(){  
  41.           
  42.     }  
  43.   
  44.     // 定義前置通知  
  45.     @Before("annotationPoint()")  
  46.     public void before(JoinPoint joinPoint) {  
  47.         System.out.println("方法執(zhí)行前執(zhí)行.....before");  
  48.         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();  
  49.         HttpServletRequest request = attributes.getRequest();  
  50.         logger.info("<====================================================================");  
  51.         logger.info("請求來源:  => " + request.getRemoteAddr());  
  52.         logger.info("請求URL: " + request.getRequestURL().toString());  
  53.         logger.info("請求方式: " + request.getMethod());  
  54.         logger.info("響應(yīng)方法: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());  
  55.         logger.info("請求參數(shù) : " + Arrays.toString(joinPoint.getArgs()));  
  56.         logger.info("---------------------------------------------------------------------");  
  57.         startTime.set(System.currentTimeMillis());  
  58.     }  
  59.   
  60.     @Around("controllerPoint() && args(arg)")// 需要匹配切點(diǎn)表達(dá)式,同時(shí)需要匹配參數(shù)  
  61.     public String around(ProceedingJoinPoint pjp, String arg) {  
  62.         System.out.println("name:"+arg);  
  63.         System.out.println("方法環(huán)繞start....around.");  
  64.         String result = null;  
  65.         try {  
  66.             result = (String) pjp.proceed()+" aop String";  
  67.         } catch (Throwable e) {  
  68.             e.printStackTrace();  
  69.         }  
  70.         System.out.println("方法環(huán)繞end.....around");  
  71.         return result;  
  72.     }  
  73.   
  74.     @After("within(com.chhliu.springboot.aop.controller.*Controller)")  
  75.     public void after() {  
  76.         System.out.println("方法之后執(zhí)行....after.");  
  77.     }  
  78.   
  79.     @AfterReturning(pointcut="controllerPoint()", returning="rst")  
  80.     public void afterReturning(JoinPoint joinPoint, Object rst) {  
  81.         System.out.println("方法執(zhí)行完執(zhí)行.....afterReturning");  
  82.         logger.info("耗時(shí)(毫秒) : " + (System.currentTimeMillis() - startTime.get()));  
  83.         logger.info("返回?cái)?shù)據(jù): {}", JSONUtils.toJSONString(rst));  
  84.         logger.info("====================================================================>");  
  85.     }  
  86.   
  87.     @AfterThrowing("within(com.chhliu.springboot.aop.controller.*Controller)")  
  88.     public void afterThrowing() {  
  89.         System.out.println("異常出現(xiàn)之后.....afterThrowing");  
  90.     }  
  91. }  
四、定義注解

  1. package com.chhliu.springboot.aop.annotation;  
  2.   
  3. import java.lang.annotation.Documented;  
  4. import java.lang.annotation.ElementType;  
  5. import java.lang.annotation.Retention;  
  6. import java.lang.annotation.RetentionPolicy;  
  7. import java.lang.annotation.Target;  
  8.   
  9. /** 
  10.  * 描述:加入查詢結(jié)果的緩存 
  11.  * @author chhliu 
  12.  * 創(chuàng)建時(shí)間:2017年2月14日 下午10:30:00 
  13.  * @version 1.2.0 
  14.  */  
  15. @Retention(RetentionPolicy.RUNTIME)  
  16. @Target(ElementType.METHOD)  
  17. @Documented  
  18. public @interface RedisCache {  
  19.     Class<?> type();//被代理類的全類名,在之后會做為redis hash 的key  
  20. }  
五、編寫Controller

  1. package com.chhliu.springboot.aop.controller;  
  2.   
  3. import org.springframework.web.bind.annotation.RequestMapping;  
  4. import org.springframework.web.bind.annotation.RequestParam;  
  5. import org.springframework.web.bind.annotation.RestController;  
  6.   
  7. import com.chhliu.springboot.aop.annotation.RedisCache;  
  8.   
  9. @RestController  
  10. public class HelloController {  
  11.   
  12.   @RequestMapping(value = "/hello")  
  13.   public String hello(@RequestParam(value = "name", required = true) String name) {  
  14.     String result = "hello  " + name;  
  15.     System.out.println(result);  
  16.     return result;  
  17.   }  
  18.     
  19.   @RequestMapping(value = "/world")  
  20.   public String world(@RequestParam(value = "arg", required = true) String arg){  
  21.       String result = "world  " + arg;  
  22.         System.out.println(result);  
  23.         return result;  
  24.   }  
  25.     
  26.   @RequestMapping(value="/annotation")  
  27.   @RedisCache(type=String.class)  
  28.   public String annotation(){  
  29.       return "annotation";  
  30.   }  
  31. }  
六、測試

1、啟動服務(wù)

2、在瀏覽器中輸入:http://localhost:8080/annotation

3、測試結(jié)果如下:

  1. 方法執(zhí)行前執(zhí)行.....before  
  2. 2017-02-14 15:23:42.273  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : <====================================================================  
  3. 2017-02-14 15:23:42.274  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : 請求來源:  => 127.0.0.1  
  4. 2017-02-14 15:23:42.274  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : 請求URL: http://localhost:8080/annotation  
  5. 2017-02-14 15:23:42.274  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : 請求方式: GET  
  6. 2017-02-14 15:23:42.276  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : 響應(yīng)方法: com.chhliu.springboot.aop.controller.HelloController.annotation  
  7. 2017-02-14 15:23:42.276  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : 請求參數(shù) : []  
  8. 2017-02-14 15:23:42.276  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : ---------------------------------------------------------------------  
  9. 方法之后執(zhí)行....after.  
  10. 方法執(zhí)行完執(zhí)行.....afterReturning  
  11. 2017-02-14 15:23:42.286  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : 耗時(shí)(毫秒) : 10  
  12. 2017-02-14 15:23:42.289  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : 返回?cái)?shù)據(jù): "annotation"  
  13. 2017-02-14 15:23:42.291  INFO 2208 --- [nio-8080-exec-1] com.chhliu.springboot.aop.aop.ApiAspect  : ====================================================================>  
由于Around環(huán)繞通知不匹配,所以沒有切入進(jìn)去!

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    草草视频福利在线观看| 草草草草在线观看视频| 午夜资源在线观看免费高清| 亚洲美女国产精品久久| 精品国产亚洲区久久露脸| 日本一区二区三区久久娇喘| 午夜传媒视频免费在线观看| 国产欧美性成人精品午夜| 亚洲a码一区二区三区| 美女黄色三级深夜福利| 欧美成人欧美一级乱黄| 成人午夜在线视频观看| 在线免费国产一区二区| 99久久精品一区二区国产| 国产乱久久亚洲国产精品| 国产男女激情在线视频| 日韩亚洲激情在线观看| 91超精品碰国产在线观看| 好吊妞在线免费观看视频| 久久精品a毛片看国产成人| 国产日产欧美精品大秀| 国产永久免费高清在线精品| 亚洲国产成人av毛片国产| 中文字幕久热精品视频在线| 精品国产亚洲区久久露脸| 国产精品成人一区二区三区夜夜夜| 国产又粗又爽又猛又黄的| 国产精品内射视频免费| 亚洲中文字幕高清乱码毛片| 日本人妻的诱惑在线观看| 午夜资源在线观看免费高清| 好吊日成人免费视频公开| 91精品国产品国语在线不卡 | 精品少妇人妻一区二区三区| 国产精品人妻熟女毛片av久 | 国产精品白丝久久av| 热久久这里只有精品视频| 熟女高潮一区二区三区| 中文字幕日韩欧美亚洲午夜| 人妻人妻人人妻人人澡| 国产传媒欧美日韩成人精品|