经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
springboot aop使用介绍
来源:cnblogs  作者:撸码识途  时间:2018/10/15 9:30:33  对本文有异议

第一步:添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

第二步:定义一个切面类

  1. package com.example.demo.aop;
  2. import java.lang.reflect.Method;
  3. import java.util.Arrays;
  4. import javax.servlet.http.HttpServletRequest;
  5. import org.aspectj.lang.JoinPoint;
  6. import org.aspectj.lang.ProceedingJoinPoint;
  7. import org.aspectj.lang.annotation.*;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.core.annotation.Order;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.web.context.request.RequestContextHolder;
  13. import org.springframework.web.context.request.ServletRequestAttributes;
  14. import static com.sun.xml.internal.ws.dump.LoggingDumpTube.Position.Before;
  15. @Component
  16. @Aspect // 将一个java类定义为切面类
  17. @Order(-1)//如果有多个aop,这里可以定义优先级,越小级别越高
  18. public class LogDemo {
  19. private static final Logger LOG = LoggerFactory.getLogger(LogDemo.class);
  20. @Pointcut("execution(* com.example.demo.test.TestController.test(..))")//两个..代表所有子目录,最后括号里的两个..代表所有参数
  21. public void logPointCut() {
  22. }
  23. @Before("logPointCut()")
  24. public void doBefore(JoinPoint joinPoint) throws Throwable {
  25. // 接收到请求,记录请求内容
  26. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  27. HttpServletRequest request = attributes.getRequest();
  28. System.out.println("before");
  29. }
  30. @After(value = "logPointCut()")
  31. public void after(JoinPoint joinPoint) {
  32. System.out.println("after");
  33. }
  34. @AfterReturning(returning = "ret", pointcut = "logPointCut()")// returning的值和doAfterReturning的参数名一致
  35. public void doAfterReturning(Object ret) throws Throwable {
  36. System.out.println("AfterReturning");
  37. }
  38. @Around("logPointCut()")
  39. public void doAround(ProceedingJoinPoint pjp) throws Throwable {
  40. System.out.println("around1");
  41. Object ob = pjp.proceed();//环绕通知的进程方法不能省略,否则可能导致无法执行
  42. System.out.println("around2");
  43. }
  44. }

注意:

如果同一个 切面类,定义了定义了两个 @Before,那么这两个 @Before的执行顺序是无法确定的

对于@Around,不管它有没有返回值,但是必须要方法内部,调用一下 pjp.proceed();否则,Controller 中的接口将没有机会被执行,从而也导致了 @Before不会被触发

 

测试的controller如下:

  1.  
  1. package com.example.demo.test;

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;


    @Controller
    public class TestController {

    @RequestMapping(value = "test",method = RequestMethod.GET)
    @ResponseBody
    public String test(String name){
    System.out.println("============method");
    return name;
    }
    }
  1.  

 

配置完成,看看效果,输出如下:

  1. around1
  2. before
  3. ============method
  4. around2
  5. after
  6. AfterReturning

可以看到,切面方法的执行如下:

around-->before-->method-->around-->after-->AfterReturning

如果配置了@AfterThrowing,当有异常时,执行如下:

around-->before-->method-->around-->after-->AfterThrowing

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号