springBoot自定義註解的使用

吃土的胖子發表於2020-12-28

晚上睡不著看了看自定義註解,記錄下學習過程

參考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
我是日誌

相關文章