Java在Jdk1.5中引入了注解,Spring框架也正好把Java注解发挥得淋漓尽致。
接下来简单介绍如何在Spring中自定义注解,其中会使用到Spring框架中的AOP(面向切面编程)。
package org.spring.springboot.config;
import java.lang.annotation.*;
@documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestLog {
String value() default "";
}
二、解析注解
接着完成注解的解析工作,这里使用了Spring的AOP(面向切面编程)特性
通过@Aspect注解使该类成为切面类。
通过@Pointcut 指定切入点 ,这里指定的切入点为TestLog注解类型,也就是被@TestLog注解修饰的方法,进入该切入点。
package org.spring.springboot.config;
import org.aspectj.lang.JoinPoint;
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.lang.reflect.Modifier;
@Component
@Aspect
public class TestLogAspect {
@Pointcut("@annotation(org.spring.springboot.config.TestLog)")
private void pointcut() {}
@Before("pointcut() && @annotation(logger)")
public void advice(JoinPoint joinPoint, TestLog logger) {
System.out.println("--- TestLog日志的内容为[" + logger.value() + "] ---");
System.out.println("注解作用的方法名: " + joinPoint.getSignature().getName());
System.out.println("所在类的简单类名: " + joinPoint.getSignature().getDeclaringType().getSimpleName());
System.out.println("所在类的完整类名: " + joinPoint.getSignature().getDeclaringType());
System.out.println("目标方法的声明类型: " + Modifier.toString(joinPoint.getSignature().getModifiers()));
}
}
三、使用自定义注解
@TestLog("自定义注解的输出日志内容8888888888888")
@RequestMapping("/selectByPageTest")
public IPage selectByPage(){
return null;
}
四、测试结果
参考文章
Spring项目中自定义注解的使用
Spring 自定义注解的实现



