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 {
/*@Documented:注解信息会被添加到Java文档中
* @Retention:注解的生命周期,表示注解会被保留到什么阶段,可以选择编译阶段、类加载阶段,或运行阶段
* @Target:注解作用的位置,ElementType.METHOD表示该注解仅能作用于方法上
*/
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<Person> selectByPage(){
return null;
}