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

  1. 依赖
  <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"};
}
  1. 切面
@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注解写法相关推荐

  1. Springboot AOP注解方式获取请求参数及返回值并发送至rabbitMQ

       业务需求需要将http请求参数与返回值采集,考虑使用AOP形式,获取到请求值与返回值之后将数据封装为json字符串发送到rabbitMQ中,消费者消费数据后将处理后的数据保存至mongodb或其 ...

  2. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)

    springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) 参考文章: (1)springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) ( ...

  3. SpringBoot AOP(内含源代码)

    SpringBoot AOP(内含源代码) 源代码下载链接:https://download.csdn.net/download/weixin_46411355/87399904 目录 SpringB ...

  4. 如何使用SpringBoot AOP 记录操作日志、异常日志?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...

  5. @retention注解作用_分分钟带你玩转SpringBoot自定义注解

    在工作中,我们有时候需要将一些公共的功能封装,比如操作日志的存储,防重复提交等等.这些功能有些接口会用到,为了便于其他接口和方法的使用,做成自定义注解,侵入性更低一点.别人用的话直接注解就好.下面就来 ...

  6. SpringBoot+AOP实现多数据源动态切换

    SpringBoot+AOP实现多数据源动态切换 背景 设计总体思路 步骤 背景 系统后端需要访问多个数据库,现有的数据库连接配置写入配置文件中.后端需要从一个数据库的配置表里动态的读取其它mysql ...

  7. Spring-Boot + AOP实现多数据源动态切换

    2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据 ...

  8. aop注解配置切点 spring_springboot aop 自定义注解方式实现一套完善的日志记录

    一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型(增删改查),详细描述,返回值. 二:项目结构图 如果想学习Java ...

  9. SpringBoot + AOP 统一处理日志

    Springboot + AOP 统一处理日志.然后系统日志持久化到文件保存起来,当程序方便发生问题的时候,能够快速.准确的定位到问题的所在.SpringBoot + Log4j 每天输出一个日志文件 ...

  10. SpringBoot2.1.5 (4)---SpringBoot 常用注解说明

    SpringBoot2.1.5 (4)---SpringBoot 常用注解说明 @SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入 ...

最新文章

  1. 除了java还学什么_学好Java编程除了努力还需要具备什么?
  2. R语言使用forestplot包绘制森林图:编码创建森林图仿真数据、汇总线修改、元素位置调整、垂直线、字体、风格、置信区间、线型、图例、刻度、标签等
  3. 重新建立域计算机账户与域控制器的联系
  4. @value 静态变量_你理解 PHP 中的静态方法吗?
  5. 不定高度的弹框 垂直水平居中
  6. centos7 python
  7. OpenGL渲染纹理和平面反射
  8. eclipse项目如何变成web项目_IntelliJ IDEA 部署 Web 项目,终于搞懂了!
  9. sp_getapplock_sp_getapplock和sp_releaseapplock存储过程概述
  10. (面试题)用折半查找法在一组整形数组中查找某个数据
  11. Ubuntu安装Onedrive
  12. 勾号、叉号、圈号的收集
  13. LaTex关于数学公式的使用(11)--- 箭头,集合
  14. C# 重置IE安全等级
  15. 嵌入式服务器appweb交叉编译指南
  16. 绝世舞姬计算机弹音乐,绝世舞姬(伴奏)
  17. 免费在线绘图软件推荐-processon
  18. 微信开发 -- 二维码生成
  19. Geoffrey Hinton获得时间检验奖;AI预测世界杯荷兰夺冠;Galactica不靠谱,ChatGPT又如何……...
  20. 温度芯片(TM75,LM75)

热门文章

  1. 语音识别使用推荐(讯飞、百度、腾讯、云知声等)
  2. 爬取天天基金排行榜上的基金信息
  3. 使用VLC搭建视频直播服务器
  4. Android-N自动旋转屏幕
  5. 关于CPU架构之总结
  6. open-drain和push-pull的上拉速度
  7. 一个有趣的模型组合预测模型
  8. built a JNCIS LAB系列:Chapter 1 Communities v1.0
  9. 机器学习实践—基于Scikit-Learn、Keras和TensorFlow2第二版—第2章 端到端机器学习项目实践
  10. 智能家居监控移动手机组态现实生活中的应用