SpringBoot 自定義註解

參考博客:基於反射自定義註解
代碼下載地址:代碼

基於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,結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章