Spring In Action学习笔记-AOP

10月 4, 2014 |

pointcut定义:
execution(* cn.javacoder.aop.AopTest.test(..)) and bean(b123)
*表示任意的返回值
..表示任意参数
当id=b123的AopTest的test方法执行的时候,应用advice。

Aop的典型配置
<aop:config>
<aop:aspect ref="audience">
<aop:pointcut id="performance"expression=
"execution(* com.springinaction.springidol.Performer.perform(..))"/>
<aop:before pointcut-ref="performance" method="takeSeats" />
</aop:aspect>
</aop:config>
在Performer.perform()方法执行之前执行audience.takeSeats()方法。

around AOP的配置
public void watchPerformance(ProceedingJoinPoint ? joinpoint){
try {
//before advisor 逻辑
joinpoint.proceed();
//after advisor 逻辑
} catch(Throwable t){
//after throwing 逻辑
}
}

向advice传递参数
<aop:pointcut args(throughts)/>
<aop:before arg-names="throughts"/>

intruduction的使用
<aop:aspect>
<aop:declare-parents
types-matching="com.springinaction.springidol.Performer+"
implement-interface="com.springinaction.springidol.Contestant"
default-impl="com.springinaction.springidol.GraciousContestant"
/>
</aop:aspect>
default-impl能被delegate-ref替换,default-impl指定完整的类名,delegate-ref指定bean ID

基于注解的aspects

  • 类用@Aspect标注</li>
  • @Pointcut标注一个空的方法用于定义Pointcut
  • @Before("performance()") 标注在第二步的切入点之前执行,performance()表示第二步中的空函数名
  • <aop:aspectj-autoproxy/> 让基于注解的aspects生效,在spring的上下文中生成一个AnnotationAwareAspectJAutoProxyCreator,自动代理在@Aspect的Pointcut中标注的方法,从而实现aspect。

Posted in: spring practise

Comments are closed.