前边我们讲过了如何定义一个切面和如何实现Spring的AOP面向切面编程,并讲述了五种类型的通知:前置、后置、返回、异常和环绕。拿前置通知来说,我们首先需要在Spring的IOC容器之中定义一个类似于动态代理的自动动态代理器,它的功能是将切面类的对象自动的进行动态代理的处理--<aop:aspect-autoproxy></aop:aspect-autoproxy>。然后是定义一个普通的Java类,这个类需要被IOC容器管理,所以@Component,并且将这个类定义为一个切面@Aspect;我们在这个类中定义一系列的方法,并在每个方法上声明通知类型和切面表达式:@Before("execution (public void com.liucc.proxy.Myproxy.*(int ,int ))");还有当有多个切面类作用于同一个方法上时,我们可以在切面类上定义切面的优先级来说明切面的执行的先后顺序,@Order(1),值越小,优先级越高。今天我们来讲一讲重用切面表达式的内容。
我们在前边讲过,切面表达式就是指明当前类型的通知在哪一个方法上运行,形如:execution(public void com.liucc.proxy.MyProxy.*(int,int))就是切面表达式。当一个类中有多种通知或者多个通知时,那么相同的切面表达式我们就要写好几次,而且这一个切面表达式也无法在类外部使用,为了解决切面表达式的重用性问题,我们在这个类中使用重写的切面 表达式来解决。即我们在这个类中重写定义一个方法,使用@JoinPoint("execution ( public void com.liucc.proxy.MyProxy.*(int,int)) ")标注这个方法,这样一个重写的切面表达式方法就完成了。
重写切面表达式的方法完成之后,我们就可以在其他的通知型注解中的value值进行引用了,在同类中我们直接使用方法名来引用@Before("methodName()"),在同包下的其他类中,还要加上类名;在其他包中,还要加上包名来引用。