1. 程式人生 > 其它 >面試彙總7.22

面試彙總7.22

1. 請簡要說明一下IOC和AOP是什麼?

依賴注入的三種方式:(1)介面注入(2)Construct注入(3)Setter注入

控制反轉(IoC)與依賴注入(DI)是同一個概念,引入IOC的目的:(1)脫開、降低類之間的耦合;(2)倡導面向介面程式設計、實施依賴倒換原則; (3)提高系統可插入、可測試、可修改等特性。

具體做法:(1)將bean之間的依賴關係儘可能地抓換為關聯關係;

(2)將對具體類的關聯儘可能地轉換為對Java interface的關聯,而不是與具體的服務物件相關聯;

(3)Bean例項具體關聯相關Java interface的哪個實現類的例項,在配置資訊的元資料中描述;

(4)由IoC元件(或稱容器)根據配置資訊,例項化具體bean類、將bean之間的依賴關係注入進來。

AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不過OOP允許開發者定義縱向的關係,但並不適合定義橫向的關係,例如日誌功能。日誌程式碼往往橫向地散佈在所有物件層次中,而與它對應的物件的核心功能毫無關係對於其他型別的程式碼,如安全性、異常處理和透明的持續性也都是如此,這種散佈在各處的無關的程式碼被稱為橫切(cross cutting),在OOP設計中,它導致了大量程式碼的重複,而不利於各個模組的重用。

AOP技術恰恰相反,它利用一種稱為"橫切"的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,並將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於減少系統的重複程式碼,降低模組之間的耦合度,並有利於未來的可操作性和可維護性。

使用"橫切"技術,AOP把軟體系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處基本相似,比如許可權認證、日誌、事物。AOP的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。

2. 請問Spring支援的事務管理型別有哪些?以及你在專案中會使用那種方式?

Spring支援程式設計式事務管理和宣告式事務管理。許多Spring框架的使用者選擇宣告式事務管理,因為這種方式和應用程式的關聯較少,因此更加符合輕量級容器的概念。宣告式事務管理要優於程式設計式事務管理,儘管在靈活性方面它弱於程式設計式事務管理,因為程式設計式事務允許你通過程式碼控制業務。

事務分為全域性事務和區域性事務。全域性事務由應用伺服器管理,需要底層伺服器JTA支援(如WebLogic、WildFly等)。區域性事務和底層採用的持久化方案有關,例如使用JDBC進行持久化時,需要使用Connetion物件來操作事務;而採用Hibernate進行持久化時,需要使用Session物件來操作事務。

這些事務的父介面都是PlatformTransactionManager。Spring的事務管理機制是一種典型的策略模式,PlatformTransactionManager代表事務管理介面,該介面定義了三個方法,該介面並不知道底層如何管理事務,但是它的實現類必須提供getTransaction()方法(開啟事務)、commit()方法(提交事務)、rollback()方法(回滾事務)的多型實現,這樣就可以用不同的實現類代表不同的事務管理策略。使用JTA全域性事務策略時,需要底層應用伺服器支援,而不同的應用伺服器所提供的JTA全域性事務可能存在細節上的差異,因此實際配置全域性事務管理器是可能需要使用JtaTransactionManager的子類,如:WebLogicJtaTransactionManager(Oracle的WebLogic伺服器提供)、UowJtaTransactionManager(IBM的WebSphere伺服器提供)等。

3. 你如何理解AOP中的連線點(Joinpoint)、切點(Pointcut)、增強(advice)、引介(Introduction)、織入(Weaving)、切面(Aspect)這些概念?

a. 連線點(Joinpoint):程式執行的某個特定位置(如:某個方法呼叫前、呼叫後,方法丟擲異常後)。一個類或一段程式程式碼擁有一些具有邊界性質的特定點,這些程式碼中的特定點就是連線點。Spring僅支援方法的連線點。
b.切點(Pointcut):如果連線點相當於資料中的記錄,那麼切點相當於查詢條件,一個切點可以匹配多個連線點。Spring AOP的規則解析引擎負責解析切點所設定的查詢條件,找到對應的連線點。
c.增強(Advice):增強是織入到目標類連線點上的一段程式程式碼。Spring提供的增強介面都是帶方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。

d. 引介(Introduction):引介是一種特殊的增強,它為類新增一些屬性和方法。這樣,即使一個業務類原本沒有實現某個介面,通過引介功能,可以動態的未該業務類新增介面的實現邏輯,讓業務類成為這個介面的實現類。
e.織入(Weaving):織入是將增強新增到目標類具體連線點上的過程,AOP有三種織入方式:①編譯期織入:需要特殊的Java編譯期(例如AspectJ的ajc);②裝載期織入:要求使用特殊的類載入器,在裝載類的時候對類進行增強;③執行時織入:在執行時為目標類生成代理實現增強。Spring採用了動態代理的方式實現了執行時織入,而AspectJ採用了編譯期織入和裝載期織入的方式。
f.切面(Aspect):切面是由切點和增強(引介)組成的,它包括了對橫切關注功能的定義,也包括了對連線點的定義。

