MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,不仅仅controller中的方法
自定义拦截器,实现MethodInterceptor
接口的invoke()
方法
package com.wang.chao.micro.interceptor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("MyMethodInterceptor "+methodInvocation.getMethod().getName());
return methodInvocation.proceed();
}
}
案例一
使用aspectj execution
表达定义切点;使用 AspectJExpressionPointcut
定义切点并注册
package com.wang.chao.micro.interceptor.config;
import com.wang.chao.micro.interceptor.MyMethodInterceptor;
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 InterceptorConfig {
public static final String traceExecution = "execution(* com.wang.chao.micro..*.*(..))";
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor(){
MyMethodInterceptor methodInterceptor = new MyMethodInterceptor();
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(traceExecution);
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
advisor.setPointcut(pointcut);
advisor.setAdvice(methodInterceptor);
return advisor;
}
}
案例二
与案例一的主要区别是用JdkRegexpMethodPointcut
来构造切点
package com.wang.chao.micro.interceptor.config;
import com.wang.chao.micro.interceptor.MyMethodInterceptor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class InterceptorConfig {
public static final String traceExecution = "execution(* com.wang.chao.micro..*.*(..))";
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor() {
MyMethodInterceptor methodInterceptor = new MyMethodInterceptor();
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
//case 1
// AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
// pointcut.setExpression(traceExecution);
//case 2
JdkRegexpMethodPointcut pointcut2 = new JdkRegexpMethodPointcut();
pointcut2.setPattern("com.wang.chao.micro.*");
advisor.setPointcut(pointcut2);
advisor.setAdvice(methodInterceptor);
return advisor;
}
}
案例三
自定义注解 AspectJExpressionPointcut
package com.wang.chao.micro.interceptor.annotation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InterceptorAnnotation {
}
package com.wang.chao.micro.interceptor.config;
import com.wang.chao.micro.interceptor.MyMethodInterceptor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class InterceptorConfig {
public static final String traceAnnotationExecution = "@annotation(com.wang.chao.micro.interceptor.annotation.InterceptorAnnotation)";
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor() {
MyMethodInterceptor methodInterceptor = new MyMethodInterceptor();
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
//case 3
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(traceAnnotationExecution);
advisor.setPointcut(pointcut);
advisor.setAdvice(methodInterceptor);
return advisor;
}
}
案例四
自定义注解 AnnotationMatchingPointcut
package com.wang.chao.micro.interceptor.config;
import com.wang.chao.micro.interceptor.MyMethodInterceptor;
import com.wang.chao.micro.interceptor.annotation.InterceptorAnnotation;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.aop.support.annotation.AnnotationMatchingPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class InterceptorConfig {
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor() {
MyMethodInterceptor methodInterceptor = new MyMethodInterceptor();
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
//case 4
AnnotationMatchingPointcut pointcut = new AnnotationMatchingPointcut(null, InterceptorAnnotation.class);
advisor.setPointcut(pointcut);
advisor.setAdvice(methodInterceptor);
return advisor;
}
}
测试类
package com.wang.chao.micro.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void saveUser(String name, String sex) {
System.out.println("name = " + name + ", sex = " + sex+" id =");
sayHello(name);
}
public void sayHello(String name){
System.out.println("Hello name = " + name+" Welcome in Spring Interceptor world");
}
}
请求调用测试
package com.wang.chao.micro.controller;
import com.wang.chao.micro.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value="/" ,method = RequestMethod.GET)
public void saveUser(String name,String sex){
userService.saveUser(name,sex);
}
}
启动调用测试
package com.wang.chao.micro;
import com.wang.chao.micro.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class Application {
@Autowired
private ApplicationContext applicationContext;
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(Application.class, args);
UserService userService=(UserService) applicationContext.getBean("userService");
userService.saveUser("wagnchao","nan");
userService.sayHello("wangchaochao");
}
}