有如下aop处理类和service方法:
AOP处理类
@Service
@Aspect
public class AopHandler {
private static final String executionSring = "execution(* com.wl.study.aop.AopServiceImpl.test())";
@Around(executionSring)
public void handle(ProceedingJoinPoint point)throws Throwable{
System.out.println(1);
point.proceed();
System.out.println(2);
}
}
需要处理的service
@Service
public class AopServiceImpl implements AopService {
@Override
public void call(){
System.out.println("start call");
//通过AopContext获取AopService对象
AopService aopService = (AopService)AopContext.currentProxy();
//通过aopService对象进行调用
aopService.test();
}
@Override
public void testCall(){
//在这里直接调test方法,aop是不会生效的,正确的方法应该像call那样:先
//获取AopContext,然后转成AopService,使用aopService进行调用,注意在获取AopContext
//的时候,配置文件里的expose-proxy="true"记得上
test();
}
@Override
public void test(){
System.out.println("aop test");
}
}
调用入口:
public class Test {
public static void main(String[] args){
ClassPathXmlApplicationContext applicationContext = getContext();
AopService aopService = applicationContext.getBean(AopService.class);
//aopService.test();
aopService.call();
}
public static ClassPathXmlApplicationContext getContext(){
return new ClassPathXmlApplicationContext("aop.xml");
}
}
在切面处理中会对AopService 接口中的test()方法进行拦截处理,
在testCall方法里直接调用test,切面是不会起作用的。而在call方法里先获取AopContext对象,转成AopService之后,再调用则切面生效。
另外,配置文件还有个地方需要注意下,需要加上expose-proxy="true",这样才能拿到AopContext
<aop:aspectj-autoproxy expose-proxy="true"></aop:aspectj-autoproxy>
<context:component-scan base-package="com.wl.study"></context:component-scan>