AOP-Spring的面向切面编程

来源:互联网 发布:日本动漫知子 编辑:程序博客网 时间:2024/05/21 11:10

开始开发之前,
需要导入jar包有:
aopalliance.jar、aspectjweaver-1.6.6.jar 、spring-aspects-4.0.6.RELEASE.jar

配置文件中beans头部标签要加入
xmlns:aop=”http://www.springframework.org/schema/aop”

其xsi:schemaLocation要加入
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd”

之后就是对切面类等的配置

<bean id = "serviceAspect" class = "com.example.aspect.ServiceAspect">

切面相关配置

<aop:config>        // 此处定义的pointcut是全局的pointcut,可以供所有的aspect使用        // id:表示这个pointcut的名称        <aop:pointcut id="methodToBeAspected"                      expression="execution(* com.example.service..*.*(..))" />        // <aop:aspect>为定义一个切面类;id是切面类的名称;ref是引用哪个切面bean        <aop:aspect id="随意的name都可行" ref="serviceAspect">           //在此处定义的pointcut只是在当前的aspect使用;id表示这个pointcut的名称,以方便使用             <aop:pointcut id="methodToBeAspected2"                      expression="execution(* com.example.service..*.*(..))" />           //pointcut-ref是指哪个方法作为切点;method是指在切面类中的方法  before是指在切点方法methodToBeAspected2执行之前执行切面类的onBefore方法。            <aop:before method="onBefore" pointcut-ref="methodToBeAspected2"/>            <aop:after-returning method="onAfterReturning" pointcut="execution(* com.example.service..*.*(..))"/>        </aop:aspect>    </aop:config>

在切面类serviceAspect里面,比如
写onBefore方法

 public void onBefore(JoinPoint jp) { jp.getTarget().getClass().getName();//可以获取切点类名 jp.getSignature().getName()//可以获取切点的执行方法名 jp.getArgs()[0]获取传入参数值,数组类型 }

onAfter方法类似

public void onAfter(JoinPoint jp) { jp.getTarget().getClass().getName();//可以获取切点类名 jp.getSignature().getName()//可以获取切点的执行方法名 jp.getArgs()[0]获取传入参数值,数组类型 }

环绕通知

public Object onAround(ProceedingJoinPoint pjp) throws Throwable {//前Object obj = pjp.proceed()  //有返回值,切点方法的返回值,此处就是切点方法执行了 ...  //代码执行,自己写的监听代码 //后 return obj;}

其优先级在before后在after前

返回通知

public void onAfterReturning(JoinPoint jp) { jp.getTarget().getClass().getName();//可以获取切点类名 jp.getSignature().getName()//可以获取切点的执行方法名 jp.getArgs()[0]获取传入参数值,数组类型 }//像在环绕通知中切点方法执行后的返回值,一执行完就调用这个返回通知。

异常通知

public void onAfterThrowing(JoinPoint jp, Throwable ex  ) { jp.getTarget().getClass().getName();//可以获取切点类名 jp.getSignature().getName()//可以获取切点的执行方法名 jp.getArgs()[0]获取传入参数值,数组类型 }

这个在beans.xml文件中的配置除了pointcut-ref 和 method,还要throwing

附加:
第一个*代表所有的返回值类型

第二个*代表所有的类

第三个*代表类所有方法

最后一个..代表所有的参数。

比如:
任何返回值、com.example.service包中任何类中的任何方法、任何参数

execution(* com.example.service..(..))

任何返回值、com.example.service包中任何层次子包(..)、任何类、任何方法、任何参数

execution(* com.example.service...(..))

void 和 !void(非void)

execution(public void com.example.service...(..))

execution(public !void com.example.service...(..))

原创粉丝点击