您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringBoot整合Web之AOP怎么配置”,在日常操作中,相信很多人在SpringBoot整合Web之AOP怎么配置問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringBoot整合Web之AOP怎么配置”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
要介紹面向切面變成(Aspect-Oriented Programming,AOP),需要先考慮一個這樣的場景:公司有一個人力資源管理系統目前已經上線,但是系統運行不穩定,有時運行的很慢,為了檢測到底是哪個環節出現問題了,開發人員想要監控每一個方法執行的時間,再根據這些執行時間判斷出問題所在。當問題解決后,再把這些監控移除掉。系統目前已經運行,如果手動修改系統成千上萬個方法,工作量太大,而且這些監控方法以后還要移除掉;如果能夠在系統運行過程中動態添加代碼,就能很好的解決問題。這種在系統運行時動態添加代碼的方式成為面向切面編程(AOP)。Spring Boot 對 AOP 提供了很好的支持。在 AOP 中,有一些常見的概念需要了解:
Joinpoint(連接點):類里面可以被增強的方法即為連接點。例如,想修改那個方法的功能,那么該方法就是一個連接點
Pointcut(切入點):對 Joinpoint 進行攔截的定義即為切入點。例如,攔截所有以 insert 開始的方法,這個定義即為切入點
Advice(通知):攔截到 Joinpoint 之后所要做的事情就是通知。例如,之前說到的打印日志監控。通知分為前置通知、后置通知、異常通知、最終通知、環繞通知
Aspect(切面):Pointcut 和 Advice 的結合
Target(目標對象):要增強的類成為 Target
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.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怎么配置”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。