Spring AOP

AOP

AOP术语

作用:保证各步骤之间的良好隔离性,保证源代码的无关性。
AOP处理具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理

  • 切面(Aspect):业务流程运行的某个特定步骤,应用运行过程的关注点,通常称为横切关注点
  • 连接点(JoinPoint):程序执行过程中明确的点,如方法的调用,异常的抛出
    -增强处理(Advice):AOP特点切入点执行的增强处理,如before、around等
  • 切入点(PointCut):可以插入增强处理的连接点

Annotation方式的AOP

首先保证XML配置文件有下面一句来启动AspectJ支持:

 <aop:aspectj-autoproxy/>

或者不在XML中配置,但要在配置文件中加上

<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator">
Aspect

使用@Aspect注解即可

增强处理
Before

使用Before时需要指定Value值,表示切入点

@Aspect
public class BeforeAdvice{
    @Before("execution(* org.crazyint.app.service.impl.*.*(...))")
    public void before(){...}
}

@Before会在程序执行前加入增强…一切都是在主程序无知条件下进行的

AfterReturning

在目标方法正常完成后被加入,依然要指定value(PointCut),可以指定returning,可通过该形参访问目标方法返回值

@Aspect
public class AfterReturningAdvice{
    @AfterReturing(returning="rvt",pointcut=execution(org.crazyint.app.service.impl.*.*(...))")
    public void log(Object rvt){
        System.out.println(rvt);
    }
AfterThrowing

用于处理程序中未处理的异常,也需要指定value,并需要指定throwing,用来访问目标方法所抛出的异常

@Aspect
public class AfterThrowingAdvice{
    @AfterThrowing(throwing="ex",pointcut="exectution(..)")
    public void Throwing(Throwable ex){System.out.println(ex)}
}
After

用于目标方法成功完成后加入,和Before相似,不叙述

Around

功能十分强大,近似于Before和AfterThrowing,但是需要在线程安全的环境中使用,没有必要使用Around增强处理
使用Around时,需要将第一个参数定义为ProceedingJoinPoint,为JoinPoint的子类

访问目标方法参数

访问目标方法需要将定义增强处理方法时将第一个参数定义为JoinPoint类型
,JointPoint有如下常用方法

  • Object[] getArgs():返回执行目标方法时的参数
  • Signature getSignature():返回被增强的方法的相关信息
  • Object getTarget(): 返回被加入增强处理的目标对象
  • Object getThis():返回AOP框架为目标对象生成的代理对象
定义切入点
@Aspect 
public class SystemArchitecture{
    @PointCut("exectution(* org.crazyint.app.service.impl.Chain*.say(...))")
    public void myPoint(){

    }
}

引用切入点

@Aspect
public class usePoint{
    @before(pointcut="SystemArchitecture.myPoint()")
    public void example(){...}
}
切入点指示符
  • execution :匹配执行方法的连接点,用于表达式开头
  • modifiers-pattern :指定方法修饰符,支持通配符,可以省略
  • ret-type-pattern :指定方法返回值类型,可以用*表示
  • declare-type-pattern :指定方法所属的类,可以省略
  • name-pattern :指定匹配的方法名,用*匹配所有方法
  • param-pattern :指定方法声明的形参列表,支持两个通配符,*和…
  • throws-pattern :指定方法抛出的异常
  • within :限定匹配类型的连接点
  • this :用于限定AOP代理必须是指定类型的实例,匹配对象所有连接点
  • target :限定目标对象必须是指定类型的实例,匹配对象所有的连接点
  • args :要求参数类型是指定类型的实例
  • && :要求连接点同时匹配两个切入点表达式
  • ||:要求连接点匹配任意一个切入点表达式
  • !:要求连接点不匹配指定切入点表达式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值