Spring AOP 指导教程

什么是Spring AOP

spring aop可以在spring构建的系统中使用面向切面编程。当然Spring Boot也是基于Spring构建的。使用AOP

可以实现诸如事务,日志以及安全校验等通过切面统一完成的任务。他可以通过简单的注解方式实现在方法执行前后来执行你自己的逻辑。

什么是advice, joinpoint和pointcut

  • Joinpoint:程序的执行点,如方法的执行或者异常的处理。
  • Pointcut:一个用来匹配joinpoint的断言或者表达式。
  • Advice:与一个pointcut关联,并在匹配点运行。

advices的类型

  • Before advice:在join point之前执行的advice,不能阻止程序的继续运行。
  • After returning advice:在join point完成之后执行的advice。
  • After throwing advice:在执行的方法抛出异常之后执行。
  • After advice:在执行的join point退出之后执行不论正常退出或者抛出了异常。
  • Around advice:可以在方法调用之前或之后执行自定义行为,并且还可以选择继续执行join point或者执行另外的方法。

Spring AOP 示例

编写Aspectclass然后写相应的执行方法并在方法上写joint-point表达式

面向切面编程首先需要在类上加@Aspect注解表名这是一个AOP管理的类,然后在方法上加上point-cut表达式用来匹配joint-point方法。

@Aspectpublic class EmployeeCRUDAspect {  @Before("execution(* EmployeeManager.getEmployeeById(..))") //point-cut expression public void logBeforeV1(JoinPoint joinPoint) { System.out.println("EmployeeCRUDAspect.logBeforeV1() : " + joinPoint.getSignature().getName()); }}

写由切面控制的方法(joint points)

首先将类注入到Spring中,之后写正常的方法即可。

@Componentpublic class EmployeeManager{ public EmployeeDTO getEmployeeById(Integer employeeId) { System.out.println("Method getEmployeeById() called"); return new EmployeeDTO(); }}

在上面的例子中,logBeforeV1方法会在getEmployeeById方法执行之前执行。将会打印如下日志:

EmployeeCRUDAspect.logBeforeV1() : getEmployeeByIdMethod getEmployeeById() called

AOP注解

@Before

在切面控制的方法之前执行。

@Aspectpublic class LoggingAspect {  @Before("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logBeforeAllMethods(JoinPoint joinPoint) { ... }  @Before("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.getEmployeeById(..))") public void logBeforeGetEmployee(JoinPoint joinPoint) { ... }}

logBeforeAllMethods方法会在EmployeeManagerImpl中所有方法执行前执行。

@After

在切面控制的方法之后执行。

@Aspectpublic class LoggingAspect {  @After("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAfterAllMethods(JoinPoint joinPoint) { ... }  @After("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.getEmployeeById(..))") public void logAfterGetEmployee(JoinPoint joinPoint) { ... }}

@Around

可以在方法执行前后切入。

@Aspectpublic class LoggingAspect {  @Around("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAroundAllMethods(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("****LoggingAspect.logAroundAllMethods() : " + joinPoint.getSignature().getName() + ": Before Method Execution"); try { joinPoint.proceed(); } finally { //Do Something useful, If you have } System.out.println("****LoggingAspect.logAroundAllMethods() : " + joinPoint.getSignature().getName() + ": After Method Execution"); }​}

@AfterReturning

在方法执行完成且没有抛出任何异常的情况下。

@Aspectpublic class LoggingAspect {  @AfterReturning("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAfterReturningAllMethods() throws Throwable { System.out.println("****LoggingAspect.logAfterReturningAllMethods() "); }​}

以上示例中只用到了execution方式,还有一种使用@annotation可以对注解了指定接口的方法进行切面编程。这种用法在之前的mybatis多数据源中使用过。

另外还有很多AOP的注解,如果大家感兴趣的话,会继续把剩下的用法写完~

pointcut注解_Spring AOP使用指南,详细了解AOP相关注解相关推荐

  1. @springbootapplication 注解_Spring Boot最核心的27个干货注解,你了解多少?

    Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringClo ...

  2. 注解@JsonIgnore的使用方法效果及其他相关注解应用

    作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响. 使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性. 场景模拟: 需要把一个List< ...

  3. (十一)Spring 基础注解(对象创建相关注解、注入相关注解)

    注解编程 目录 注解基础概念 注解的作用 Spring 注解的发展历程 Spring 基础注解(Spring 2.x) 对象创建相关注解 @Component @Repository.@Service ...

  4. 【Spring 基础注解】对象创建相关注解、注入相关注解、注解扫描详解

    Spring 基础注解(2.x) 注解基础概念 注解的作用 Spring 注解的发展历程 对象创建相关注解 @Component @Repository.@Service.@Contoller @Sc ...

  5. java获取方法上的注解_Spring:使用Spring AOP时,如何获取目标方法上的注解

    当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等 自定义注解 packagecom.agent.annotation;importjava.lang.annotati ...

  6. spring框架:简述AOP的使用(xml方式和注解方式)

    本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教. AOP概述 AOP的概念: AOP,全称Apect Oriented Programming,译为面向切面编程,简单的说它可以帮我们把程序 ...

  7. SpringBoot基于AOP实现自定义非空验证的注解

    为了避免对大量参数进行过多的非空校验,我们可以自定义一个非空验证的注解,因为spring自带的@RequestParam并不能对参数进行非空 准备工作 首先需要创建一个spring boot项目,并引 ...

  8. spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)

    1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...

  9. Spring AOP切面使用详细解析

    相关文章: SpringBoot AOP切面的使用 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析) 架构师系列内容:架构师学习笔记(持续更新)) Spring AOP 应 ...