4. 請問AOP原理是什麼?

AOP(Aspect Orient Programming),指面向方面(切面)程式設計,作為面向物件的一種補充,用於處理系統中分佈於各個模組的橫切關注點,比如事務管理、日誌、快取等等。AOP實現的關鍵在於AOP框架自動建立的AOP代理,AOP代理主要分為靜態代理和動態代理,靜態代理的代表為AspectJ;而動態代理則以Spring AOP為代表。通常使用AspectJ的編譯時增強實現AOP,AspectJ是靜態代理的增強,所謂的靜態代理就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強。

Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理。JDK動態代理通過反射來接收被代理的類,並且要求被代理的類必須實現一個介面。JDK動態代理的核心是InvocationHandler介面和Proxy類。

如果目標類沒有實現介面,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB(Code Generation Library),是一個程式碼生成的類庫,可以在執行時動態的生成某個類的子類,注意,CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那麼它是無法使用CGLIB做動態代理的。

5. 請問aop的應用場景有哪些?

Authentication 許可權 ,Caching快取 ,Context passing內容傳遞 ,Error handling錯誤處理 ,Lazy loading懶載入 ,Debugging除錯 ,logging, tracing, profiling and monitoring記錄跟蹤 優化 校準,Performance optimization效能優化 ,Persistence持久化 ,Resource pooling資源池 ,Synchronization同步,Transactions事務。

6. 請說明一下Spring框架為企業級開發帶來的好處有哪些?

- 非侵入式:支援基於POJO的程式設計模式,不強制性的要求實現Spring框架中的介面或繼承Spring框架中的類。
- IoC容器:IoC容器幫助應用程式管理物件以及物件之間的依賴關係,物件之間的依賴關係如果發生了改變只需要修改配置檔案而不是修改程式碼,因為程式碼的修改可能意味著專案的重新構建和完整的迴歸測試。有了IoC容器,程式設計師再也不需要自己編寫工廠、單例,這一點特別符合Spring的精神"不要重複的發明輪子"。
- AOP(面向切面程式設計):將所有的橫切關注功能封裝到切面(aspect)中,通過配置的方式將橫切關注功能動態新增到目的碼上,進一步實現了業務邏輯和系統服務之間的分離。另一方面,有了AOP程式設計師可以省去很多自己寫代理類的工作。
- MVC:Spring的MVC框架為Web表示層提供了更好的解決方案。
-事務管理:Spring以寬廣的胸懷接納多種持久層技術,並且為其提供了宣告式的事務管理,在不需要任何一行程式碼的情況下就能夠完成事務管理。
-其他:選擇Spring框架的原因還遠不止於此,Spring為Java企業級開發提供了一站式選擇,你可以在需要的時候使用它的部分和全部,更重要的是,甚至可以在感覺不到Spring存在的情況下,在你的專案中使用Spring提供的各種優秀的功能。

7. 請簡單談一下spring框架的優點都有哪些?

Spring是一個輕量級的DI和AOP容器框架,在專案的中的使用越來越廣泛,它的優點主要有以下幾點:

Spring是一個非侵入式框架,其目標是使應用程式程式碼對框架的依賴最小化,應用程式碼可以在沒有Spring或者其他容器的情況執行。

Spring提供了一個一致的程式設計模型,使應用直接使用POJO開發,從而可以使執行環境隔離開來。

Spring推動應用的設計風格向面向物件及面向介面程式設計轉變,提高了程式碼的重用性和可測試性。

Spring改進了結構體系的選擇,雖然作為應用平臺,Spring可以幫助我們選擇不同的技術實現,比如從Hibernate切換到其他的ORM工具,從Struts切換到Spring MVC,儘管我們通常不會這麼做,但是我們在技術方案上選擇使用Spring作為應用平臺,Spring至少為我們提供了這種可能性的選擇,從而降低了平臺鎖定風險。

8. 請問Struts攔截器和Spring AOP有什麼區別?

攔截器是AOP的一種實現,struts2攔截器採用xwork2的interceptor!而spring的AOP基於IoC基礎,其底層採用動態代理與CGLIB代理兩種方式結合的實現方式。

9. 請簡單介紹一下spring?

Spring是一個輕量級框架,可以一站式構建你的企業級應用。

Spring的模組大概分為6個。分別是:

1、Core Container(Spring的核心)【重要】

2、AOP(面向切面變成)【重要】

3、Messaging(訊息傳送的支援)

4、Data Access/Integration(資料訪問和整合)

5、Web(主要是SpringWeb內容,包括MVC)【重要】

6、Test(Spring測試支援,包含JUint等測試單元的支援)7、Instrumentation(裝置支援,比如Tomcat的支援)