1.添加所需要的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.包名目录如图所示
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";
}
}
访问该接口,控制台打印如下
由此可见,注解使用成功
通过本案例进行改造,可以完成注解的其它功能,例如:添加日志、参数校验等等