在Java開發中,AOP(Aspect Oriented Programming)是一種編程範式,它可用於將跨越應用程序中的多個模塊和方法的橫切關注點分離出來。AOP 可以幫助將業務邏輯和基礎設施細節解耦,提高代碼的可讀性和可維護性,達到更好的軟件設計,因此被Java開發者廣泛使用。本文將圍繞着AOP面試題進行詳解,分別從基礎概念、使用場景、框架等方面進行闡述。
一、 AOP基礎概念
1、什麼是AOP?
AOP是面向切面編程,允許開發人員定義一些類似"切面"的模塊,然後將它們應用到多個類、方法和函數中。
2、AOP是如何實現的?
AOP框架通常通過在程序編譯時或運行時對類進行動態處理,來實現應用切面。比較好的實現方式是使用JVM工具,例如位元組碼增強。
3、AOP術語介紹?
1)切面(Aspect):體現為一些通用的代碼,可用來在一個應用中的多個位置進行切入(或者調用)。切面可定義為類,其中包含了需要在應用某個位置進行切入的方法。 2)連接點(Join Point):在應用程序執行的過程中,某個點在代碼中的位置。通常,是對方法執行進行切面操作。 3)通知(Advice):在應用程序執行過程中在某個連接點處進行執行的代碼。 4)切點(Pointcut):連接點的集合。與正則表達式類似,切點確定了某個通知和一系列連接點之間的匹配規則。 5)織入(Weaving):將切面與其他對象結合起來形成新的功能的過程。 6)引入(Introduction):在不修改代碼的情況下,對現有類進行修改的術語 已用於實施新的接口和域。
二、 AOP框架
1、Spring AOP
Spring AOP採用的是動態代理的機制。AOP代理類完成對被代理類的方法進行攔截,根據自定義的增強規則,嵌入其他的代碼;有兩種代理方式:JDK動態代理和CGLIB代理。
2、AspectJ
AspectJ通常需要編寫額外的代碼,以便在程序編譯時創建新的類,用於在運行時實施AOP。 AspectJ是靜態編織-AOP解決方案,通過增強位元組碼文件間接實現AOP。
3、Jboss AOP
JBoss AOP是專門為J2EE環境設計的AOP框架,支持POJO和EJB之間的AOP實現。它使用Aspect、Join-point和Advice來實現自定義程序結構的創造性編程。
三、 AOP使用場景
1、日誌記錄
一些比較複雜的系統往往需要記錄運行過程中的日誌,同時,記錄日誌的功能應該獨立於應用程序本身的業務邏輯,使用AOP技術我們可以通過將所有的日誌記錄功能,封裝到AOP中,讓業務代碼不需要關注日誌記錄,只需要調用相關的API即可。
2、性能監控
在一些需要對複雜的方法進行性能監控和優化的系統中,AOP往往會發揮很大的作用。比如:對於循環調用次數較多,耗時較長的方法等等,可以通過方法攔截+計時器等方式完成時間監控,使得性能有了極大的提升。
3、安全檢查
在一些應用程序需要進行安全性檢查的時候,可以將這些代碼也封裝到AOP中,以便在運行過程中快速定位安全漏洞,同時,這種方式還能在不影響程序性能的情況下,完成安全檢查的任務。
四、 AOP面試題
1、AOP概念與實現方式?
AOP是面向切面編程,允許開發人員定義一些類似"切面"的模塊,然後將它們應用到多個類、方法和函數中,以實現對一些關鍵方法的攔截和監控等功能。AOP採用的方式一般有兩種,靜態編織和動態編織。
2、Spring AOP和AspectJ的區別是什麼?
關於Spring AOP和AspectJ的區別,可以總結為以下幾點: 1)編程方式不同: Spring AOP採用基於代理的方式,AspectJ支持靜態織入和動態代理。 2)適應範圍不同: Spring AOP適用於輕量級應用,並支持IOC和DI機制;而AspectJ更適用於大型分佈式系統,對運行效率有較高的要求。 3)支持的範圍不同: AspectJ可在更廣泛的範圍內實現AOP,包括構造函數、類初始化以及靜態方法等;而Spring AOP只支持方法級別的AOP。
3、AOP面向的主要切點有哪些?
在AOP中,切點是指我們需要對代碼進行攔截或者注入的關鍵代碼點。主要的切點有:前置切點、後置切點、環繞切點和異常切點。
4、Spring AOP有哪些常見的AOP通知類型?
常見的Spring AOP通知類型包括:前置通知(Before)、後置通知(After)、異常拋出通知(After-throwing)、後置返回通知(After-returning)、環繞通知(Around)。
5、Spring AOP和AspectJ的區別是什麼?
關於Spring AOP和AspectJ的區別,可以總結為以下幾點: 1)編程方式不同: Spring AOP採用基於代理的方式,AspectJ支持靜態織入和動態代理。 2)適應範圍不同: Spring AOP適用於輕量級應用,並支持IOC和DI機制;而AspectJ更適用於大型分佈式系統,對運行效率有較高的要求。 3)支持的範圍不同: AspectJ可在更廣泛的範圍內實現AOP,包括構造函數、類初始化以及靜態方法等;而Spring AOP只支持方法級別的AOP。
五、代碼實現示例
以下示例基於Spring AOP框架進行演示。
1、創建一個切面類
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; @Aspect @Component public class LogAspect { @Pointcut("execution(public * com.example.demo.controller..*.*(..))") public void pointCut(){} @Before("pointCut()") public void before(){ System.out.println("方法執行前..."); } @After("pointCut()") public void after(){ System.out.println("方法執行後..."); } }
2、在Spring配置文件中配置切面
3、在目標類中使用AOP功能
@RestController @RequestMapping("/test") public class TestController { @RequestMapping(value = "/hello", method = RequestMethod.GET) public String hello() { System.out.println("執行了hello方法"); return "hello"; } }
4、運行程序並查看控制台輸出
INFO 12732 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initialized Servlet 'dispatcherServlet' 方法執行前... 執行了hello方法 方法執行後...
總結
本文圍繞AOP面試題進行了詳細的解析,包括AOP基礎概念、使用場景、AOP框架以及一些面試常見問題等。通過本文的學習,相信讀者對AOP技術的認識更加深入,能夠更好的應用於實際開發中,提高軟件系統的設計質量和可維護性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/309419.html