SpringBoot自定义注解,实现自定义方法

1.添加所需要的依赖

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

2.包名目录如图所示
SpringBoot自定义注解,实现自定义方法_第1张图片
3.AddLog.java文件 (注解文件)

package com.aivoicetech.annotion;

import java.lang.annotation.*;

/**
 * @Documented  指定被标注的注解会包含在javadoc中。
 * @Inherited   代表此注解是元注解,表示此注解在类上使用时,其子类也会继承此注解
 * @Retention   RetentionPolicy.SOURCE : 在编译阶段丢弃  RetentionPolicy.CLASS : 在类加载的时候丢弃  RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解
 * @Target      指定子类可以继承父类的注解,只能是类上的注解,方法和字段的注解不能继承。即如果父类上的注解是@Inherited修饰的就能被子类继承。
 */
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AddLog {//Annotation 类型定义为@interface, 所有的Annotation 会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口。  AddLog为注解名称

    /**
     * 注解的属性值(可以为基本类型和String、Enum、Class、annotations等数据类型,以及这些类型的数组.)
     * 只能用public 或默认(default) 这两个修饰符修饰
     */
    String[] value() default {};

}

4.AddLogAop.java (自定义注解要实现的功能)

package com.aivoicetech.annotion;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 添加日志Aop切面
 * @Aspect    告诉spring这是一个切面
 * @Component 将切面交由spring来管理;
 */
@Aspect
@Component
public class AddLogAop {

    private static final Log log = LogFactory.getLog(AddLogAop.class);

    /**
     * 切入点
     */
    @Pointcut("@annotation(com.aivoicetech.annotion.AddLog)")
    private void getAddLogPointCut() {
    }

    /**
     * 切入面
     * 目标方法执行前需要做的事
     */
    @Before("@annotation(addLog)")
    public void doAddLog(JoinPoint joinPoint,AddLog addLog) {
        String[] value = addLog.value();
        log.info("使用了注解,value值为:"+Arrays.toString(value));
    }

    /**
     * 切入面
     * 目标方法执行完成后需要做的事
     */
    @After("@annotation(addLog)")
    public void afterExecute(JoinPoint joinPoint,AddLog addLog) {
        log.info("方法执行完成...");
    }

}

5.TestController.java (测试注解)

package com.aivoicetech.controller;

import com.aivoicetech.annotion.AddLog;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author ssy
 * @date 2022/7/12 11:33
 */
@RestController
public class TestController {

    @GetMapping("/test")
    @AddLog(value = "123")
    public String test(){
        System.out.println("方法执行中。。。");
        return "test";
    }

}

访问该接口,控制台打印如下
SpringBoot自定义注解,实现自定义方法_第2张图片
由此可见,注解使用成功

通过本案例进行改造,可以完成注解的其它功能,例如:添加日志、参数校验等等

你可能感兴趣的:(spring,boot,java,spring)