博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP
阅读量:6983 次
发布时间:2019-06-27

本文共 2677 字,大约阅读时间需要 8 分钟。

@Before 前置通知

import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;@Aspectpublic class BeforeExample {    @Before("execution(* com.xyz.myapp.dao.*.*(..))")    public void doAccessCheck() {        // ...    }}

@AfterReturning 返回通知

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

import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.AfterReturning;@Aspectpublic class AfterReturningExample {    @AfterReturning("execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())")    public void doAccessCheck() {        // ...    }}

获取返回值

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

import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.AfterReturning;@Aspectpublic class AfterReturningExample {    @AfterReturning(        pointcut="execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())",        returning="retVal")    public void doAccessCheck(Object retVal) {        // ...    }}

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

@AfterThrowing 异常通知

import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.AfterThrowing;@Aspectpublic 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;@Aspectpublic 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@Aspectpublic 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(): 打印建议方法的描述.

转载地址:http://gatpl.baihongyu.com/

你可能感兴趣的文章
SCCM 2007 R2部署、操作详解系列之部署篇
查看>>
hystrix thread pool Metrics
查看>>
MDT2012部署问题,MDT中的驱动是如何工作的
查看>>
注意;
查看>>
Selenium 使用要点记录<二>
查看>>
Windows与Linux系统拷贝文件之pscp的使用
查看>>
_xmlXPathNewContext", referenced from
查看>>
Netty3之ServerBootstrap分析
查看>>
小木木的Python学习笔记
查看>>
用SQL语句添加删除修改字段
查看>>
查md5或者sha1值
查看>>
spring MVC(2)--注解Hello World
查看>>
httpclient 小例子编写
查看>>
我的友情链接
查看>>
修改了系统时间后,myeclipse 和tomcat下的代码不同步了
查看>>
IDEA 一直不停的scanning files to index解决办法
查看>>
运维少年系列 python and cisco (1)
查看>>
c#时间转换
查看>>
调度器Quartz的简述与使用总结
查看>>
smokeping 安装
查看>>