Spring常見面試題總結

周某人帶你了解JAVA?

zhuanlan.zhihu.com圖標

前言:在我們面試過程中經常會遇到下面這些問題,你是否每一題都可以對大如流呢?給大家分享整理的15道Spring的面試題,由於篇幅限制,只有前五個在這文章裡帶答案,需要其他面試題答案的可以私信我「Spring」就獲取免費領取方式!

1、Spring是什麼?

Spring是一個輕量級的IoC和AOP容器框架。是為Java應用程序提供基礎性服務的一套框架,目的是用於簡化企業應用程序的開發,它使得開發者只需要關心業務需求。常見的配置方式有三種:基於XML的配置、基於註解的配置、基於Java的配置。主要由以下幾個模塊組成:Spring Core:核心類庫,提供IOC服務;Spring Context:提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等);Spring AOP:AOP服務;Spring DAO:對JDBC的抽象,簡化了數據訪問異常的處理;Spring ORM:對現有的ORM框架的支持;Spring Web:提供了基本的面向Web的綜合特性,例如多方文件上傳;Spring MVC:提供面向Web應用的Model-View-Controller實現。

2、Spring 的優點?

(1)spring屬於低侵入式設計,代碼的污染極低;(2)spring的DI機制將對象之間的依賴關係交由框架處理,減低組件的耦合性;(3)Spring提供了AOP技術,支持將一些通用任務,如安全、事務、日誌、許可權等進行集中式管理,從而提供更好的復用。(4)spring對於主流的應用框架提供了集成支持。3、Spring的AOP理解:OOP面向對象,允許開發者定義縱向的關係,但並適用於定義橫向的關係,導致了大量代碼的重複,而不利於各個模塊的重用。AOP,一般稱為面向切面,作為面向對象的一種補充,用於將那些與業務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取並封裝為一個可重用的模塊,這個模塊被命名為「切面」(Aspect),減少系統中的重複代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。可用於許可權認證、日誌、事務處理。AOP實現的關鍵在於 代理模式,AOP代理主要分為靜態代理和動態代理。靜態代理的代表為AspectJ;動態代理則以Spring AOP為代表。(1)AspectJ是靜態代理的增強,所謂靜態代理,就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強,他會在編譯階段將AspectJ(切面)織入到Java位元組碼中,運行的時候就是增強之後的AOP對象。

(2)Spring AOP使用的動態代理,所謂的動態代理就是說AOP框架不會去修改位元組碼,而是每次運行時在內存中臨時為方法生成一個AOP對象,這個AOP對象包含了目標對象的全部方法,並且在特定的切點做了增強處理,並回調原對象的方法。

Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理:①JDK動態代理只提供介面的代理,不支持類的代理。核心InvocationHandler介面和Proxy類,InvocationHandler 通過invoke()方法反射來調用目標類中的代碼,動態地將橫切邏輯和業務編織在一起;接著,Proxy利用 InvocationHandler動態創建一個符合某一介面的的實例, 生成目標類的代理對象。②如果代理類沒有實現 InvocationHandler 介面,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB(Code Generation Library),是一個代碼生成的類庫,可以在運行時動態的生成指定類的一個子類對象,並覆蓋其中特定方法並添加增強代碼,從而實現AOP。CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那麼它是無法使用CGLIB做動態代理的。(3)靜態代理與動態代理區別在於生成AOP代理對象的時機不同,相對來說AspectJ的靜態代理方式具有更好的性能,但是AspectJ需要特定的編譯器進行處理,而Spring AOP則無需特定的編譯器處理。InvocationHandler 的 invoke(Object proxy,Method method,Object[] args):proxy是最終生成的代理實例; method 是被代理目標實例的某個具體方法; args 是被代理目標實例某個方法的具體入參, 在方法反射調用時使用。4、Spring的IoC理解:(1)IOC就是控制反轉,是指創建對象的控制權的轉移,以前創建對象的主動權和時機是由自己把控的,而現在這種權力轉移到Spring容器中,並由容器根據配置文件去創建實例和管理各個實例之間的依賴關係,對象與對象之間鬆散耦合,也利於功能的復用。DI依賴注入,和控制反轉是同一個概念的不同角度的描述,即 應用程序在運行時依賴IoC容器來動態注入對象需要的外部資源。(2)最直觀的表達就是,IOC讓對象的創建不用去new了,可以由spring自動生產,使用java的反射機制,根據配置文件在運行時動態的去創建對象以及管理對象,並調用對象的方法的。(3)Spring的IOC有三種注入方式 :構造器注入、setter方法注入、根據註解注入。

IoC讓相互協作的組件保持鬆散的耦合,而AOP編程允許你把遍佈於應用各層的功能分離出來形成可重用的功能組件。

5、BeanFactory和ApplicationContext有什麼區別?BeanFactory和ApplicationContext是Spring的兩大核心介面,都可以當做Spring的容器。其中ApplicationContext是BeanFactory的子介面。(1)BeanFactory:是Spring裡面最底層的介面,包含了各種Bean的定義,讀取bean配置文檔,管理bean的載入、實例化,控制bean的生命周期,維護bean之間的依賴關係。ApplicationContext介面作為BeanFactory的派生,除了提供BeanFactory所具有的功能外,還提供了更完整的框架功能:①繼承MessageSource,因此支持國際化。②統一的資源文件訪問方式。③提供在監聽器中註冊bean的事件。④同時載入多個配置文件。⑤載入多個(有繼承關係)上下文 ,使得每一個上下文都專註於一個特定的層次,比如應用的web層。(2)①BeanFactroy採用的是延遲載入形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),才對該Bean進行載入實例化。這樣,我們就不能發現一些存在的Spring的配置問題。如果Bean的某一個屬性沒有注入,BeanFacotry載入後,直至第一次使用調用getBean方法才會拋出異常。

②ApplicationContext,它是在容器啟動時,一次性創建了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的配置錯誤,這樣有利於檢查所依賴屬性是否注入。 ApplicationContext啟動後預載入所有的單實例Bean,通過預載入單實例bean ,確保當你需要的時候,你就不用等待,因為它們已經創建好了。

③相對於基本的BeanFactory,ApplicationContext 唯一的不足是佔用內存空間。當應用程序配置Bean較多時,程序啟動較慢。(3)BeanFactory通常以編程的方式被創建,ApplicationContext還能以聲明的方式創建,如使用ContextLoader。(4)BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區別是:BeanFactory需要手動註冊,而ApplicationContext則是自動註冊。6、請解釋Spring Bean的生命周期?7、 解釋Spring支持的幾種bean的作用域。8、Spring框架中的單例Beans是線程安全的么?9、Spring如何處理線程並發問題?10-1、Spring基於xml注入bean的幾種方式:10-2、Spring的自動裝配:

11、Spring 框架中都用到了哪些設計模式?

12、Spring事務的實現方式和實現原理:13、Spring框架中有哪些不同類型的事件?14、解釋一下Spring AOP裡面的幾個名詞:15、Spring通知有哪些類型?

最後重申一下歡迎做Java的工程師朋友們私信我【Spring】免費獲取這寫些面試題剩下的答案,還有更多免費的Java架構學習資料,其中覆蓋了互聯網的方方面面,期間碰到各種產品各種場景下的各種問題,希望可以幫助大家擴展自己的技術廣度和知識面。記得一定要關注我哦,會不定時的福利贈送,包括整理的面試題,學習資料,源碼等~~

推薦閱讀:

相关文章