一、面試官問:AOP是什么?
與OOP對比,面向切面,傳統的OOP開發中的代碼邏輯是至上而下的過程中會長生一些橫切性問題,這些橫切性的問題和我們的主業務邏輯關系不會散落在代碼的各個地方,造成難以維護,AOP的編程思想就是把業務邏輯和橫切的問題進行分離,從而達到解耦的目的,使代碼的重用性和開發效率高(目的是重用代碼,把公共的代碼抽取出來)
二、面試官問:AOP的應用場景有哪些呢?
1、日志記錄
2、權限驗證
3、效率檢查(個人在代碼上,喜歡用注解+切面,實現校驗,redis分布式鎖等功能)
4、事務管理(spring 的事務就是用AOP實現的)
三、面試官問:springAop的底層是怎樣實現的?
(這個時候,條件反射地想起這兩點)
1、JDK動態代理
2、CGLIB代理
面試官一問:是編譯時期進行織入,還是運行期進行織入?
---->運行期,生成字節碼,再加載到虛擬機中,JDK是利用反射原理,CGLIB使用了ASM原理。
面試官再問:初始化時期織入還是獲取對象時織入?
----》初始化的時候,已經將目標對象進行代理,放入到spring 容器中
面試官再再問:spring AOP 默認使用jdk動態代理還是cglib?
-----》要看條件,如果實現了接口的類,是使用jdk。如果沒實現接口,就使用cglib。
(來一個尷尬的笑容,有點忘記了,內心,直接淚目)
四、面試官問:spring AOP 和 AspectJ的關系?
1、兩者都是為了實現AOP這個目的,而出現的技術,spring aop 參考 AspectJ編程風格
---》這里有個故事就是,原本spring aop 初期的時候所用的編程風格,讓人用起來,很不方便,而且讓人看不懂。后來,spring aop 就開始取用了Aspectj的編程風格去進行編程
這里有一個小彩蛋(如果知道,請跳過),搭建一個用上spring,但是不使用xml文件,而且將bean注入到容器中,而且能從容器中拿出來的項目。
第一步驟:加入spring-context依賴
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.8.RELEASE</version> </dependency>
第二步驟:加入三個類,一個測試類
@Configuration @ComponentScan("com.ving") public class AopConfig { } //////////////////////////////////////////////// @Component public class IndexDao { public void query(){ System.out.println("dao----query"); } } //////////////////////////////////////////////// public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AopConfig.class); annotationConfigApplicationContext.start(); IndexDao bean = annotationConfigApplicationContext.getBean(IndexDao.class); bean.query(); } } //////////////////////////////////////////////// 打印的結果為: 十二月 16, 2019 8:58:38 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6438a396: startup date [Mon Dec 16 20:58:38 CST 2019]; root of context hierarchy dao----query
我們繼續往下看
面試官最后一問:能不能簡單說下AOP中的切面、切點、連接點、通知,四者的關系?
aspect 切面
Point cut (如果理解了這個切點的概念,就在應用方面完全是可以的了)表示連接點的集合(類似一個表)
Join point 目標對象中的方法(每一條記錄)
weaving 把代理邏輯加入到目標對象上的過程叫做織入
advice 通知類型,請下下圖官網說明
下面代碼是說明切面,切點,連接點,通知,四者的關系!
/**
*
* 切面
* 一定要給spring 管理
*/
@Component
@Aspect
public class VingAspectJ {
/**
* 切點
* 為什么切點要聲明在一個方法上?目的是為了將注解寫在上面而已
* pointcut是連接點的集合(就是方法的集合)
*/
@Pointcut("execution(* com.ving.dao.*.*(..))")
public void pointCut(){
}
/**
* 通知---》配置切點
*/
@After("com.ving.config.VingAspectJ.pointCut()")
public void after(){
System.out.println("after");
}
@Before("com.ving.config.VingAspectJ.pointCut()")
public void before(){
System.out.println("before");
}
}