Java相關面試題總結+答案(六)


【Spring/Spring MVC】


90. 為什么要使用 spring?

  • spring 提供了 IOC 技術,spring 容器會幫你管理依賴的對象,從而不需要自己創建和管理依賴對象了,更輕松的實現了程序的解耦。
  • spring 提供了事務支持,使得事務操作變得更加方便。
  • spring 提供了面向切面編程,這樣可以更方便的處理某一類問題。
  • 更方便的框架集成,spring 可以很方便的整合其他框架,比如 mybatis、hibernate等。

91. 解釋一下什么是 aop?

  aop 是面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。

  簡單來說就是統一處理某一“切面”(類)的問題的編程思想,比如統一處理日志、異常等。

92. 解釋一下什么是 ioc?

  ioc:Inversion of Control(即控制反轉),是spring 的核心,對於 spring 框架來講,就是由 spring 來負責控制對象的生命周期和對象間的關系。

  簡單來說,控制指的是當前對象對內部成員的控制權;控制反轉指的是,這種控制權不由當前對象管理了,由其他(類,第三方容器)來管理。

93. spring 有哪些主要模塊?

  • spring core:框架最基礎的部分,提供 IOC 和依賴注入特性。
  • spring context:構建於core 封裝包基礎上的 context 封裝包,提供了一種框架式的對象訪問方法。
  • spring dao:Data Access Object 提供了 JDBC 的抽象層。
  • spring aop:提供了面向切面的編程實現,讓你可以自定義攔截器、切點等。
  • spring Web:提供了針對 Web 開發的集成特性,例如文件上傳,利用 servlet listeners 進行 ioc 容器初始化和針對 Web 的 ApplicationContext。
  • spring Web mvc:spring 中的 mvc 封裝包提供了 Web 應用的 Model-View-Controller(MVC)的實現。

94. spring 常用的注入方式有哪些?

  • setter 屬性注入
  • 構造方法注入
  • 注解方式注入

95. spring 中的 bean 是線程安全的嗎?

spring 中的 bean 默認是單例模式,spring 框架並沒有對單例 bean 進行多線程的封裝處理。

實際上大部分時候 spring bean 無狀態的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態的話(比如 view model 對象),那就要開發者自己去保證線程安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當於 new Bean()了,所以就可以保證線程安全了。

    • 有狀態就是有數據存儲功能。
    • 無狀態就是不會保存數據。

96. spring 支持幾種 bean 的作用域?

spring 支持 5 種作用域,如下:

    • singleton:spring ioc 容器中只存在一個 bean 實例,bean 以單例模式存在,是系統默認值;
    • prototype:每次從容器調用 bean 時都會創建一個新的示例,既每次 getBean()相當於執行 new Bean()操作;
    • Web 環境下的作用域;
    • request:每次 http 請求都會創建一個 bean;
    • session:同一個 http session 共享一個 bean 實例;
    • global-session:用於 portlet 容器,因為每個 portlet 有單獨的 session,globalsession 提供一個全局性的 http session。

注意: 使用 prototype 作用域需要慎重的思考,因為頻繁創建和銷毀 bean 會帶來很大的性能開銷。

97. spring 自動裝配 bean 有哪些方式?

  • no:默認值,表示沒有自動裝配,應使用顯式 bean 引用進行裝配。
  • byName:它根據 bean 的名稱注入對象依賴項。
  • byType:它根據類型注入對象依賴項。
  • 構造函數:通過構造函數來注入依賴項,需要設置大量的參數。
  • autodetect:容器首先通過構造函數使用 autowire 裝配,如果不能,則通過 byType 自動裝配。

98. spring 事務實現方式有哪些?

  • 聲明式事務:聲明式事務也有兩種實現方式,基於 xml 配置文件的方式和注解方式(在類上添加 @Transaction 注解)。
  • 編碼方式:提供編碼的形式管理和維護事務。

99. 說一下 spring 的事務隔離?

