基本概念:

AOP: Aspect Oriented Programming,即面向切面编程

指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式

  • 前置通知(@Before):在目标方法运行之前执行
  • 后置通知(@After):在目标方法运行结束之后执行(无论方法执行成功,还是出现异常,都执行)
  • 返回通知(@AfterReturning):在目标方法正常返回之后执行
  • 异常通知(@AfterThrowing):在目标方法出现异常后执行
  • 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())

返回通知和异常通知只能同时执行一个

基本使用:

  1. 导入aop依赖:Spring AOP(spring-aspects)

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.0.2.RELEASE</version>
    </dependency>
  2. 定义一个业务逻辑类

    public class MathCalculator {
    public int div(int a, int b){
    return a / b;
    }
    }
  3. 定义一个日志切面类,告诉 Spring 这个类是切面类(在切面类加上:@Aspect),并且,给目标方法标注“何时何地”执行(通知注解)

    • 切入点基本格式:权限修饰符 方法返回值 全方法名(参数列表类型) 异常类型,加粗的是必填项

    • 在@Before注解上引用,如果引用类外的切入点表达式,需要使用全方法名

    @Aspect
    public class LogAspects { //抽取公共的切入点表达式
    @Pointcut("execution(* com.spring.aop.MathCalculator.*(..))")
    public void pointCut(){
    } @Before("pointCut()")
    public void logStart() {
    System.out.println("方法运行");
    } @After("pointCut()")
    public void logEnd() {
    System.out.println("方法结束");
    } @AfterReturning("pointCut()")
    public void logReturn() {
    System.out.println("方法正常返回");
    } @AfterThrowing("pointCut()")
    public void logException() {
    System.out.println("方法出现异常");
    }
    }
  4. 将切面类和业务逻辑类(目标方法所在类)都注册到ioc容器中,注册的几种方式可以参考前面的博客Spring注解 - 组件的注册

    @Bean
    public MathCalculator mathCalculator(){
    return new MathCalculator();
    } @Bean
    public LogAspects logAspects(){
    return new LogAspects();
    }
  5. 开启基于注解的AOP模式(在配置类加上:@EnableAspectJAutoProxy

    @Configuration
    @EnableAspectJAutoProxy
    public class SpringConfiguration
  6. 测试一把

    @Test
    public void test1(){
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration6.class);
    MathCalculator mathCalculator = (MathCalculator) applicationContext.getBean("mathCalculator");
    mathCalculator.div(2, 1);
    }

    运行结果:

    -----正常运行-----
    方法运行
    方法结束
    方法正常返回
    -------异常------
    方法运行
    方法结束
    方法出现异常

但上述输出的内容太简单了,如果想要得到方法具体信息怎么办?我们对切面类做一些改造

@Aspect
public class LogAspects { @Pointcut("execution(* com.spring.aop.MathCalculator.*(..))")
public void pointCut() {
} @Before(value = "pointCut()")
public void logStart(JoinPoint joinPoint) {
//参数列表
Object[] args = joinPoint.getArgs();
//方法名
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName + "方法运行,参数列表:" + Arrays.toString(args));
} @After("pointCut()")
public void logEnd(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName + "方法结束");
} @AfterReturning(value = "pointCut()", returning = "returnInfo")
public void logReturn(JoinPoint joinPoint, Object returnInfo) {
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName + "方法正常返回,返回值:" + returnInfo);
} @AfterThrowing(value = "pointCut()", throwing = "exception")
public void logException(JoinPoint joinPoint, Exception exception) {
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName + "方法出现异常,异常信息:" + exception);
}
}

运行结果:

-----正常运行-----
div方法运行,参数列表:[2, 1]
div方法结束
div方法正常返回,返回值:2
-------异常------
div方法运行,参数列表:[2, 0]
div方法结束
div方法出现异常,异常信息:java.lang.ArithmeticException: / by zero

注意:参数joinPoint一定要放在参数表的第一位

Spring注解 - AOP 面向切面编程的更多相关文章

  1. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  2. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  3. Spring的AOP面向切面编程

    什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...

  4. Spring框架——AOP面向切面编程

    简介 AOP练习 使用动态代理解决问题 Spring AOP 用AspectJ注解声明切面 前置后置通知 利用方法签名编写AspectJ切入点表达式 指定切面的优先级 基于XML的配置声明切面 Spr ...

  5. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  6. spring:AOP面向切面编程02

    参考: https://blog.csdn.net/jeffleo/article/details/54136904 一.AOP的核心概念AOP(Aspect Oriented Programming ...

  7. Spring之AOP(面向切面编程)_入门Demo

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

  8. spring:AOP面向切面编程(注解)03

    使用注解写aop时最好使用环绕通知写 切面类: /** * 用于记录日志的工具类,它里面提供了公共的代码 */ @Component("logger") @Aspect //表示当 ...

  9. 【spring源码学习】spring的AOP面向切面编程的实现解析

    一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口.在spring aop中主要描述围绕方法调用而注入的切面行为.(2)spring定义了几个时刻织入增强行为的接口  => ...

随机推荐

  1. Serializable 接口(序列化)

    目录 Serializable 接口(序列化) 前言 用途 如何实现 异常 serialVersionUID transient关键字 Serializable 接口(序列化) 前言 查看API文档时 ...

  2. 0-1背包问题-DP

    中文理解: 0-1背包问题:有一个贼在偷窃一家商店时,发现有n件物品,第i件物品价值vi元,重wi磅,此处vi与wi都是整数.他希望带走的东西越值钱越好,但他的背包中至多只能装下W磅的东西,W为一整数 ...

  3. python 写个冒泡排序吧

    冒泡排序 介绍: 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作 ...

  4. 第一次提交本地代码到github上

    上传本地项目到github: 一.SSH方式 配置ssh 进入你要上传项目中的文件夹 1)先配置ssh,输入 ssh-keygen -t rsa -C "your_email@example ...

  5. Acwing 843. n-皇后问题

    n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行.同一列或同一斜线上. 现在给定整数n,请你输出所有的满足条件的棋子摆法. 输入格式 ...

  6. 网络字体反爬之pyspider爬取起点中文小说

    前几天跟同事聊到最近在看什么小说,想起之前看过一篇文章说的是网络十大水文,就想把起点上的小说信息爬一下,搞点可视化数据看看.这段时间正在看爬虫框架-pyspider,觉得这种网站用框架还是很方便的,所 ...

  7. 联想拯救者y7000使用体验

    前言 我以前的电脑是在电商平台买的二手电脑,期间觉得软件的运行速度慢,又在网上买了一个128G的固态硬盘安装上.就从大一到大四上学期这么使用了三年半的时间.因为自己需要运行一些吃内存的软件,而我的这个 ...

  8. 使用HtmlAgilityPack和ScrapySharp抓取网页数据遇到的几个问题解决方法——格式编码问题

    需要用到对应市区县街道居委会的区域编码,于是找到统计局的网页,对这些数据进行抓取,用到了HtmlAgilityPack和ScrapySharp,由于也是第一次从网页抓取数据,所以对于HtmlAgili ...

  9. 前端JS题

    题目如下: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function ( ...

  10. linux安装国产数据库(金仓数据库,达梦数据库,南大通用数据库)

    今天在公司做的任务是,在Linux的环境下安装三种数据库,结果一种数据库也没有安装好,首先遇到的问题是安装南大通用数据库遇到安装的第五步,就出现问题了,问题是Gbase SDK没有安装成功,以及Gba ...