Spring AOP注解

AOP 相关术语

  • Joinpoint(连接点):
    所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。
  • Pointcut(切入点):
    所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。
  • Advice(通知/增强):
    所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。
    通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
  • Introduction(引介):
    引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方
    法或 Field。
  • Target(目标对象):
    代理的目标对象。
  • Weaving(织入):
    是指把增强应用到目标对象来创建新的代理对象的过程。
    spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
  • Proxy(代理):
    一个类被 AOP 织入增强后,就产生一个结果代理类。
  • Aspect(切面):
    是切入点和通知(引介)的结合。

注解配置

@Aspect表明当前类是一个切面类

@Before

  • 作用:
    把当前方法看成是前置通知。
  • 属性:
    value:用于指定切入点表达式,还可以指定切入点表达式的引用。
//开启事务 
 @Before("execution(* com.dustdawn.service.impl.*.*(..))") 
 public void beginTransaction() { 
 try { 
 dbAssit.getCurrentConnection().setAutoCommit(false); 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 

@AfterReturning

  • 作用:
    把当前方法看成是后置通知。
  • 属性:
    value:用于指定切入点表达式,还可以指定切入点表达式的引用
//提交事务 
 @AfterReturning("execution(* com.dustdawn.service.impl.*.*(..))") 
 public void commit() { 
 try { 
 dbAssit.getCurrentConnection().commit(); 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 

@AfterThrowing

  • 作用:
    把当前方法看成是异常通知。
  • 属性:
    value:用于指定切入点表达式,还可以指定切入点表达式的引用
//回滚事务 
@AfterThrowing("execution(* com.dustdawn.service.impl.*.*(..))") 
public void rollback() { 
try { 
dbAssit.getCurrentConnection().rollback(); 
} catch (SQLException e) { 
e.printStackTrace(); 
} 
} 

@After

  • 作用:
    把当前方法看成是最终通知。
  • 属性:
    value:用于指定切入点表达式,还可以指定切入点表达式的引用
//释放资源 
@After("execution(* com.dustdawn.service.impl.*.*(..))") 
public void release() { 
try { 
dbAssit.releaseConnection(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 

在 spring 配置文件中开启 spring 对注解 AOP 的支持

<!-- 开启 spring 对注解 AOP 的支持 --> 
<aop:aspectj-autoproxy/> 

环绕通知注解配置

@Around

  • 作用:
    把当前方法看成是环绕通知。
  • 属性:
    value:用于指定切入点表达式,还可以指定切入点表达式的引用。
/** 
 * 环绕通知 
 * @param pjp 
 * @return 
 */ 
 @Around("execution(* com.dustdawn.service.impl.*.*(..))") 
 public Object transactionAround(ProceedingJoinPoint pjp) { 
 //定义返回值 
 Object rtValue = null; 
 try { 
 //获取方法执行所需的参数 
 Object[] args = pjp.getArgs(); 
 //前置通知:开启事务 
 beginTransaction(); 
 //执行方法 
 rtValue = pjp.proceed(args); 
 //后置通知:提交事务 
 commit(); 
 }catch(Throwable e) { 
 //异常通知:回滚事务 
 rollback(); 
 e.printStackTrace(); 
 }finally { 
 //最终通知:释放资源 
 release(); 
 } 
 return rtValue; 
 } 

切入点表达式注解

@Pointcut

  • 作用:
    指定切入点表达式
  • 属性:
  • value:指定表达式的内容
 
@Pointcut("execution(* com.dustdawn.service.impl.*.*(..))") 
private void pt1() {} 
 
引用方式: 
 /** 
 * 环绕通知 
 * @param pjp 
 * @return 
 */ 
 @Around("pt1()")//注意:千万别忘了写括号 
 public Object transactionAround(ProceedingJoinPoint pjp) { 
 //定义返回值 
 Object rtValue = null; 
 try { 
 //获取方法执行所需的参数 
 Object[] args = pjp.getArgs(); 
 //前置通知:开启事务 
 beginTransaction(); 
 //执行方法 
 rtValue = pjp.proceed(args); 
 //后置通知:提交事务 
 commit(); 
 }catch(Throwable e) { 
 //异常通知:回滚事务 
 rollback(); 
 e.printStackTrace(); 
 }finally { 
 //最终通知:释放资源 
 release(); 
 } 
 return rtValue; 
 } 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值