基於AOP實現
第一步:創建SpringBoot項目,添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第二步:註解類
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
String value() default "";
}
第三步:註解功能實現類
@Component
@Aspect
public class MyAnnotationAspectImpl {
@Pointcut("@annotation(com.hc.demo.MyAnnotation)")
private void pointCut() {
System.out.println("pointCut");
}
@Around("pointCut()")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("around 1");
try {
joinPoint.proceed();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("around 2");
}
@Before("pointCut()")
public void before() {
System.out.println("before");
}
@After("pointCut()")
public void after() {
System.out.println("after");
}
}
第三步: 測試Controller
@RestController
public class DemoController {
@MyAnnotation
@GetMapping(value = "/fun1")
public void fun() {
// 自己的業務實現
System.out.println("fun1");
}
}
在網頁中請求fun1,結果:
基於Interceptor實現
第一步:創建SpringBoot項目,添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第二步: 自定義註解類
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
boolean required() default true;
}
第三步:註解攔截器
@Slf4j
public class MyAnnotationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
if (!(object instanceof HandlerMethod)) { // 如果不是映射到方法直接通過
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) object;
Method method = handlerMethod.getMethod();
//檢查是否有自定義註釋,有則定義相應功能
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
if (myAnnotation.required()) {
System.out.println("MyAnnotation註解被調用……");
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
第四步:攔截器配置類
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationInterceptor())
.addPathPatterns("/**"); //用於設置攔截器的過濾路徑規則
}
@Bean
public MyAnnotationInterceptor authenticationInterceptor() {
return new MyAnnotationInterceptor();
}
}
第五步: 測試Controller
@RestController
public class DemoController {
@MyAnnotation
@GetMapping(value = "/fun2")
public void fun() {
// 自己的業務實現
System.out.println("fun2");
}
}
在網頁中請求fun2,結果: