1.自定义一个注解,对标识了这个注解的方法进行拦截
package com.ruoyi.wx.api.annotation;
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface User {
String value() default "";
}
2.添加拦截器,实现MethodInterceptor接口。
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Object result = null;
try {
System.out.println("方法执行之前:" + methodInvocation.getMethod().toString());
String name = methodInvocation.getMethod().getName();
System.out.println(name + "开始执行");
result = methodInvocation.proceed();
System.out.println("方法执行之后的响应结果:" + result.toString());
return result;
} catch (Exception e) {
e.printStackTrace();
return result;
}
}
}
3.配置Advisor,将切点,拦截器加入到DefaultPointcutAdvisor中。
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AopConfig {
// 拦截方法的SpEL表达式,这里表示拦截标记了TestInterceptor注解的方法
public static final String traceExecution = "@annotation(com.ruoyi.wx.api.annotation.User)";
/**
* 对切点进行增强
*/
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor() {
// 创建拦截器
MyMethodInterceptor interceptor = new MyMethodInterceptor();
// 配置切点
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(traceExecution);
// 配置增强类advisor
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
advisor.setPointcut(pointcut);
advisor.setAdvice(interceptor);
return advisor;
}
}
4.新建controller测试
拦截加了@User注解的controller
没加注解之前: 正常输出
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/wx/api/")
public class Test1Controller {
@GetMapping("/test")
public AjaxResult test() {
String msg = "test: 这是我返回的数据";
System.out.println(msg);
return AjaxResult.success(msg);
}
}
加注解之后: 进拦截器
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/wx/api/")
public class Test1Controller {
@User
@GetMapping("/test")
public AjaxResult test() {
String msg = "test: 这是我返回的数据";
System.out.println(msg);
return AjaxResult.success(msg);
}
}