环绕通知Around Advice就是在指定的程序前后均执行相关的服务,设计思路如下:
(1)设计一个接口。
package com.spring.service;
public interface IComponent {
public void bussiness1();
public void bussiness2();
public void bussiness3();
}
(2)编写这个接口的实现。
package com.spring.service;
public class Component implements IComponent{
@Override
public void bussiness1() {
// TODO Auto-generated method stub
System.out.println("这是业务1");
}
@Override
public void bussiness2() {
// TODO Auto-generated method stub
System.out.println("这是业务2");
}
@Override
public void bussiness3() {
// TODO Auto-generated method stub
System.out.println("这是业务3");
}
}
(3)编写前置通知的逻辑代码,该代码必须实现org.aopalliance.intercept.Method Interceptor接口,需要的服务都写在这里。
(4)编写XML配置文件,通过代理来实现AOP的环绕通知,看一下org.aopalliance.intercept.MethodInterceptor接口的源代码。该接口不是Spring内部的接口,而是AOP Alliance标准所指定的,不过Spring对这个接口有一个具体的实现过程,同时该接口相融所有遵守AOP Alliance标准的所有AOP框架。
环绕通知相当于前置通知和后置通知的结合,不同的是在MethodInterceptor的invoke()方法中,可以自由地使用MethodInvocation提供的proceed()方法来执行目标对象的方法,同时proceed()方法将会返回目标方法执行后的返回结果,在invoke方法结束前还可以修改该结果,下面还是以上面的那个例子来示范一下环绕通知的应用。
编写一个环绕通知的类,该类实现MethodInterceptor接口。这里调用了MethodInvocation的proceed()方法,也就是说,调用了目标对象Component中的business1等方法,在这个方法的前后分别增加了验证和通知执行,接着修改一下配置文件,去掉前置通知和后置通知的配置,只需要将这个环绕通知添加进去就可以了,具体代码如下:
这里只需要配置一个环绕通知的Bean,并且将这个Bean配置到interceptorNames中就完成了所有的工作,测试代码与前面的相同,可以看到结果也与前面的相同。