一、AOP概念

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP指的是一种编程思想,是OOP的补充和完善,这篇博客里主要介绍 Spring @Aspect注解的使用。

AOP的常用术语

  • 连接点(Joinpoint):增强程序执行的某个特定位置(要在哪个地方做增强操作)。Spring仅支持方法的连接点,既仅能在方法调用前,方法调用后,方法抛出异常时等这些程序执行点进行织入增强。

  • 切点(Pointcut):切点是一组连接点的集合。AOP通过“切点”定位特定的连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了:连接点相当于数据库中的记录,而切点相当于查询条件。

  • 增强(Advice):增强是织入到目标类连接点上的一段程序代码。表示要在连接点上做的操作。

  • 切面(Aspect):切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括了横切逻辑的定义,也包括了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。

二、Spring @Aspect

相关注解简介

  • @Aspect:定义切面类,将被标识的类作为一个切面bean
  • @Pointcut:切点
  • @Around:环绕增强
  • @Before:前置增强
  • @AfterReturning:后置增强—方法正常退出时执行
  • @AfterThrowing:后置增强—方法异常执行
  • @After:后置增强—增强anyway

基于连接点的方式

1、定义切面类@Aspect

@Aspect // 声明这是切面类
@Component // 注册到spring容器中
public class LogAspect {/*** @Pointcut() 定义切点&切点范围*/@Pointcut("execution(* com.practice.AspectPractice.AspectDemo.printHello(...))")public void logPointcut() {}/*** @Before 前置增强*/@Before("logPointcut()")public void before(JoinPoint point) {System.out.println(point.getTarget());System.out.println("前置增强");}/*** @Around 环绕增强*/@Around("logPointcut()")public void around(ProceedingJoinPoint joinPoint) {try {System.out.println("环绕增强-执行切点前");joinPoint.proceed();System.out.println("环绕增强-执行切点后");} catch (Throwable t) {System.out.println("抛出异常");System.out.println(t);}}
}

2、编写被增强的类

上面的execution内是一个正则表达式,“ * ” 星号表示任意返回类型的方法 ," .. "表示任意参数个数。

package com.practice.AspectPractice;import org.springframework.stereotype.Service;@Service
public class AspectDemo {// 可以看到这里方法的路径,是上面切面类切点定义的范围中public void printHello() {System.out.println("hello,这里是pointcut");}
}

3、编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class AspectDemoTest extends TestCase {@Autowiredprivate AspectDemo aspectDemo;@Testpublic void test(){aspectDemo.printHello();}
}

结果可以看到,在执行切点前后有增强效果!

环绕增强-执行切点前
com.practice.AspectPractice.AspectDemo@18a645fd
前置增强
hello,我是被aop的方法,printHello
环绕增强-执行切点后

基于自定义注解的方式

1、定义自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

2、定义@Aspect切面,不过此时在切点上把连接点,改成自定义注解

/*** @Pointcut() 定义切点&切点范围*/@Pointcut("@annotation(MyAnnotation)")public void logPointcut() {}

3、添加注解:在要被增强的方法前添加注解,即可起到增强效果

@Service
public class AspectDemo {@MyAnnotationpublic void printHello() {System.out.println("hello,这里是pointcut");}
}

参考博客

  • AOP基于注解实现:https://www.cnblogs.com/wuwuyong/p/13234765.html

  • AOP简单示例:https://www.pianshen.com/article/6627148670/

  • 全注解方式:https://blog.csdn.net/lvhu123/article/details/81128785

Spring @Aspect简单使用相关推荐

  1. Spring Aspect的Execution表达式

    参考博文:Spring Aspect的Execution表达式 我最近在学习spring 隐式装配和自动化配置,在学习aop切面配置的时候,意外发现我竟然对切面匹配规则一点都不了解,现在根据网上的博客 ...

  2. Spring @Aspect切面参数传递

    Spring @Aspect切面参数传递: Xml: <?xml version="1.0" encoding="UTF-8"?> <bean ...

  3. spring 工作流引擎_带Spring的简单工作流引擎

    spring 工作流引擎 几个月前,在处理一个公司项目时,我们需要开发REST服务,该服务用于根据客户端应用程序发送的数据发送电子邮件. 在开发此服务期间,我们决定创建简单的工作流引擎,该引擎将为发送 ...

  4. SpringBoot + Spring Security 简单入门

    这篇文章主要介绍了SpringBoot + Spring Security 简单入门 Spring Security 基本介绍 这里就不对Spring Security进行过多的介绍了,具体的可以参考 ...

  5. 第一章 Spring的简单剖析

          第一章 Spring的简单剖析 简单的说Spring是什么呢?如果单从字面上理解它,可以解释为: 春天, 跃起, 弹性-.中国有句名言:"一年四季在于春".在字面可以想 ...

  6. spring security简单配置

    spring security简单配置 主要集中在5个类里面配置 1,实现UserDetailsService 2,实现AuthenticationManager 3,登录成功与失败的处理 4,访问拒 ...

  7. 【Java】Spring更简单的读取和存储

    文章目录 Spring更简单的读取和存储对象 1. 存储Bean对象 1.1 前置工作:配置扫描路径 1.2 添加注解存储Bean对象 1.2.1 @Controller(控制器存储) 1.2.2 @ ...

  8. spring cloud简单使用

    spring cloud简单使用 1. SpringCloud简介 1.1 什么是SpringCloud 1.2 SpringCloud与SpringBoot的关系 1.3 SpringCloud主要 ...

  9. spring boot 整合 spring cache 简单使用

    spring boot 整合 spring cache 简单使用 spring cache简介 使用spring cache spring cache简介 Spring 3.1起,提供了基于注解的对C ...

最新文章

  1. 【Android自定义控件】支持多层嵌套RadioButton的RadioGroup
  2. ping 不通 华为三层交换机vlan_华为交换机常用的三种vlan划分方法,一文了解清楚vlan...
  3. hdu 5274(树链剖分)
  4. 大数据WEB阶段Mybatis(二)
  5. 安装pytorch时,在安装 future-0.18.2.tar.gz (829 kB)时报错:ModuleNotFoundError: No module named ‘_ctypes’解决办法
  6. HTMLParser使用
  7. 苹果 5G 掉队?!
  8. Python 基础知识 D5
  9. forward计算机语言,const_forward在C中的可选实现中做了什么?
  10. 【java基础】重载与重写
  11. eclipse环境下基于已构建struts2项目整合spring+hibernate
  12. python 修改文件名 修改日期_python实现批量修改文件名
  13. css文字上浮div,css文字样式与div
  14. 中间件学习——J2EE中间件四步曲
  15. 打印机主流的指令类型(ESC命令集+CPCL命令集+TSPL命令集)...
  16. 日本企业家稻盛和夫的思想智慧
  17. Netflix云原生微服务设计分析
  18. 2016 我的年终小结:一直在路上
  19. 【译】JavaScript中的Promises
  20. Linux操作命令分类详解 - 用户权限(三)

热门文章

  1. Android Studio——类微信界面设计
  2. 使用朴素贝叶斯进行个人信用风险评估
  3. 常见的几种页面内容布局方式
  4. Cloud IDEs For Web Developers – Best Of
  5. 揭开木马的神秘面纱 2
  6. linux磁盘阵列教程,RAID 磁盘阵列简述
  7. c语言 大写英文字母
  8. 基于摄像头实现手写输入字符功能(视频手写)
  9. “要吃鲷鱼到岛上钓”团队小结
  10. feign调用不经过网关