AspactJ常见注解
?
@Pointcat:定义切入点
@Before:前置通知,调用匹配方法之前执行
@AfterReturning:后置通知,通常在一个方法返回的时候执行
@AfterThrowing:异常通知,抛出异常通知在一个方法抛出异常后执行
@After:最终通知,不论一个方法是如何结束的,最终通知都会运行,通常用它来释放资源。
@Around:环绕通知,环绕通知在一个方法执行之前和之后执行,它使得一个通知有机会在方法之前和之后进行,而且它可以决定一个方法什么时候执行,如何执行,甚至是否执行。
?
Pointcat
切入点表达式execution(*test(*))&&args(param)
例:@Pointcut("execution(public void com.mihe.dao.impl.StudentDaoImpl.*Student())")
起首execution(*test(*))匹配任何方法名为test,且有一个任何类型的参数
args(param)可以匹配参数
修饰符是可选的
返回值是必填的,但可以用*表示统配
类型声明可选,也可以是任何类型
方法名必填,但也可以用*做模糊匹配,比如上例就是匹配所有以Student结尾的方法
参数列表:
()表示没有参数
(..)表示匹配接收任意个参数
(..,java.lang.String)表示匹配最后一个参数是字符串,前面可以有任意多个任意类型的参数
(*,java.lang.String)表示匹配最后一个参数是字符串,前面只可以有一个任意类型的参数
异常也可以匹配,全名就可以,如果有负数个就用都好分割。
?
AspectJ的xml实现
在Srping配置文件中,所有AOP相关的定义必须放在<aop:config>标签下,该标签下可以有<aop:pointcut><aop:advisor><aop:aspect>标签,配置顺序不可变
<aop:pointcut>用来定义切入点,该切入点可以重用
<aop:advisor>用来定义只有一个通知和一个切入点的切面
<aop:aspect>用来定义切面,该切面可以定义多个切入点和通知,而且标签内部通知和切入点是无序的,
?
配置切入点
<aop:pointcut expression="execution(public void com.mihe.dao.impl.StudentDaoImpl.*Student())" id="studentPointcat"/>
配置切面
?<aop:aspect id="studentAspect" ref="studentAspectJInterceptor">
?<aop:before method="beforeMetord" pointcut-ref="studentPointcat"/>
?<aop:after-returning method="afterReturningMetord" ?pointcut-ref="studentPointcat" returning="s"/>
?</aop:aspect>
?
?