史上最全Spring面試題,(2020.5月整理___下篇)

接上一篇文章:史上最全Spring面試題,(2020.5月整理___上篇)

1、什麼是 spring?

Spring 是個 java 企業級應用的開源開發框架。Spring 主要用來開發 Java 應用,但是有些擴展是針對構建 J2EE 平臺的 web 應用。Spring 框架目標是簡化 Java企業級應用開發,並通過 POJO 爲基礎的編程模型促進良好的編程習慣。

2、使用 Spring 框架的好處是什麼?

  • 輕量:Spring 是輕量的,基本的版本大約 2MB。
  • 控制反轉:Spring 通過控制反轉實現了鬆散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
  • 面向切面的編程(AOP):Spring 支持面向切面的編程,並且把應用業務邏輯和系統服務分開。
  • 容器:Spring 包含並管理應用中對象的生命週期和配置。
  • MVC 框架:Spring 的 WEB 框架是個精心設計的框架,是 Web 框架的一個很好的替代品。
  • 事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。
  • 異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO 拋出的)轉化爲一致的 unchecked 異常。

3、Spring 由哪些模塊組成?

以下是 Spring 框架的基本模塊:

  • Core module
  • Bean module
  • Context module
  • Expression Language module
  • JDBC module D ORM module D OXM module
  • Java Messaging Service( JMS) module
  • Transaction module
  • Web module
  • Web-Servlet module D Web-Struts module D Web-Portlet module

4、Spring的IOC和AOP機制

我們是在使用Spring框架的過程中,其實就是爲了使用IOC,依賴注入,和AOP,面向切面編程,這兩個是Spring的靈魂。主要用到的設計模式有工廠模式和代理模式。 IOC就是典型的工廠模式,通過sessionfactory去注入實例。
AOP就是典型的代理模式的體現。
代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的接口,代理類主要負責爲委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後處理消息等。代理類與委託類之間通常會存在關聯關係,一個代理類的對象與一個委託類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象的相關方法,來提供特定的服務
spring的IoC容器是spring的核心,spring AOP是spring框架的重要組成部分。
在傳統的程序設計中,當調用者需要被調用者的協助時,通常由調用者來創建被調用者的實例。但在spring裏創建被調用者的工作不再由調用者來完成,因此控制反轉(IoC);創建被調用者實例的工作通常由spring容器來完成,然後注入調用者,因此也被稱爲依賴注入(DI),依賴注入和控制反轉是同一個概念。
面向方面編程(AOP)是以另一個角度來考慮程序結構,通過分析程序結構的關注點來完善面向對象編程(OOP)。OOP將應用程序分解成 各個層次的對象,而AOP將程序分解成多個切面。spring AOP 只實現了方法級別的連接點,在J2EE應用中,AOP攔截到方法級別的操作就已經足夠。在spring中,未來使IoC方便地使用健壯、靈活的企業服務,需要利用spring AOP實現爲IoC和企業服務之間建立聯繫。
IOC:控制反轉也叫依賴注入。利用了工廠模式
將對象交給容器管理,你只需要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啓動的時候,spring會把你在配置文件中配置的bean都初始化好,然後在你需要調用的時候,就把它已經初始化好的那些bean分配給你需要調用這些bean的類(假設這個類名是A),分配的方法就是調用A的setter方法來注入,而不需要你在A裏面new這些bean了。

注意:面試的時候,如果有條件,畫圖,這樣更加顯得你懂了

AOP: 面 向 切 面 編 程 。
(Aspect-Oriented Programming) AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行爲的一個集合。當我們需要爲分散的對象引入公共行爲的時候,OOP則顯得無能爲力。也就是說,OOP允許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌代碼往往水平地散佈在所有對象層次中,而與它所散佈到的對象的核心功能毫無關係。在OOP設計中,它導致 了大量代碼的重複,而不利於各個模塊的重用。將程序中的交叉業務邏輯(比如安全,日誌,事務等),封裝成一個切面,然後注入到目標對象(具體業務邏輯)中去。
實現AOP的技術,主要分爲兩大類:
一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;
二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼.簡單點解釋,比方說你想在你的biz層所有類中都加上一個打印‘你好’的功能,這時就可以用aop思想來做.你先寫個類寫個類方法,方法經實現打印‘你好’,然後Ioc這個類 ref=“biz.*”讓每個類都注入即可實現

