首先应该明白一点,AOP是一种编程范式,是一种程序设计思想,与具体的计算机编程语言无关,所以不止是Java,像.Net等其他编程语言也有AOP的实现方式。AOP的思想理念就是将通用逻辑从业务逻辑中分离出来。

本文将通过一个HTTP请求的例子简单的讲解Spring Boot中AOP的应用,步骤如下:

第一步,添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

第二步,创建AOP方法的类

package *; //自己定义

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; @Aspect
@Component
public class HttpAspect {
//使用org.slf4j.Logger,这是Spring实现日志的方法
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); /**
* 定义AOP扫描路径
* 第一个注解只扫描aopTest方法
*/
//@Pointcut("execution(public * com.aston.reader.controller.StudentController.aopTest())")
@Pointcut("execution(public * com.aston.reader.controller.StudentController.*())")
public void log(){} /**
* 记录HTTP请求开始时的日志
*/
@Before("log()")
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//URL
logger.info("url={}", request.getRequestURI());
//method
logger.info("method={}", request.getMethod());
//ip
logger.info("ip={}",request.getRemoteAddr());
//类方法
logger.info("class={} and method name = {}",joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName());
//参数
logger.info("参数={}",joinPoint.getArgs());
} /**
* 记录HTTP请求结束时的日志
*/
@After("log()")
public void doAfter(){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("url = {} end of execution", request.getRequestURL());
} /**
* 获取返回内容
* @param object
*/
@AfterReturning(returning = "object",pointcut = "log()")
public void doAfterReturn(Object object){
logger.info("response={}",object.toString());
}
}

第三步,创建试验方法

package *; //自己定义

import org.springframework.web.bind.annotation.*;

@RestController
public class StudentController { @GetMapping(value = "/aoptest")
public String aopTest(){
return " AOP test success!";
} }

第四步,启动程序,访问 http://127.0.0.1:8080/aoptest 查看结果。

最新文章

  1. JS中判断鼠标按键的问题
  2. restore database
  3. JavaWeb---总结(五)Http协议
  4. SQL总结(一)基本查询
  5. EasyUI修改DateBox和DateTimeBox的默认日期格式
  6. freemarker空值的多种处理方法
  7. uploadify插件的使用
  8. HTTP调试 抓包 工具 Fiddle 简介 示例
  9. DEVExpress For WPF 中GridControl如何实现滚动分页(延迟查询)
  10. Java.util.zip adding a new file overwrites entire jar?(转)
  11. js zhi网马
  12. 读书笔记 effective c++ Item 30 理解内联的里里外外 (大师入场啦)
  13. 【译】Envoy with Nomad and Consul (一)
  14. 文件防删除保护(miniifiter)
  15. 网页块元素定位建议使用的xpath方式
  16. 饮冰三年-人工智能-linux-03 Linux文件管理(权限管理+归档+压缩)
  17. Android CPU类型及预定义的宏
  18. dubbo文档
  19. 【Android】5.7 图片库(Galery)
  20. test20181024 ming

热门文章

  1. PHP跨域请求nodejs
  2. Thread 小总结
  3. C++多态实例
  4. Codeforces Round #459 (Div. 2):B. Radio Station
  5. momo不是玩具,.Net雄起
  6. JVM垃圾回收原理
  7. Python中str、list、numpy分片操作
  8. sedgewick增量序列的希尔排序
  9. spark的flatMap和map区别
  10. 13 Java内存模型