zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Spring 自定义注解使用案例 首先创建一个注解@interface

Spring案例 一个 创建 自定义 注解 interface 首先
2023-09-14 09:02:02 时间

在Spring中使用自定义注解的本质就是使用Spring 的 AOP编程。

首先创建一个注解@interface

import org.springframework.data.mongodb.core.mapping.Document;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Document
public @interface Zhangxueliang {
    String value();
}

编写一个切面类,获取注解@Zhangxueliang信息,并对@Zhangxueliang标注的方法进行切面编程

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;

/**
 * @ProjectName springbootdemo_src
 * @ClassName AnnotationAspect
 * @Desicription TODO
 * @Author Zhang Xueliang
 * @Date 2019/5/15 11:23
 * @Version 1.0
 **/
@Aspect
@Component
@Slf4j
public class AnnotationAspect {
    @Pointcut("@annotation(com.zhangxueliang.demo.springbootdemo.annotation.Zhangxueliang)")
    public void annotationPointCut() {

    }
    @Before("annotationPointCut()")
    public void before(JoinPoint joinPoint){
        MethodSignature sign =  (MethodSignature)joinPoint.getSignature();
        Method method = sign.getMethod();
        Zhangxueliang annotation = method.getAnnotation(Zhangxueliang.class);
        System.out.println("打印:"+annotation.value()+" 开始前");
    }
    @Around("annotationPointCut()")
    public Object advice(ProceedingJoinPoint joinPoint){
        System.out.println("通知之开始");
        Object resultMsg=null;
        try {
            resultMsg=joinPoint.proceed();
            System.err.println("++++++++"+resultMsg);
            log.info("==============可以应用于日志打印==============> "+resultMsg.toString());
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("通知之结束");
        return resultMsg;
    }

    @After("annotationPointCut()")
    public void after() {
        System.out.println("after方法执行后");
    }
}

测试注解@Zhangxueliang的使用

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;

/**
 * @ProjectName springbootdemo_src
 * @ClassName Test
 * @Desicription TODO
 * @Author Zhang Xueliang
 * @Date 2019/5/15 11:26
 * @Version 1.0
 **/
@SpringBootApplication
@RestController
//@EnableAspectJAutoProxy
public class Test {
    public static void main(String[] args) {
        SpringApplication.run(Test.class, args);
    }

    @RequestMapping("/annotation")
    @Zhangxueliang("测试注解1")
    public List<String> getById() {
        System.err.println("o+++++++++++++++++");
        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("qwe");
        list.add("asd");
        return list;
    }
}