## 引入AOP依赖
在Spring Boot中引入AOP就跟引入其他模块一样,非常简单,只需要在`pom.xml`中加入如下依赖:
~~~
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
~~~
* 实现一个简单请求处理:通过传入name参数,返回“hello xxx”的功能
~~~
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(@RequestParam("name") String name){
return "Hello"+name;
}
}
~~~
## 实现Web层的日志切面
实现AOP的切面主要有以下几个要素:
* 使用`@Aspect`注解将一个java类定义为切面类
* 使用`@Pointcut`定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。
* 根据需要在切入点不同位置的切入内容
* 使用`@Before`在切入点开始处切入内容
* 使用`@After`在切入点结尾处切入内容
* 使用`@AfterReturning`在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
* 使用`@Around`在切入点前后切入内容,并自己控制何时执行切入点自身的内容
* 使用`@AfterThrowing`用来处理当切入内容部分抛出异常之后的处理逻辑
~~~
/**
* 使用aop前置通知拦截请求参数信息
* @author Administrator
*
*/
@Aspect
@Component
public class WebLogAspect {
private static final Logger logger=LoggerFactory.getLogger(WebLogAspect.class);
@Pointcut("execution(public * cn.li.controller.*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."
+ joinPoint.getSignature().getName());
logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
logger.info("RESPONSE : " + ret);
}
}
~~~
通过运行程序并访问:`http://localhost:8080/hello?name=didi`,可以获得下面的日志输出
~~~
2019-01-07 18:40:44.050 INFO 5940 --- [nio-8080-exec-4] cn.li.aop.WebLogAspect : URL : http://localhost:8080/hello
2019-01-07 18:40:44.051 INFO 5940 --- [nio-8080-exec-4] cn.li.aop.WebLogAspect : HTTP_METHOD : GET
2019-01-07 18:40:44.051 INFO 5940 --- [nio-8080-exec-4] cn.li.aop.WebLogAspect : IP : 0:0:0:0:0:0:0:1
2019-01-07 18:40:44.054 INFO 5940 --- [nio-8080-exec-4] cn.li.aop.WebLogAspect : CLASS_METHOD : cn.li.controller.HelloController.hello
2019-01-07 18:40:44.054 INFO 5940 --- [nio-8080-exec-4] cn.li.aop.WebLogAspect : ARGS : [zhangsan]
2019-01-07 18:40:44.061 INFO 5940 --- [nio-8080-exec-4] cn.li.aop.WebLogAspect : RESPONSE : Hellozhangsan
~~~
- springboot(一)--idea开发
- 1.springboot简介
- 2. 创建springboot项目的三种方式
- 3. springboot项目结构分析(上)
- 4. springboot项目结构分析(下)
- 5. SpringBoot的HelloWorld应用独立运行
- 6. SpringBoot中的参数设置
- 7. SpringBoot中的Banner设置
- 8. SpringBoot中的参数绑定
- 9. SpringBoot的热部署
- 10. SpringBoot集成DataSource
- 11.springboot集成mybatis
- 12. springboot与springcloud区别
- 代码位置
- springboot(二)--eclipse开发
- 1. 创建第一个springboot项目
- 2. 使用@ComponentScan方式启动
- 3. 使用@SpringBootApplication方式启动
- 4. SpringBoot静态资源访问
- 5. 整合Freemarker视图层
- 6. SpringBoot整合jsp视图层
- 7. SpringBoot整合全局捕获异常
- 8. SpringBoot整合log4j日志记录
- 9. 使用AOP统一处理Web请求日志
- 10. 集成lombok让代码更简洁
- 11 安装lombok步骤
- 12. @Async异步执行方法
- 13 @Value自定义参数
- 14 区分不同环境配置文件
- 15 SpringBoot整合Mybatis
- 0 代码位置
- springboot(二)--eclipse开发2
- 1. 整合@Transactional注解
- 2. SpringBoot-整合多数据源拆分思路
- 3. 使用分包方式拆分数据源
- 4. SpringBoot多数据源事务管理机制
- springboot(三)--idea项目前置
- springcloud
