Spring boot aop切面(6)
来源:互联网 发布:常见端口列表 编辑:程序博客网 时间:2024/06/07 00:24
SpringBoot提供了强大AOP支持,我们前面讲解过AOP面向切面,所以这里具体AOP原理就补具体介绍;
AOP切面主要是切方法,我们一般搞一些日志分析和事务操作,要用到切面,类似拦截器;
@Aspect注解是切面注解类
@Pointcut切点定义
@Before是方法执行前调用
@After是方法执行后调用
@AfterReturning方法执行返回值调用
Service层本身就可以切入事务,所以我们这类搞个常用的 切controller层方法
每个执行controller层的方法 都记录下请求Url,访问者IP 执行类方法参数等信息;
AspectJ中的切入点匹配的执行点称作连接的(Join Point),在通知方法中可以声明一个JoinPoint类型的参数。通过JoinPoint可以访问连接点的细节。下面简要介绍JponPoint的方法:1.java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 2.Signature getSignature() :获取连接点的方法签名对象; 3.java.lang.Object getTarget() :获取连接点所在的目标对象; 4.java.lang.Object getThis() :获取代理对象本身; ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法: 5.java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法; 6.java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的参数替换原来的参数。
RequestContextHolder顾名思义,持有上下文的Request容器
package com.java1234.aspect;import javax.servlet.http.HttpServletRequest;import org.apache.log4j.Logger;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;@Aspect@Componentpublic class RequestAspect {private Logger logger=Logger.getLogger(RequestAspect.class);@Pointcut("execution(public * com.java1234.controller.*.*(..))")public void log() {}@Before("log()")public void deoBefore(JoinPoint joinpoint) {logger.info("方法执行前");ServletRequestAttributes rch=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest p =rch.getRequest();logger.info("URL:"+p.getRequestURI());logger.info("IP:"+p.getRemoteHost());logger.info("method:"+p.getMethod());logger.info("class_method:"+joinpoint.getSignature().getDeclaringTypeName()+"."+joinpoint.getSignature().getName());logger.info("args:"+joinpoint.getArgs());}@After("log()") public void doAfter(JoinPoint joinPoint){ logger.info("方法执行后..."); }@AfterReturning(returning="result",pointcut="log()") public void doAfterReturning(Object result){ logger.info("执行返回值:"+result); }}
2017-11-07 11:42:40.942 INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect : 方法执行前
2017-11-07 11:42:40.943 INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect : URL:/aonncunt/sav
2017-11-07 11:42:40.943 INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect : IP:127.0.0.1
2017-11-07 11:42:40.943 INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect : method:POST
2017-11-07 11:42:40.944 INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect : class_method:com.java1234.controller.accountcontroller.addstudent
2017-11-07 11:42:40.944 INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect : args:[Ljava.lang.Object;@1cb583d
Hibernate: insert into student (age, name) values (?, ?)
2017-11-07 11:42:40.985 INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect : 方法执行后...
2017-11-07 11:42:40.985 INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect : 执行返回值:添加成功!
2017-11-07 11:43:45.896 INFO 8384 --- [on(2)-127.0.0.1] inMXBeanRegistrar$SpringApplicationAdmin : Application shutdown requested.
2017-11-07 11:43:45.897 INFO 8384 --- [on(2)-127.0.0.1] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@13d0772: startup date [Tue Nov 07 11:42:15 CST 2017]; root of context hierarchy
2017-11-07 11:43:45.898 INFO 8384 --- [on(2)-127.0.0.1] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
2017-11-07 11:43:45.898 INFO 8384 --- [on(2)-127.0.0.1] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
- Spring boot aop切面(6)
- Spring boot之AOP面向切面编程
- 【spring-boot】spring aop 面向切面编程初接触
- 【spring-boot】spring aop 面向切面编程初接触
- 【spring-boot】spring aop 面向切面编程初接触
- 【Spring】AOP - 面向切面
- spring aop 定义切面
- Spring AOP切面
- 【Spring】AOP - 面向切面
- Spring AOP切面编程
- spring Aop切面
- spring-Aop切面编程
- Spring的切面 AOP
- spring AOP切面使用
- Spring AOP自定义切面
- Spring AOP面向切面
- 切面优先级 Spring Aop
- spring aop 切面测试
- jquery--ajax.GET 提交时候的乱码
- maven-EGit-Stashes使用
- 前后端经常分离?试试eoLinker进行api接口管理
- AndroidStudio第一次提交项目代码到git服务器/github
- CardView使用前后对比图
- Spring boot aop切面(6)
- linux vi常用命令
- Android Studio和xCode快捷键,WINDOWS和MAC
- JS_点亮或熄灭灯
- CentOS 6安装心得
- 详解制作根文件系统
- Android 实现颜色渐变的一个小 tip
- 分布式与集群的区别
- Trash Removal uva1111/uvalive5138 World Final 2011 K 计算几何