spring 有五大隔離級別,默認值為 ISOLATION_DEFAULT(使用數據庫的設置),其他四個隔離級別和數據庫的隔離級別一致:

  • ISOLATION_DEFAULT:用底層數據庫的設置隔離級別,數據庫設置的是什么我就用什么;
  • ISOLATIONREADUNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、臟讀、不可重復讀);
  • ISOLATIONREADCOMMITTED:提交讀,一個事務提交后才能被其他事務讀取到(會造成幻讀、不可重復讀),SQL server 的默認級別;
  • ISOLATIONREPEATABLEREAD:可重復讀,保證多次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會造成幻讀),MySQL 的默認級別;
  • ISOLATION_SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復讀、幻讀。

臟讀 :表示一個事務能夠讀取另一個事務中還未提交的數據。比如,某個事務嘗試插入記錄 A,此時該事務還未提交,然后另一個事務嘗試讀取到了記錄 A。

不可重復讀 :是指在一個事務內,多次讀同一數據。

幻讀 :指同一個事務內多次查詢返回的結果集不一樣。比如同一個事務 A 第一次查詢時候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的原因也是另外一個事務新增或者刪除或者修改了第一個事務結果集里面的數據,同一個記錄的數據內容被修改了,所有數據行的記錄就變多或者變少了。

100. 說一下 spring mvc 運行流程?

1、用戶發送請求至前端控制器DispatcherServlet
2、DispatcherServlet收到請求調用HandlerMapping處理器映射器。
3、處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一並返回給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響應用戶

101. spring mvc 有哪些組件?

  • 前端控制器 DispatcherServlet。
  • 處理器映射器 HandlerMapping。
  • 處理器適配器 HandlerAdapter。
  • 處理器 Controller。
  • 視圖解析器 ViewReslover。
  • 模型和視圖 ModelAndView。

102. @RequestMapping 的作用是什么?

  將 http 請求映射到相應的類/方法上。

103. @Autowired 的作用是什么?

  @Autowired 它可以對類成員變量、方法和構造函數進行標注,完成自動裝配的工作,通過使用@Autowried 來消除 get、set 方法。

【Spring Boot/Spring Cloud】


104. 什么是 spring boot?

  springboot 是為 spring 服務的,是用來簡化新 spring 應用初始搭建以及開發過程的。

105. 為什么要用 spring boot?

  • 配置簡單
  • 獨立運行
  • 自動裝配
  • 無代碼生產和 .xml 配置
  • 提供應用監控
  • 易上手
  • 開發效率高

106. spring boot 核心配置文件是什么?

spring boot 核心的兩個配置文件:

    • bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加載的,比 applicaton 優先加載,且 boostrap 里面的屬性不能被覆蓋;
    • application (. yml 或者 . properties):用於 spring boot 項目的自動化配置。

107. spring boot 配置文件有哪幾種類型?它們有什么區別?

配置文件有 . properties 格式和 . yml 格式,它們主要的區別是書法風格不同。

. properties 配置如下:

  spring. RabbitMQ. port=5672

. yml 配置如下:

spring:

    RabbitMQ:

        port: 5672

. yml 格式不支持 @PropertySource 注解導入。

108. spring boot 有哪些方式可以實現熱部署?

  • 使用 devtools  啟動熱部署,添加 devtools 庫,在配置文件中把 spring.devtools.restart.enabled 設置為 true。
  • 使用 Intellij IDE 編輯器,勾上自動編譯或者手動重新編譯。

109. jpa 和 hibernate 有什么區別?

  jpa 全稱 Java Persistence API,是 Java 持久化接口規范,hibernate 屬於 jpa 的具體實現。

110. 什么是 spring cloud? 

  spring cloud 是一系列框架的有序集合。它利用 spring boot 的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用 spring boot 的開發風格做到一鍵啟動和部署。

111. spring cloud 斷路器的作用是什么?

  在分布式架構中,斷路器模式的作用也是類似的,當某個服務單元發生故障(類似用電器發生短路)之后,通過斷路器的故障監控(類似熔斷保險絲),向調用方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間占用不釋放,避免了故障在分布式系統中的蔓延。

112. spring cloud 的核心組件有哪些?

  • Eureka:服務注冊於發現。
  • Feign:基於動態代理機制,根據注解和選擇的機器,拼接請求 url 地址,發起請求。
  • Ribbon:實現負載均衡,從一個服務的多台機器中選擇一台。
  • Hystrix:提供線程池,不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務雪崩的問題。
  • Zuul:網關管理,由 Zuul 網關轉發請求給對應的服務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM