@Component
@Aspect
public class TestAop {
@Pointcut("execution(* com.chinadovey.parking.webapps.api.*.*(..))") //第一个* 不懂。第二个*代表类。第三个*代表方法名称。
private void pointCutMethod(){ } // aop的原理是代理(代理大概是基于反射),这里是指出代理哪个方法。
//声明前置通知
@Before("pointCutMethod()")
public void doBefore() {
System.out.println("前置通知");//
}
//声明后置通知
@AfterReturning(pointcut = "pointCutMethod()", returning = "result")
public void doAfterReturning(String result) {
System.out.println("后置通知");
System.out.println("---" + result + "---");
}
//声明例外通知
@AfterThrowing(pointcut = "pointCutMethod()", throwing = "e")
public void doAfterThrowing(Exception e) {
System.out.println("例外通知");
System.out.println(e.getMessage());
}
//声明最终通知
@After("pointCutMethod()")
public void doAfter() {
System.out.println("最终通知");//
}
//声明环绕通知
@Around("pointCutMethod()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("进入方法---环绕通知");//
JSONObject json = new JSONObject();
String methodName = joinPoint.getSignature().getName();//拿到执行的方法名称。不是URI
if(methodName.equals("getSynInfos")){
json = (JSONObject)joinPoint.proceed(); //拿到返回值。是代理执行该方法。json是方法的返回值。
System.out.println("json:"+json);
boolean result = (Boolean) json.get("result");
if(result == true){
//发消息给用户。
System.out.println("车位锁控制成功。");
}
}
System.out.println("退出方法---环绕通知");//
return json;
}
}
xml文件中需要配置 aop自动代理 <aop:aspectj-autoproxy />