基本概念:

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. when|nobody|hazard|lane|circuit|

    How can I help them  they won't listen to me? 题目解析 考查从句.此句意为:如果他们要是不听我的话,我怎么帮助他们?此处,when引导的状语从句表示假设事 ...

  2. apache启动但是无法访问网页

    apache启动但是访问不了的问题排除??? 端口没有被占用,则需要考虑防火墙问题. 首先我们需要确保远程的Linux系统已经安装好,我们使用xshell远程SSH登录到Linux系统里,同时我们也要 ...

  3. 吴裕雄--天生自然python学习笔记:Python3 正则表达式

    Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参 ...

  4. Soldier and Badges

    题目链接:https://vjudge.net/problem/CodeForces-546B AC代码: #include<iostream> #include<algorithm ...

  5. 机器学习技法笔记(2)-Linear SVM

    从这一节开始学习机器学习技法课程中的SVM, 这一节主要介绍标准形式的SVM: Linear SVM 引入SVM 首先回顾Percentron Learning Algrithm(感知器算法PLA)是 ...

  6. 从846家初创倒下 看A轮融资后的悬崖

    看A轮融资后的悬崖" title="从846家初创倒下 看A轮融资后的悬崖"> 相比往年,今年的寒冷冬天来得更早.在互联网行业,今年的"大雪"更 ...

  7. Hihocoder1456 Rikka with Lattice

    众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:勇太有一个$n times m$的点阵,他想要从这$n times m$个点中选出三个点 ${A,B,C}$,满足 ...

  8. Java8-19-lambda 重构代码

    通过本书的前七章,我们了解了Lambda和Stream API的强大威力. 你可能主要在新项目的代码中使用这些特性.如果你创建的是全新的Java项目,这是极好的时机,你可以轻装上阵,迅速地将新特性应用 ...

  9. 一致性哈希算法(consistent hashing)PHP实现

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...

  10. bzoj1603: [Usaco2008 Oct]打谷机 (纱布题)

    Description Input Output Sample Input Sample Output Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 7 ...