天天看點

Java面試題-spring IOC&AOP

作者:Java農夫

又是一年招聘季,整理一些面試題,為自己也為大家整理點資料,希望大家成功上岸。這些整理的是針對面試。因平台單日有釋出數量限制,超出限制的隻能粉絲檢視,需要的請關注後自行擷取,謝謝。

1、介紹下你對IOC的了解

IOC(Inversion of Control 即控制反轉)将對象交給Spring容器管理。

Java面試題-spring IOC&AOP

和傳統使用方式的對比

Java面試題-spring IOC&AOP

spring中提供了一種IOC容器,來控制對象的建立,無論是你建立對象,處理對象之間的依賴關系,對象的建立時間還是對象的建立數量,都是spring提供IOC容器上配置對象的資訊就可以了。

IoC容器管理對象的好處:

  • 由IOC容器幫對象找相應的依賴思想并注入,并不是由對象主動去找;
  • 資源集中管理,實作資源的可配置和易管理;
  • 降低了使用資源雙方的依賴程度,松耦合;
  • 解決了Dao和Service的強耦合。

2、介紹下你對AOP的了解

AOP是Spring中另一個非常重要的核心。AOP【Aspect Oriented Programming】面向切面程式設計。AOP 是一種程式設計思想,是面向對象程式設計(OOP)的一種補充。面向切面程式設計,實作在不修改源代碼的情況下給程式動态統一添加額外功能的一種技術。

Java面試題-spring IOC&AOP

AOP的常用應用場景有哪些:

Java面試題-spring IOC&AOP

AOP可以攔截指定的方法,并且對方法增強,比如:事務、日志、權限、性能監測等增強,而且無需侵入到業務代碼中,使業務與非業務處理邏輯分離。

AOP涉及到的術語:

  • 切面:切面泛指交叉業務邏輯。比如事務處理、日志處理就可以了解為切面。常用的切面有通知與顧問。實際就是對主業務邏輯的一種增強
  • 織入:織入是指将切面代碼插入到目标對象的過程。
  • 連接配接點:連接配接點指切面可以織入的位置。
  • 切入點:切入點指切面具體織入的位置。
  • 通知(Advice):通知是切面的一種實作,可以完成簡單織入功能(織入功能就是在這裡完成的)。通知定義了增強代碼切入到目标代碼的時間點,是目标方法執行之前執行,還是之後執行等。通知類型不同,切入時間不同。
  • 顧問(Advisor):顧問是切面的另一種實作,能夠将通知以更為複雜的方式織入到目标對象中,是将通知包裝為更複雜切面的裝配器。不僅指定了切入時間點,還可以指定具體的切入點。

通知的類型:

  • 前置通知(MethodBeforeAdvice):目标方法執行之前調用
  • 後置通知(AfterReturningAdvice):目标方法執行完成之後調用
  • 環繞通知(MethodInterceptor):目标方法執行前後都會調用方法,且能增強結果
  • 異常處理通知(ThrowsAdvice):目标方法出現異常調用

實作方式:

  • 基于Schema來實作的
Java面試題-spring IOC&AOP
  • 基于aspectJ實作(配置/注解):切入點表達式
Java面試題-spring IOC&AOP
Java面試題-spring IOC&AOP

AOP的代理方式:

Java面試題-spring IOC&AOP

在Spring裡可以把一個類型注冊成Spring裡的一個Bean,這時候Spring就會幫我們把這個Bean初始化,變成一個可用的對象。假如我們需要在上面做一些增強,就是我們所謂的AOP。這時候我們就需要在中間加一層代理類或者增強類。

  • JdkProxy:假如說這個對象所在的類上面有接口(基于接口來做的),Spring會預設使用JdkProxy(JDK的動态代理),來生成一個代理,在代理裡進一步的把所有對這個類做的增強操作,放到代理執行的代碼裡面。然後先做了增強的操作,再去調用原本的類的他的方法。
  • proxyTargetClass:如果要代理的類有接口但想強制不用預設JDK的動态代理,也是用位元組碼增強的技術,就可以開啟proxyTargetClass選項。同CGlib。
  • CGlib:假如說要增強或代理的這個類沒有接口,隻有一個類的定義,Spring會預設使用CGlib,對他做位元組碼增強。相當于硬生生的給他生成一個子類。在這個子類裡,當我們調用原先這個類的某個方法時,先做增強操作,再去調原本類的方法,最後再把結果傳回回來。