首頁 > 軟體

SpringBoot整合Web之AOP設定詳解

2022-08-15 14:02:24

設定AOP

AOP簡介

要介紹面向切面變成(Aspect-Oriented Programming,AOP),需要先考慮一個這樣的場景:公司有一個人力資源管理系統目前已經上線,但是系統執行不穩定,有時執行的很慢,為了檢測到底是哪個環節出現問題了,開發人員想要監控每一個方法執行的時間,再根據這些執行時間判斷出問題所在。當問題解決後,再把這些監控移除掉。系統目前已經執行,如果手動修改系統成千上萬個方法,工作量太大,而且這些監控方法以後還要移除掉;如果能夠在系統執行過程中動態新增程式碼,就能很好的解決問題。這種在系統執行時動態新增程式碼的方式成為面向切面程式設計(AOP)。Spring Boot 對 AOP 提供了很好的支援。在 AOP 中,有一些常見的概念需要了解:

  • Joinpoint(連線點):類裡面可以被增強的方法即為連線點。例如,想修改那個方法的功能,那麼該方法就是一個連線點
  • Pointcut(切入點):對 Joinpoint 進行攔截的定義即為切入點。例如,攔截所有以 insert 開始的方法,這個定義即為切入點
  • Advice(通知):攔截到 Joinpoint 之後所要做的事情就是通知。例如,之前說到的列印紀錄檔監控。通知分為前置通知、後置通知、異常通知、最終通知、環繞通知
  • Aspect(切面):Pointcut 和 Advice 的結合
  • Target(目標物件):要增強的類成為 Target

Spring Boot 支援

Spring Boot 在 Spring 的基礎上對 AOP 的設定提供了自動化設定解決方案 spring-boot-starter-aop ,首先引入依賴,如下:

<!--    AOP 依賴    -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然後在com.sang.aop.service 包下建立 UserService 類,如下:

@Service
public class UserService {
    public String getUserById(Integer id){
        System.out.println("get...");
        return "user";
    }
    public void deleteUserById(Integer id){
        System.out.println("delete...");
    }
}

然後建立切面,如下:

@Component
@Aspect
public class LogAspect {
    @Pointcut("execution(* com.sang.aop.service.*.*(..))")
    public void pc1() {
    }
    @Before(value = "pc1()")
    public void before(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法開始執行...");
    }
    @After(value = "pc1()")
    public void after(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法執行結束...");
    }
    @AfterReturning(value = "pc1()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法返回值為:" + result);
    }
    @AfterThrowing(value = "pc1()",throwing = "e")
    public void afterThrowing(JoinPoint jp, Exception e) {
        String name = jp.getSignature().getName();
        System.out.println(name+"方法拋異常了,異常是:"+e.getMessage());
    }
    @Around("pc1()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        return pjp.proceed();
    }
}

程式碼解釋:

  • @Aspect 註解表明這是一個切面類
  • pc1() 方法使用了 @Pointcut() 註解 ,這是一個切入點定義。execution 中的第一個 * 表示方法返回任意值,第二個 * 表示 service 包下的任意類,第三個 * 表示類中的任意方法,括號中的兩個點表示方法引數任意,即這裡描述的切入點為 service 包下所有類中的所有方法
  • before() 方法使用了 @Before註解 ,表示這是一個前置通知,該方法在目標方法執行之前執行。通過 JoinPoint 引數可以獲取目標方法的方法名、修飾符等資訊
  • after() 方法使用了 @After註解,表示這是一個後置通知,該方法在目標方法執行之後執行
  • afterReturning() 方法使用了 @AfterReturning 註解,表示這是一個返回通知,在該方法中可以獲取目標方法的返回值。@AfterReturning 註解的 returning 引數是指返回值的變數名,對應方法的引數。注意,在方法引數中定義了 result 的型別為 Object ,表示目標方法的返回值可以使任意型別,若 result 引數的型別為 Long ,則該方法只能處理目標方法返回值為 Long 的情況
  • afterThrowing() 方法使用了 @AfterThrowing 註解,表示這是一個異常通知,即當目標方法發生異常時,該方法會被呼叫,異常型別為 Exception 表示所有的異常都會進入該方法中執行,若異常型別為 ArithmeticException ,則表示只有目標方法丟擲 ArithmeticException 異常時才會進入該方法處理
  • around() 方法使用了 @Around 註解,表示這是一個環繞通知。環繞通知是所有通知裡功能最為強大的通知,可以實現前置通知、後置通知、異常通知以及返回通知的功能。目標方法進入環繞通知後,通過呼叫 ProceedingJoinPoint 物件的 proceed 方法使目標方法繼續執行,開發者可以在此修改目標方法的執行引數、返回值等,並且可以在此處理目標方法的異常

設定完成後,接下來在Controller 中建立介面,分別呼叫 Userservice 中的兩個方法,即可看到 LogAspect 中的程式碼動態的嵌入目標方法中執行了,如下:

getUserById方法開始執行...
get...
getUserById方法返回值為:user
getUserById方法執行結束...
deleteUserById方法開始執行...
delete...
deleteUserById方法返回值為:null
deleteUserById方法執行結束...

其它

自定義歡迎頁

Spring Boot 專案在啟動後,首先會去靜態資源路徑下查詢 index.html 作為首頁檔案,若查詢不到,則會去查詢動態的 index.html 作為首頁檔案。

例如,如果想使用靜態的 index.html 頁面作為專案的首頁,只需在 resources/static 目錄下建立 index.html 檔案疾苦。若想使用動態頁面作為專案首頁,則需在 resources/templages 目錄下建立 index.html (使用Thymeleaf 模板) 或者 index.ftl(使用 FreeMarker 模板),然後在 Controller 中返回邏輯檢視名,如下:

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(){
        return "index";
    }
}

執行專案,輸入"http://localhost:8081",檢視結果

自定義 favicon

favicon.ico 是瀏覽器索引標籤左上角的圖示,可以放在靜態資源路徑下或者類路徑下,靜態資源路徑下的 favicon.ico 優先順序高於類路徑下的 favicon.ico

可以使用線上轉換網站:https://www.bitbug.net/ 將一張普通圖片轉為 .ico 圖片,轉換成功後,將檔案重新命名為 favicon.ico ,然後複製到 resources/static 目錄下,如圖

啟動專案,檢視效果

注意:清快取,然後 Ctrl+F5 強制重新整理

除去某個自動設定

Spring Boot 中提供了大量的自動化設定類,在 Spring Boot 的入口類上有一個 @SpringBootApplication 註解。該註解是一個組合註解,由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 組成,其中 @EnableAutoConfiguration 註解開啟自動化設定,相關的自動化設定就會被使用。如果開發者不想使用某個自動化設定,按如下方式除去相關設定即可:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
public class Chapter04Application {
    public static void main(String[] args) {
        SpringApplication.run(Chapter04Application.class, args);
    }
}

在 @EnableAutoConfiguration 註解中使用 exclude 屬性去除 Error 的自動化設定類,這時如果在 resources/static/error 目錄下建立 4xx.htnl、5xx.html ,存取出錯時就不會自動跳轉了。由於 @EnableAutoConfiguration 註解的 exclude 屬性值是一個陣列,因此有多個要排除的自動化組態檔只需要繼續新增即可。除了這種設定方式外,也可在 application.properties 中設定,如下:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

新增前

新增後

到此這篇關於SpringBoot整合Web之AOP設定詳解的文章就介紹到這了,更多相關SpringBoot AOP設定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com