资讯专栏INFORMATION COLUMN

Spring AOP

Charles / 2615人阅读

摘要:前置通知返回通知当匹配的方法执行正常返回时运行获取返回值当我们想获取到某个方法的返回值时可以使用如下方式表示返回值类型这里使用的是类型我们也可以设置指定类型例如异常通知表示当抛出的是异常时才会调用此方法后置通知当匹配的方法执行完成后运行围绕

@Before 前置通知
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class BeforeExample {

    @Before("execution(* com.xyz.myapp.dao.*.*(..))")
    public void doAccessCheck() {
        // ...
    }

}
@AfterReturning 返回通知

当匹配的方法执行正常返回时运行.

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;

@Aspect
public class AfterReturningExample {

    @AfterReturning("execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())")
    public void doAccessCheck() {
        // ...
    }

}
获取返回值

当我们想获取到某个方法的返回值时, 可以使用如下方式:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;

@Aspect
public class AfterReturningExample {

    @AfterReturning(
        pointcut="execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())",
        returning="retVal")
    public void doAccessCheck(Object retVal) {
        // ...
    }

}

returning 表示返回值类型, 这里使用的是 Object 类型, 我们也可以设置指定类型 例如 List.

@AfterThrowing 异常通知
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;

@Aspect
public class AfterThrowingExample {

    @AfterThrowing(
        pointcut="execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())",
        throwing="ex")
    public void doRecoveryActions(DataAccessException ex) {
        // ...
    }

}

throwing 表示当抛出的是 DataAccessException 异常时, 才会调用此方法.

@After 后置通知

当匹配的方法执行完成后运行.

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.After;

@Aspect
public class AfterFinallyExample {

    @After("execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())")
    public void doReleaseLock() {
        // ...
    }

}
@Around 围绕通知

在匹配的方法执行前后执行.

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AroundExample {

    @Around("execution(* com.example.demo.sss.TestService.*())")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("执行目标方法之前...");
        Object retVal = pjp.proceed();
        System.out.println("执行目标方法之后...");
        return retVal + " ---> 1111";
    }

}

该方法的第一个形参必须是 ProceedingJoinPoint 类型, 在方法体中调用 proceed 方法才会执行目标方法; 如果程序没有调用 proceed 方, 目标方法不会执行.

调用 proceed 方法时, 还可以传入一个 Object[] 对象, 该数组中的值将被传入目标方法作为实参. 如果传入的 Object[] 数组长度与目标方法所需要的参数个数不相等, 或者 Object[] 数组元素与目标方法所需参数的类型不匹配, 程序就会抛出异常.

获取通知参数

任何通知方法都可以声明一个类型为 org.aspectj.lang.JoinPoint 的参数, 作为它的第一个参数 JoinPoint 接口提供了许多有用的方法:

getArgs(): 返回方法参数.

getThis(): 返回代理对象.

getTarget(): 返回目标对象.

getSignature(): 返回建议的方法的描述.

toString(): 打印建议方法的描述.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72541.html

相关文章

  • Spring AOP就是这么简单啦

    摘要:是一种特殊的增强切面切面由切点和增强通知组成,它既包括了横切逻辑的定义也包括了连接点的定义。实际上,一个的实现被拆分到多个类中在中声明切面我们知道注解很方便,但是,要想使用注解的方式使用就必须要有源码因为我们要 前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知...

    Jacendfeng 评论0 收藏0
  • Spring入门IOC和AOP学习笔记

    摘要:入门和学习笔记概述框架的核心有两个容器作为超级大工厂,负责管理创建所有的对象,这些对象被称为。中的一些术语切面切面组织多个,放在切面中定义。 Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理、创建所有的Java对象,这些Java对象被称为Bean。 Spring容器管理容器中Bean之间的依赖关系,使用一种叫做依赖...

    wenyiweb 评论0 收藏0
  • 慕课网_《Spring入门篇》学习总结

    摘要:入门篇学习总结时间年月日星期三说明本文部分内容均来自慕课网。主要的功能是日志记录,性能统计,安全控制,事务处理,异常处理等等。 《Spring入门篇》学习总结 时间:2017年1月18日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://git...

    Ververica 评论0 收藏0
  • Spring AOP的实现原理

    摘要:使用与的静态代理不同,使用的动态代理,所谓的动态代理就是说框架不会去修改字节码,而是在内存中临时为方法生成一个对象,这个对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。 AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存...

    ephererid 评论0 收藏0
  • Spring笔记03_AOP

    摘要:介绍什么是在软件业,为的缩写,意为面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。切面是切入点和通知引介的结合。切面类权限校验。。。 1. AOP 1.1 AOP介绍 1.1.1 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术...

    blair 评论0 收藏0
  • Spring AOP 源码分析系列文章导读

    摘要:在写完容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了天时间阅读了方面的源码。从今天开始,我将对部分的源码分析系列文章进行更新。全称是,即面向切面的编程,是一种开发理念。在中,切面只是一个概念,并没有一个具体的接口或类与此对应。 1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解。在写完 Spring IOC 容器源码分析系列...

    张春雷 评论0 收藏0

发表评论

0条评论

Charles

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<