晚上睡不着看了看自定义注解,记录下学习过程
参考https://blog.csdn.net/qq_37435078/article/details/90523309
自定义注解其实是使用springAop来实现的(我只会这么用,轻喷!)
我们尝试写一个自定义注解,并将注解中的值输出到控制台
实现步骤如下
start
1. 定义一个注解类
2. 定义一个java类,用来“实现”这个注解(类似接口和实现类)
3. 定义一个controller,service,entity 用来测试注解
end
定义注解 代码如下
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Slog {
String value() default "";
}
- @Documented:注解信息会被添加到Java文档中
- @Retention:注解的生命周期,表示注解会被保留到什么阶段,可以选择编译阶段、类加载阶段,或运行阶段
- @Target:注解作用的位置,ElementType.METHOD表示该注解仅能作用于方法上
之后 我们将注解添加到方法上,代码如下
@RestController
public class UserController {
@Slog("我是日志")
@RequestMapping("user")
public void TestAspect() {
}
}
好了,接下来就进入正题,开始写注解的“实现”
定义一个注解切面类
注意,@Aspect这个注解需要添加jar包,也就是说需要在pom文件加入依赖,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
之后就可以正常添加了。
@Component
@Aspect
public class SlogAspect {
@Pointcut("@annotation(com.example.demo.annotation.Slog)")
private void pointcut() {
}
@Before("pointcut() && @annotation(logger)")
public void advice(JoinPoint joinPoint, Slog logger) {
System.out.println(logger.value());
}
}
其中 @Pointcut注解 用于定义切入点,也就是在标记有Slog注解的方法上进行切入
@Before中的pointcut()这么写的原因是声明,我们要在这个切入点的执行前后(之前,之后,环绕等)进行一些逻辑处理,然后通过@annotation(logger)可以获得自定义注解对象赋予的值,也就是@Slog("我是日志")中的括号内容
之后重启项目(添加,修改注解的实现后都需要重启来让注解生效)。
在控制台就可以看到我们输出的日志了
2020-12-28 02:34:31.601 INFO 3520 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-12-28 02:34:31.602 INFO 3520 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-12-28 02:34:31.602 INFO 3520 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms
我是日志