  10. autowired注解_Spring系列之Spring常用注解总结

    作者:平凡希来源:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做 ...

最新文章

  1. 给GRUB添加新的项目
  2. python里面的pip是什么意思_Python-pip和conda有什么区别?
  3. 自动更新本地 GIT 仓库
  4. linux安装数据库依赖包,Linux下安装DB2的包依赖
  5. [Leetcode][第201题][JAVA][数字范围按位与][位运算][Brian Kernighan]
  6. 9个元素换6次达到排序序列_排序总结:二大种,六小种排序方式
  7. 用Docker搭建Laravel开发环境
  8. mysql_query
  9. What is Leanstar.cn?
  10. mui打包ios_优品视界,聚合影视APP源码。mui框架,hbuilder即可编译,云打包生成ios的Android的app...
  11. 获取指定年份至今年分列表
  12. 监控视频存储解决方案
  13. 铁木辛柯matlab,岩石断裂力学(李世愚2006)
  14. 浅谈浏览器的编码与解码过程
  15. 中医针灸学综合练习题库【10】
  16. js(javascript)和jq(jquery)常见问题(持续更新)
  17. SAPnbsp;BORnbsp;--nbsp;…
  18. 在手机与计算机之间进行文件传输的方式,电脑和手机传输文件方法_电脑和手机如何传文件-win7之家...
  19. 【BZOJ4027】【HEOI2015】兔子与樱花 贪心
  20. ARCH模型和GARCH模型

热门文章

  1. linux svn 自动部署,linux下svn安装和自动部署
  2. C++提取PDF页成BMP图片
  3. Anaconda详细安装及安装Scrapy框架
  4. mysql 查询超过60分钟的_mysql基础级《简单查询》60分钟搞定
  5. mysql 日期查询今天_Mysql 日期查询今天、昨天、近7天、近30天、本月、上一月、本季...
  6. 电脑维修:电脑维修必备工具整理
  7. 笔记本选购:i5轻薄本和i7轻薄本该如何选择?
  8. 100+ 值得收藏的 Web 开发资源
  9. 从零开始学python人工智能课程_从零开始如何学习人工智能?
  10. c语言深度剖析第三版pdf_入门到入坟,蕴含全网最强知识点3283页笔记、pdf教程,活到老,学到老...