5、Spring MVC流程

  1. 用戶發送請求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到請求調用HandlerMapping處理器映射器。
  3. 處理器映射器找到具體的處理器(可以根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet 。
  4. DispatcherServlet調用HandlerAdapter處理器適配器。
  5. HandlerAdapter經過適配調用具體的處理器(Controller,也叫後端控制器)。
  6. Controller執行完成返回ModelAndView。
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
  8. DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
  9. ViewReslover 解 析 後 返 回 具 體 View 。
  10. DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
  11. DispatcherServlet響應用戶
    組件說明:
    以 下 組 件 通 常 使 用 框 架 提 供 實 現 : DispatcherServlet:作爲前端控制器,整個流程控制的中心,控制其它組件執行,統一調度,降低組件之間的耦合性,提高每個組件的擴展性
    HandlerMapping:通過擴展處理器映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。HandlAdapter: 通 過 擴 展 處 理 器 適 配 器 , 支 持 更 多 類 型 的 處 理 器
    ViewResolver:通過擴展視圖解析器,支持更多類型的視圖解析,例如:jsp、freemarker、pdf、excel等。

組件:

  • 1、前端控制器DispatcherServlet(不需要工程師開發),由框架提供
    作用:接收請求,響應結果,相當於轉發器,中央處理器。有了dispatcherServlet減少了其它組件之間的耦合度。
    用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,
    dispatcherServlet的存在降低了組件之間的耦合性。
  • 2、處理器映射器HandlerMapping(不需要工程師開發),由框架提供
    作用:根據請求的url查找Handler
    HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式, 實現接口方式,註解方式等。
  • 3、處理器適配器HandlerAdapter
    作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
    通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
  • 4、處理器Handler(需要工程師開發)
    注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器纔可以去正確執行Handler
    Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。由於Handler涉及到具體的用戶業務請求,所以一般情況需要工程師根據業務需求開發Handler。
  • 5、視圖解析器View resolver(不需要工程師開發),由框架提供
    作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(view)
    View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶。springmvc框架提供了很多的View視圖類型,包括:jstlView、
    freemarkerView、pdfView等。一般情況下需要通過頁面標籤或頁面模版技術將模型數據通過頁面展示給用戶,需要由工程師根據業務需求開發具體的頁面。
  • 6、視圖View(需要工程師開發jsp…)
    View是一個接口,實現類支持不同的View類型(jsp、freemarker、pdf…)核心架構的具體流程步驟如下:
    1、首先用戶發送請求——>DispatcherServlet,前端控制器收到請求後自己不進行處理,而是委託給其他的解析器進行處理,作爲統一訪問點,進行全局的流程控制;

6、 springMVC是什麼

springMVC是一個MVC的開源框架,springMVC=struts2+spring,springMVC就相當於是Struts2加上sring的整合,但是這裏有一個疑惑就 是,springMVC和spring是什麼樣的關係呢?這個在百度百科上有一個很好的解釋:意思是說,springMVC是spring的一個後續產品,其實就是spring在原有基礎上,又提供了web應用的MVC模塊,可以簡單的把springMVC理解爲是spring的一個模塊(類似AOP,IOC這樣的模塊),網絡上經常會說springMVC和spring無縫集成,其實springMVC就是spring的一個子模塊,所以根本不需要同spring進行整合

7、SpringMVC怎麼樣設定重定向和轉發的?

(1)轉發:在返回值前面加"forward:",譬如"forward:user.do?name=method4
(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"

8、SpringMVC常用的註解有哪些

@RequestMapping:用於處理請求 url 映射的註解,可用於類或方法上。用於類上,則表示類中的所有響應請求的方法都是以該地址作爲父路徑。
@RequestBody:註解實現接收http請求的json數據,將json轉換爲java對象。
@ResponseBody:註解實現將conreoller方法返回對象轉化爲json對象響應給客戶

9、在 Spring 框架中如何更有效地使用 JDBC?

使用 SpringJDBC 框架,資源管理和錯誤處理的代價都會被減輕。所以開發者只需寫 statements 和 queries 從數據存取數據,JDBC 也可以在 Spring 框架提供的模板類的幫助下更有效地被使用,這個模板叫 JdbcTemplate (例子見這裏here)

10、JdbcTemplate

JdbcTemplate 類提供了很多便利的方法解決諸如把數據庫數據轉變成基本數據類型或對象,執行寫好的或可調用的數據庫操作語句,提供自定義的數據錯誤處理。

11、Spring 對 DAO 的支持

Spring 對數據訪問對象(DAO)的支持旨在簡化它和數據訪問技術如 JDBC,Hibernate or JDO 結合使用。這使我們可以方便切換持久層。編碼時也不用擔心會捕獲每種技術特有的異常。

12、使用 Spring 通過什麼方式訪問 Hibernate?

在 Spring 中有兩種方式訪問 Hibernate:

  • 控制反轉 Hibernate Template 和 Callback。
  • 繼承 HibernateDAOSupport 提供一個 AOP 攔截器。

13、如何通過 HibernateDaoSupport 將 Spring 和 Hibernate結合起來?

用 Spring 的 SessionFactory 調用 LocalSessionFactory。集成過程分三步:
D 配置 the Hibernate SessionFactory。
D 繼承 HibernateDaoSupport 實現一個 DAO。
D 在 AOP 支持的事務中裝配。

14、連接點

連接點代表一個應用程序的某個位置,在這個位置我們可以插入一個 AOP 切面,它實際上是個應用程序執行 Spring AOP 的位置。

15、通知

通知是個在方法執行前或執行後要做的動作,實際上是程序執行時要通過SpringAOP 框架觸發的代碼段。
Spring 切面可以應用五種類型的通知:

  • before:前置通知,在一個方法執行前被調用。
  • after: 在方法執行之後調用的通知,無論方法執行是否成功。
  • after-returning: 僅當方法成功完成後執行的通知。D after-throwing: 在方法拋出異常退出時執行的通知。D around: 在方法執行之前和之後調用的通知。

切點

切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。

16、什麼是引入?

引入允許我們在已存在的類中增加新的方法和屬性。

17、什麼是目標對象?

被一個或者多個切面所通知的對象。它通常是一個代理對象。也指被通知(advised)對象。

18、什麼是代理?

代理是通知目標對象後創建的對象。從客戶端的角度看,代理對象和目標對象是一樣的。

19、有幾種不同類型的自動代理?

BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying

20、什麼是織入。什麼是織入應用的不同點?

織入是將切面和到其他應用類型或對象連接或創建一個被通知對象的過程。織入可以在編譯時,加載時,或運行時完成。

21、解釋基於 XML Schema 方式的切面實現。

在這種情況下,切面由常規類以及基於 XML 的配置實現。

22、解釋基於註解的切面實現

在這種情況下(基於@AspectJ 的實現),涉及到的切面聲明的風格與帶有 java5 標註的普通 java 類一致。
Spring 的 MVC

23、什麼是 Spring 的 MVC 框架?

Spring 配備構建 Web 應用的全功能 MVC 框架。Spring 可以很便捷地和其他MVC 框架集成,如 Struts,Spring 的 MVC 框架用控制反轉把業務對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數和業務對象綁定。

24、DispatcherServlet

Spring 的 MVC 框架是圍繞 DispatcherServlet 來設計的,它用來處理所有的 HTTP請求和響應。

25、 WebApplicationContext

WebApplicationContext 繼承了 ApplicationContext 並增加了一些 WEB 應用必備的特有功能,它不同於一般的 ApplicationContext ,因爲它能處理主題,並找到被關聯的 servlet。

26、什麼是 Spring MVC 框架的控制器?

控制器提供一個訪問應用程序的行爲,此行爲通常通過服務接口實現。控制器解析用戶輸入並將其轉換爲一個由視圖呈現給用戶的模型。
Spring 用一個非常抽象的方式實現了一個控制層,允許用戶創建多種用途的控制器。

27、@Controller 註解

該註解表明該類扮演控制器的角色,Spring 不需要你繼承任何其他控制器基類或引用 Servlet API。

28、@RequestMapping 註解

該註解是用來映射一個 URL 到一個類或一個特定的方處理法上

擴展連接:加粗樣式更多請點擊這裏

博主公衆號程序員小羊 只發面試相關推文
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章