SpringBoot AOP示例
AOP主要注解:
@Aspect,作用在类上,说明这是一个Aspect切面类。
@Pointcut,用来描述,你需要在哪些类的哪些方法中植入你的代码。
@Adive,与Pointcut配合使用,主要说明在Pointcut标记方法的什么时机执行,执行之前?执行之后?
@Pointcut express(切面表达式)
designators指示器:
匹配方法:execution() 通过什么方式去匹配哪些类的哪些方法(重点掌握)。
匹配注解:@annotation() @args() @within() @target()
匹配包/类型:within()
匹配对象:this() bean() target()
匹配参数:args()
wildcards通配符:
* 匹配任意数量的字符
.. 匹配指定类及其子类
+ 匹配任意数的子包或参数
operators运算符:&&与 ||或 !非
5中Advice
@Before
@After
@AfterReturning
@AfterThrowing
@Around
示例代码
@Aspect
@Component
public class HttpAspect {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
@Pointcut("execution(public * com.imooc.controller.GirlController.*(..))")
public void log(){
}
/**
* 在截取的方法前执行
* @param joinPoint
*/
@Before("log()")
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// url
logger.info("url={}", request.getRequestURL());
// method
logger.info("method={}", request.getMethod());
// ip
logger.info("ip={}", request.getRemoteAddr());
// 类方法
logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
// 参数
logger.info("args={}", joinPoint.getArgs());
}
/**
* 获取方法返回参数
* @param object
*/
@AfterReturning(returning = "object", pointcut = "log()")
public void doAfterReturning(Object object){
logger.info("response={}", object);
}
}
Advice示例
@Aspect
@Component
public class AdviceAspectConfig {
/********PointCut********/
@Pointcut("@annotation(com.vmware.AopExecutionDemo.annotation.AdminOnlyMethod)")
public void matchAnnotation(){}
@Pointcut("execution(* com.vmware.AopExecutionDemo.service.*.find*(int))")
public void matchIntArgs(){}
@Pointcut("execution(public * com.vmware.AopExecutionDemo.service..*.*(..) throws java.lang.IllegalAccessException)")
public void matchExecption(){}
@Pointcut("execution(int com.vmware.AopExecutionDemo.service.*.*(..))")
public void matchReturn(){}
/********Advice********/
/**
* 获取方法输入的参数
* @param productId
*/
@Before("matchIntArgs() && args(productId)")
public void before(int productId){
System.out.println("### before ### productId = [" + productId + "]");
}
/**
* 获取方法返回参数
* @param result
*/
@AfterReturning(value = "matchReturn()", returning = "result")
public void after(int result){
System.out.println("### after ###:" + result);
}
/**
* Before + After + AfterReturning
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("matchReturn()")
public Object after(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("### before ###");
Object result;
result = joinPoint.proceed(joinPoint.getArgs());
System.out.println("### after ###" + result);
return result;
}
}
@annotation示例
@Aspect
@Component
public class AnnotationAspectConfig {
/**
* 匹配带有 AdminOnlyMethod Annotation的方法
*/
@Pointcut("@annotation(com.vmware.AopExecutionDemo.annotation.AdminOnlyMethod)")
public void matchAnnotation(){}
@Before("matchAnnotation()")
public void before(){
System.out.println("###matchAnnotation && Before");
}
}
@Aspect
@Component
public class AnnotationClassAspectConfig {
/**
* 匹配带有 AdminOnlyClass Annotation的类
*/
@Pointcut("@within(com.vmware.AopExecutionDemo.annotation.AdminOnlyClass)")
public void annotationClassCondition(){}
@Before("annotationClassCondition()")
public void before(){
System.out.println("###annotationClass && before");
}
}
SpringBoot AOP示例的更多相关文章
- springBoot AOP学习(一)
AOP学习(一) 1.简介 AOp:面向切面编程,相对于OOP面向对象编程. Spring的AOP的存在目的是为了解耦.AOP可以让一切类共享相同的行为.在OOP中只能通过继承类或者实现接口,使代码的 ...
- 用心整理 | Spring AOP 干货文章,图文并茂,附带 AOP 示例 ~
Spring AOP 是 Java 面试的必考点,我们需要了解 AOP 的基本概念及原理.那么 Spring AOP 到底是啥,为什么面试官这么喜欢问它呢?本文先介绍 AOP 的基本概念,然后根据 A ...
- 基于注解的Spring AOP示例
基于注解的Spring AOP示例 目录 在XML配置文件中开启 @AspectJ 支持 声明切面及切入点 声明通知 测试 结语 在XML配置文件中开启 @AspectJ 支持 要使用Spring的A ...
- springboot+aop切点记录请求和响应信息
本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息:这里主要讲解两种切入点方式,一种方法切入,一种注解切入:首先创建个springboot测试工程并通过maven添加如 ...
- SpringBoot+AOP整合
SpringBoot+AOP整合 https://blog.csdn.net/lmb55/article/details/82470388 https://www.cnblogs.com/onlyma ...
- springboot aop 不生效原因解决
最近参照资料创建Springboot AOP ,结果运行后aop死活不生效. 查明原因: 是我在创建AOP类时选择了Aspect类型,创建后才把这个文件改为Class类型,导致一直不生效, 代码配置这 ...
- springboot aop 自定义注解方式实现完善日志记录(完整源码)
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...
- springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)
https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...
- dubbo+zookeeper+springboot简单示例
目录 dubbo+zookeeper+springboot简单示例 zookeeper安装使用 api子模块 生产者producer 消费者consumer @(目录) dubbo+zookeeper ...
随机推荐
- Java中匿名内部类
匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...
- libevent(了解)
1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析, ...
- Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用
在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...
- mysql返回字符串在另外一个字符串中第n次出现的方法。
SELECT SUBSTRING_INDEX("迟到50分钟,早退15分钟","分钟",2); 返回:迟到50分钟,早退15
- java获取当前路径&读取当前目录下文件
项目目录如下: test1.class中读取test.txt import java.io.*; import java.util.Scanner; public class Test1 { publ ...
- docker 构建镜像 centos7 nginx php
#docker 构建镜像(Dockerfile) centos 7.4.1078镜像制作 nginx镜像制作(以前面centos7镜像为基础) Nginx+php镜像制作 更多操作实例,查看git里的 ...
- pandas(二)函数应用和映射
NumPy的ufuncs也可以操作pandas对象 >>> frame one two three four a 0 1 2 3 b 4 5 6 7 c 8 9 10 11 d 12 ...
- laravel queue队列使用
一篇文章: laravel中的队列服务跟其他队列服务也没有什么不同,都是最符合人类思维的最简单最普遍的流程:有一个地方存放队列信息,一个PHP进程在运行时将任务写入,另外一个PHP守护进程轮询队列信息 ...
- Django基础一
Django基础一 Web框架本质 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演 ...
- JavaScript:关闭当前页面(微信、电脑)
WeixinJSBridge.call('closeWindow'); // 关闭微信浏览器 window.opener=null; window.open('','_self'); window.c ...