SpringBoot自定义注解

简介: 自定义注解算是比较实用的功能了,太多需要局部处理的地方,此处使用还是挺方便的。本文主要是自己整理笔记,一边以后查阅,也方便大家查看学习,知识点慢慢补充。就不再做过多描述了。直接整代码吧

一、jar
主要是用了aop原理

<dependency>
    <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

二、注解

annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):
@Documented –注解是否将包含在JavaDoc中
@Retention –什么时候使用该注解
@Target –注解用于什么地方,方法上METHOD、TYPE类上(类上不管不用,不知道为啥)

package net.cnki.common.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 
 * @author ZhiPengyu
 * @ClassName:    [UrlVerify.java]
 * @Description:  [自定义注解-标注需要校验接口多次重复无效请求的方法]
 * @CreateDate:   [2020年12月16日 上午9:27:27]
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UrlVerify {
    boolean required() default true;
}

三、执行
代码里也有注解,可以自行尝试。根据情况采用不同的方法,我一般使用环绕拦截。

package net.cnki.common.aspect;

import java.util.Hashtable;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * 获取方法请求头指定参数,根据自定义规则处理
 * @author ZhiPengyu
 * @ClassName:    [UrlVerifyAspect.java]
 * @Description:  [自定义切面]
 * @CreateDate:   [2020年12月16日 上午9:27:49]
 */
@Aspect
@Component
public class UrlVerifyAspect {
    public static final Logger logger = LoggerFactory.getLogger(UrlVerifyAspect.class);

    @Pointcut("@annotation(net.cnki.common.annotation.UrlVerify)")//切入点 自定义注解
    public void pointCut(){}
    
    //前置通知:方法执行前调用
    @Before("pointCut()")
    public String doBefore(){
        System.out.println("执行了before方法....");
        return "123";       
    }

    //后置通知: 方法执行后调用,若方法出现异常,不执行
    @AfterReturning("pointCut()")
    public void doAfterReturning(){
        System.out.println("执行了doAfterReturning方法....");
    }
    
    //最终通知:无论无何都会调用,类似于:try/catch中的finally
    @After("pointCut()")
    public void doAfter(){
        System.out.println("执行了after....");
    }

    //异常通知:方法抛出异常时执行
    @AfterThrowing("pointCut()")
    public void doAfterThrowing(){
        System.out.println("执行AfterThrowing方法....");
    }

    /**
     * 环绕通知
     * 既可以在目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作;
     * 可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标目标方法的执行;
     * 可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值; 当需要改变目标方法的返回值时,只能使用Around方法;
     */
    @Around("pointCut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        try {
            //--------------------方法执行前------------------------
            String packageName = joinPoint.getSignature().getDeclaringTypeName();
            String methodName = joinPoint.getSignature().getName();
            
            //--------------------方法执行后------------------------
            Object resultObject = joinPoint.proceed();
            return resultObject;
        } catch (Exception e) {
            return resultGenerator.getFreeResult(ResultCode.API_EXCEPTION);
        }
    }
}

四、使用
比较简单了

    @UrlVerify
    @RequestMapping(value = "test")
    public void test() {
        // 自己的逻辑
        
    }
相关文章
|
2月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
56 0
|
8天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
131 73
|
3月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
180 3
|
3天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
34 21
|
8天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
8天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
2月前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
47 4
|
2月前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
76 4
SpringBoot必须掌握的常用注解!
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
131 2
|
2月前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
57 2