SpringBoot AOP注解写法
1.Spring AOP五种通知详情
1)环绕通知 @Around 环绕通知围绕在连接点前后
2)前置通知 @Before 在连接点前面执行
方法进行
3)环绕通知 @Around 环绕通知围绕在连接点前后
4)后置通知 @After 在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容
5)正常返回通知 @AfterReturning 在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行
2.切入点指示符
execution 用于匹配方法执行的连接点;
within 用于匹配指定类型内的方法执行;
this 用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
target 用于匹配当前目标对象类型的执行方法;注意是 目标对象的类型匹配,这样就不包括引入接口也类型匹配;
args 用于匹配当前执行的方法传入的参数为指定类型的执行方法;
@within 用于匹配所以持有指定注解类型内的方法;
@target 用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;
@args 用于匹配当前执行的方法传入的参数持有指定注解的执行;
@annotation 用于匹配当前执行方法持有指定注解的方法;
bean Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;
reference pointcut 表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持。
3.AOP切入点详解
1)execution(public * (…)) 匹配所有的public修饰符的方法
execution( com.test.method.des….(…))
1, execution() 表达式的主体
2, 第一个“”符号 表示返回值的类型任意
3, com.test.method.des AOP所切的服务的包名,即,需要进行横切的业务类
4, 包名后面的“…” 表示当前包及子包
5, 第二个“” 表示类名,即所有类
6, .(…) 表示任何方法名,括号表示参数,两个点表示任何参数类型
范例
- public * *(…) 任何公共方法的执行
- com.learn…IHelloService.*() com.learn包及所有子包下IHelloService接口中的任何无参方法
- com.learn….(…) com.learn包及所有子包下任何类的任何方法
- com.learn…IHelloService.() com.learn包及所有子包下IHelloService接口的任何只有一个参数方法
- (!com.learn…IHelloService+).*(…) 非“com.learn包及所有子包下IHelloService接口及子类型”的任何方法
- com.learn…IHelloService+.() com.learn包及所有子包下IHelloService接口及子类型的的任何无参方法
com.learn…IHelloService.test(java.util.Date) com.learn包及所有子包下IHelloService前缀类型的的以test开头的只有一个参数类型为java.util.Date的方法,注意该匹配是根据方法签名的参数类型进行匹配的,而不是根据执行时传入的参数类型决定的,如定义方法:public void test(Object obj);即使执行时传入java.util.Date,也不会匹配的;
*com.learn…IHelloService.test(…) throws IllegalArgumentException, ArrayIndexOutOfBoundsException com.learn包及所有子包下IHelloService前缀类型的的任何方法,且抛出IllegalArgumentException和ArrayIndexOutOfBoundsException异常 - (com.learn…IHelloService+ && java.io.Serializable+).*(…) 任何实现了com.learn包及所有子包下 IHelloService接口和java.io.Serializable接口的类型的任何方法
@java.lang.Deprecated * *(…) 任何持有@java.lang.Deprecated注解的方法
@(java.lang.Deprecated || com.learn…Secure) * *(…) 任何持有@java.lang.Deprecated或@com.learn…Secure注解的方法
(@com.learn…Secure *) *(…) 任何返回值类型持有@com.learn…Secure的方法 - (@com.learn…Secure ).(…) 任何定义方法的类型持有@com.learn…Secure的方法
- (@com.learn…Secure () , @com.learn…Secure (*)) 任何签名带有两个参数的方法,且这个两个参数都被@Secure标记了,如public void test(@Secure String str1, @Secure String str1)
- *((@ com.learn…Secure *))或 * *(@ com.learn…Secure *) 任何带有一个参数的方法,且该参数类型持有@com.learn…Secure;如public void test(Model model);且Model类上持有@Secure注解
- *( @com.learn…Secure (@com.learn…Secure *) , @ com.learn…Secure (@com.learn…Secure *)) 任何带有两个参数的方法,且这两个参数都被@com.learn…Secure标记了;且这两个参数的类型上都持有@ com.learn…Secure;
*( java.util.Map<com.learn…Model, com.learn…Model> , …) 任何带有一个java.util.Map参数的方法,且该参数类型是以< com.learn…Model, com.learn…Model >为泛型参数;注意只匹配第一个参数为java.util.Map,不包括子类型;如public void test(HashMap<Model, Model> map, String str);将不匹配,必须使用“ *( java.util.HashMap<com.learn…Model,com.learn…Model> , …)”进行匹配; 而public void test(Map map, int i);也将不匹配,因为泛型参数不匹配 * *(java.util.Collection<@com.learn…Secure *>) 任何带有一个参数(类型为java.util.Collection)的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@com.learn…Secure注解; 如public void test(Collection collection);Model类型上持有@com.learn…Secure * *(java.util.Set<? extends HashMap>) 任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型继承与HashMap; Spring AOP目前测试不能正常工作 - *(java.util.List<? super HashMap>) 任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型是HashMap的基类型;如public voi test(Map map);Spring AOP目前测试不能正常工作
- (<@com.learn…Secure *>) 任何带有一个参数的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@com.learn…Secure注解;Spring AOP目前测试不能正常工作
4.demo
- 依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
2.创建注解
//作用域 作用于方法和类上
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented //表示把注解生成在Javadoc中
@Inherited //表示可以被继承
public @interface MySecure {//注解的参数:类型+参数名()[default 默认值];String name() default "";String[] role() default {"user"};
}
- 切面
@Component
@Aspect
public class MySecureAspect {@Before("@annotation(MySecure)")public void dopointcut(JoinPoint jp){System.out.println("方法运行前检查");MethodSignature signature = (MethodSignature)jp.getSignature();//获取注解上的值String[] role = signature.getMethod().getAnnotation(MySecure.class).role();for (String s : role) {System.out.println("========获取传入注解的role值========="+s);}//获取该方法上的请求参数Parameter[] parameters = signature.getMethod().getParameters();for (Parameter s : parameters) {System.out.println("========获取该方法上的请求参数========="+s.toString());}//获取方法String method = signature.getMethod().toString();System.out.println("========method========="+method);//获取用户ip地址ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String IpAdr = request.getRemoteAddr();System.out.println("========获取用户ip地址========="+IpAdr);}//扫描com.example.demo.aop.service包下的所有的类的方法@AfterReturning("execution(* com.example.demo.aop.service..*.*(..))")public void log(){System.out.println("========方法正常执行完成======");}
}
4.测试 (UserServcie的包com.example.demo.aop.service)
@Service
public class UserServcie {@MySecure(role = {"admin"})public void login(String username,String password){System.out.println("=======这是一个登录方法========");}
}
打印结果
SpringBoot AOP注解写法相关推荐
- Springboot AOP注解方式获取请求参数及返回值并发送至rabbitMQ
业务需求需要将http请求参数与返回值采集,考虑使用AOP形式,获取到请求值与返回值之后将数据封装为json字符串发送到rabbitMQ中,消费者消费数据后将处理后的数据保存至mongodb或其 ...
- springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)
springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) 参考文章: (1)springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) ( ...
- SpringBoot AOP(内含源代码)
SpringBoot AOP(内含源代码) 源代码下载链接:https://download.csdn.net/download/weixin_46411355/87399904 目录 SpringB ...
- 如何使用SpringBoot AOP 记录操作日志、异常日志?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...
- @retention注解作用_分分钟带你玩转SpringBoot自定义注解
在工作中,我们有时候需要将一些公共的功能封装,比如操作日志的存储,防重复提交等等.这些功能有些接口会用到,为了便于其他接口和方法的使用,做成自定义注解,侵入性更低一点.别人用的话直接注解就好.下面就来 ...
- SpringBoot+AOP实现多数据源动态切换
SpringBoot+AOP实现多数据源动态切换 背景 设计总体思路 步骤 背景 系统后端需要访问多个数据库,现有的数据库连接配置写入配置文件中.后端需要从一个数据库的配置表里动态的读取其它mysql ...
- Spring-Boot + AOP实现多数据源动态切换
2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据 ...
- aop注解配置切点 spring_springboot aop 自定义注解方式实现一套完善的日志记录
一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型(增删改查),详细描述,返回值. 二:项目结构图 如果想学习Java ...
- SpringBoot + AOP 统一处理日志
Springboot + AOP 统一处理日志.然后系统日志持久化到文件保存起来,当程序方便发生问题的时候,能够快速.准确的定位到问题的所在.SpringBoot + Log4j 每天输出一个日志文件 ...
- SpringBoot2.1.5 (4)---SpringBoot 常用注解说明
SpringBoot2.1.5 (4)---SpringBoot 常用注解说明 @SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入 ...
最新文章
- 除了java还学什么_学好Java编程除了努力还需要具备什么?
- R语言使用forestplot包绘制森林图:编码创建森林图仿真数据、汇总线修改、元素位置调整、垂直线、字体、风格、置信区间、线型、图例、刻度、标签等
- 重新建立域计算机账户与域控制器的联系
- @value 静态变量_你理解 PHP 中的静态方法吗?
- 不定高度的弹框 垂直水平居中
- centos7 python
- OpenGL渲染纹理和平面反射
- eclipse项目如何变成web项目_IntelliJ IDEA 部署 Web 项目,终于搞懂了!
- sp_getapplock_sp_getapplock和sp_releaseapplock存储过程概述
- (面试题)用折半查找法在一组整形数组中查找某个数据
- Ubuntu安装Onedrive
- 勾号、叉号、圈号的收集
- LaTex关于数学公式的使用(11)--- 箭头,集合
- C# 重置IE安全等级
- 嵌入式服务器appweb交叉编译指南
- 绝世舞姬计算机弹音乐,绝世舞姬(伴奏)
- 免费在线绘图软件推荐-processon
- 微信开发 -- 二维码生成
- Geoffrey Hinton获得时间检验奖;AI预测世界杯荷兰夺冠;Galactica不靠谱,ChatGPT又如何……...
- 温度芯片(TM75,LM75)