最近在做项目时要求在请求控制层时要打印传入的参数,一般的做法就是把请求的参数bean toString(),一下,Logger 打印出来,但是感觉这种很麻烦,每一个方法都要加这一行代码,那么就想到Spring AOP 面向切面编程,我们可以在被请求的方法前加一个通知,然后获取请求的参数,然后输出来,这样岂不是很方便,要输出的方法前只需要添加注解就好了。废话不说了,直接上代码
1 定义注解类 ShowParams.java
package aop;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ShowParams {
String requestUrl();
}
2 实现切面类
package aop;
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
@Aspect //AOP 切面
@Component
public class ShowParamsAspect {
// 定义切点
@Pointcut(value = "@annotation(ShowParams)")
private void pointcut() {
}
// 定义环绕通知
@Around(value = "pointcut() && @annotation(showParams)")
public Object around(ProceedingJoinPoint point, ShowParams showParams) {
// 请求的URL
String requestUrl = showParams.requestUrl();
//拦截的类名
Class clazz = point.getTarget().getClass();
//拦截的方法
Method method = ((MethodSignature) point.getSignature()).getMethod();
// 输出参数
for(Object o : args){
System.out.println(o.toString());
}
System.out.println("执行了 类:" + clazz + " 方法:" + method + " 自定义请求地址:" + requestUrl);
try {
return point.proceed(); //执行程序
} catch (Throwable throwable) {
throwable.printStackTrace();
return throwable.getMessage();
}
}
// 返回之后的通知
@AfterReturning(value = "pointcut() && @annotation(showParams)", returning = "result")
public Object afterReturning(JoinPoint joinPoint, ShowParams showParams, Object result) {
System.out.println("执行结果:" + result);
return result;
}
// 抛出异常后的通知
@AfterThrowing(value = "pointcut() && @annotation(showParams)", throwing = "ex")
public void afterThrowing(JoinPoint joinPoint, ShowParams showParams, Exception ex) {
System.out.println("请求:" + showParams.requestUrl() + " 出现异常"+ex.getMessage());
}
}
3 使用自定义注解
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import aop.ShowParams;
@Controller
@RequestMapping("/hello")
public class helloController{
@RequestMapping(method = RequestMethod.GET)
@ShowParams(requestUrl = "/index")
public String printHello(@ModelAttribute Student student) {
return "MyJsp";
}
}
4 写在最后,其实在真正用的时候当然不会用System.out.println()啦,会用标准日志输出。其实一个比较大的问题都是由一个很简单的小问题积累死来的,如果我们在开发过程中不断的积累,不断地学习,一定会成为一个高手。加油