深入理解spring面經

1 了解SpringMVC的處理流程嗎?

  • 用戶發送請求至前端控制器DispatcherServlet。
  • DispatcherServlet通過處理器映射器HandlerMapping找到對應的處理器。
  • DispatcherServlet將請求提交給對應的處理器Controller。
  • Controller處理完請求后返回ModelAndView。
  • DispatcherServlet將ModelAndView傳給視圖解析器ViewResolver進行解析。
  • 最終DispatcherServlet會響應用戶請求,顯示對應的視圖。

1.1 1. jvm的本地方法棧是每一個線程私有的嗎?

是的,每一個線程都有自己私有的Java虛擬機棧(Java Stack)和本地方法棧(Native Method Stack)。當線程被創建時,其棧也會隨之創建。Java Stack主要用于存儲Java方法的幀(Frame),而Native Method Stack用于支持Native方法的執行。

  1. SpringMVC和Tomcat的關系是什么?

    • Tomcat: Tomcat是一個Web容器,或者說是一個Servlet容器,用于提供一個環境,在這個環境中,Java的Web應用程序(主要是Servlets、JSPs、Filters等)可以運行和服務HTTP請求。

    • SpringMVC: SpringMVC是Spring框架的一個模塊,它實現了MVC(模型-視圖-控制器)設計模式,用于構建Web應用程序。具體來說,它是一個用于Web應用的前端控制器(Front Controller)框架,可以處理HTTP請求,并基于開發者的配置決定哪一個Controller(處理器)處理哪一個請求。

    關系:

    • 當一個HTTP請求到達Tomcat時,Tomcat會根據配置決定哪一個Servlet來處理這個請求。如果這個Web應用是基于SpringMVC的,則這個請求通常會被發送到DispatcherServlet(SpringMVC的核心Servlet)。
    • DispatcherServlet負責處理請求,并根據開發者在Spring配置中的定義,決定將這個請求分發到哪一個Controller方法來處理。
    • 所以簡單來說,Tomcat為SpringMVC提供了運行環境,而SpringMVC在這個環境中管理和處理Web請求。

1.2 tomcat中使用的線程模型和這里的springMVC有什么關系?

  • Tomcat線程模型: Tomcat使用一個線程池來處理到達的HTTP請求。每當一個新的請求到達時,Tomcat從線程池中取一個線程來處理這個請求。這意味著并發的請求會被并發的線程處理。

  • 關系: 當Tomcat中的線程處理一個到SpringMVC的請求時,這個線程進入SpringMVC的DispatcherServlet,然后再進一步被路由到相應的Controller。這意味著SpringMVC的Controller方法通常在Tomcat的請求處理線程中運行。因此,SpringMVC的執行模型和性能在很大程度上受到Tomcat線程模型的影響。

2 Java版本 1.7 1.8有哪些主要區別?

  • Lambda表達式: Java 8引入了Lambda表達式,為Java增加了一種全新的編程方式。
  • Stream API: Java 8添加了全新的Stream API來支持數據處理。
    接口中的默認方法與靜態方法: 在Java 8中,接口可以有方法實現,通過使用default關鍵字。
  • 新的日期和時間API: Java 8引入了全新設計的日期時間API。
    Optional 類: Java 8引入了Optional類,它是一個容器對象,可以保存null值。
  • Nashorn JavaScript引擎: 在Java 8中,JVM獲得了一個新的Nashorn JavaScript引擎,使得在JVM上運行JavaScript成為可能。
    新的Collector: Java 8在Collectors類中引入了很多新的方法來支持高級聚合操作。
  • Java 7的特性:如Switch-String、try-with-resources、diamond操作符、新的File API等,這些在Java 8中仍然存在,但上述列出的是Java 8相對于Java 7的新特性。

3 SpringAOP的原理了解嗎?

Spring AOP (Aspect-Oriented Programming) 使用代理模式,主要使用兩種方式實現:

  • JDK動態代理: 當目標類實現了某個接口時,Spring AOP使用JDK的動態代理來創建代理。這涉及到java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。

  • CGLIB代理: 當目標類沒有實現接口時,Spring AOP使用CGLIB庫來創建基于類的代理。

在兩種情況下,創建的代理都會攔截對目標對象方法的調用,允許我們在調用方法之前、之后或在產生異常時注入自定義邏輯,如日志、事務管理、安全檢查等。

4 SpringAOP主要想解決什么問題?

Spring AOP旨在提供面向切面的編程能力,以解決以下問題:

  • 橫切關注點: 在多個模塊或功能中都存在的常見功能(如日志、事務管理、安全檢查等)被稱為橫切關注點。這些橫切關注點常常與業務邏輯混雜在一起,導致代碼重復和難以維護

  • 模塊化: AOP允許我們將這些橫切關注點模塊化,并獨立于業務邏輯。這樣,我們可以集中管理這些關注點,并在需要時輕松修改或添加功能。

  • 代碼清晰、可維護: 通過將業務邏輯與橫切關注點分離,我們可以使業務代碼更加清晰、簡潔和可維護。

總之,Spring AOP的目標是提供一種機制,使開發者可以將常見的、重復的功能(如日志、安全、事務等)與業務邏輯分開,從而提高代碼的可維護性、可讀性和重用性。

5 Spring bean和application的生命周期?

5.1 Spring Bean的生命周期:

  1. Bean定義從XML配置文件中讀取,并實例化。
    Spring對bean的屬性進行依賴注入。
  2. 如果Bean實現了BeanNameAware接口,Spring將bean的ID傳遞給setBeanName()方法。
  3. 如果Bean實現了BeanFactoryAware接口,Spring將調用setBeanFactory()方法,傳入BeanFactory。
  4. 如果Bean實現了ApplicationContextAware接口,setApplicationContext()方法會被調用,傳入當前的ApplicationContext。
  5. 如果Bean實現了BeanPostProcessor接口,postProcessBeforeInitialization()方法會被調用。
  6. 如果Bean實現了InitializingBean接口,afterPropertiesSet()方法會被調用。
  7. 如果Bean在配置文件中使用init-method聲明了初始化方法,該方法會被調用。
  8. 如果Bean實現了BeanPostProcessor接口,postProcessAfterInitialization()方法會被調用。
  9. Bean現在已經準備好,可以被應用程序使用了。
  10. 當容器關閉時,如果Bean實現了DisposableBean接口,destroy()方法會被調用。
  11. 如果Bean在配置文件中使用destroy-method聲明了銷毀方法,該方法會被調用。

5.2 Spring Application的生命周期:

  1. ApplicationContext被初始化/刷新。
  2. Bean實例化、配置和各種初始化方法的調用。
  3. ApplicationContext發布ContextRefreshedEvent事件。
  4. 當應用程序運行時,可以使用ApplicationContext和其中的Beans。
  5. 當ApplicationContext被關閉時,Beans可能會被銷毀。
  6. ApplicationContext發布ContextClosedEvent事件。

6 MyBatis是一個流行的Java ORM框架,它使用了多種設計模式,其中包括:

  • 工廠模式 (Factory Pattern): 使用SqlSessionFactory來創建SqlSession。
  • 建造者模式 (Builder Pattern): 如XMLConfigBuilder和XMLMapperBuilder,用于構建和解析配置文件。
  • 模板模式 (Template Pattern): MyBatis內部處理數據庫操作的某些方法中使用此模式,它定義了操作的步驟,但推遲了一些步驟的具體實現。
  • 代理模式 (Proxy Pattern): MyBatis使用JDK動態代理為Mapper接口創建代理對象,使得開發者可以直接通過接口調用數據庫操作,而無需寫實現。
  • 單例模式 (Singleton Pattern): 如Configuration,在整個MyBatis會話中每一個bean通常只有一個實例。
  • 組合模式 (Composite Pattern): 在配置文件中,可以有多個組合在一起。

7 volatile實現什么能力,怎么實現的?

8 Spring Boot的自動配置是基于以下幾個核心概念:

  • @EnableAutoConfiguration: 這是Spring Boot自動配置的核心注解。當你在主類上添加@SpringBootApplication注解時,它其實包括了@EnableAutoConfiguration。該注解告訴Spring Boot根據添加的jar依賴自動配置項目。

  • spring.factories文件: 在Spring Boot的自動配置處理中,spring.factories文件扮演了核心角色。Spring Boot在啟動時會掃描項目的classpath,找到所有包含spring.factories文件的jar包,然后讀取該文件中的內容,找到并加載所有的自動配置類。

  • 條件注解: 如@ConditionalOnClass, @ConditionalOnBean, @ConditionalOnMissingBean, @ConditionalOnProperty等。這些注解確保只有當特定條件滿足時,某些配置或bean才會被創建。例如,如果classpath下有某個特定的類,或者Spring上下文中有/沒有某個bean,或者一個配置屬性有特定的值等。

整體流程簡要如下:

  • Spring Boot在啟動時掃描classpath,找到包含spring.factories文件的jar包。
  • 從spring.factories文件中獲取到所有的自動配置類。
  • 根據條件注解,決定哪些自動配置類會被加載或哪些bean會被創建。
  • 如果需要,還可以通過application.properties或application.yml文件來調整默認配置。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36682.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36682.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36682.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試攻略,Java 基礎面試 100 問(十三)

什么時候用 assert? assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。一般來說,assertion 用于保證程序最基本、關鍵的正確性。assertion 檢查通常在開發和測試時開啟。為了提高性能,在軟件發布…

支持對接鴻蒙系統的無線模塊及其常見應用介紹

近距離的無線通信得益于萬物互聯網的快速發展,基于集成部近距離無線連接,為固定和移動設備建立通信的藍牙技術也已經廣泛應用于汽車領域、工業生產及醫療領域。為協助物聯網企業終端產品能快速接入鴻蒙生態系統,SKYLAB聯手國產芯片廠家研發推…

找不到mfc140u.dll怎么辦?mfc140u.dll丟失怎樣修復?簡單三招搞定

最近我遇到了一個問題,發現我的電腦上出現了mfc140u.dll文件丟失的錯誤提示。這個錯誤導致一些應用程序無法正常運行,讓我感到非常困擾。經過一番研究和嘗試,我終于成功修復了這個問題,并從中總結出了一些心得。 mfc140u.dll丟失原…

財報解讀:繼續押注Disney+,迪士尼距離盈利還有多遠?

迪士尼最新一季的“答卷”,透露著不小的寒氣。 近日,迪士尼披露了2023財年第三季度(自然年2023年Q2)業績報告,營收223.3億美元,同比僅增長4%,低于市場預期的225.1億美元;歸母凈虧損…

【人工智能前沿弄潮】——生成式AI系列:Diffusers應用 (2) 訓練擴散模型(無條件圖像生成)

無條件圖像生成是擴散模型的一種流行應用,它生成的圖像看起來像用于訓練的數據集中的圖像。與文本或圖像到圖像模型不同,無條件圖像生成不依賴于任何文本或圖像。它只生成與其訓練數據分布相似的圖像。通常,通過在特定數據集上微調預訓練模型…

OpenLayers入門,OpenLayers入門文檔,OpenLayers入門手冊,OpenLayers相比其他地圖引擎有哪些優點?

專欄目錄: OpenLayers入門教程匯總目錄 前言 在學習OpenLayers之前,總是需要了解OpenLayers,知道OpenLayers是什么,OpenLayers能夠做什么,OpenLayers有哪些用途和特性,然后OpenLayers相比其他地圖引擎又有…

數學運算1

正確答案:F 你的答案:E 參考答案:最大排列為100 1 99 2 98 3…51 49 50 所以和為999897…1(100-50)因為是一個圈所以,100和50相接,所以等于5000 知識點:數學運算

MySQL 慢查詢探究分析

目錄 背景: mysql 整體結構: SQL查詢語句執行過程是怎樣的: 知道了mysql的整體架構,那么一條查詢語句是怎么被執行的呢: 什么是索引: 建立索引越多越好嗎:   如何發現慢查詢&#xff1…

樹結構--介紹--二叉樹遍歷的遞歸實現

目錄 樹 樹的學術名詞 樹的種類 二叉樹的遍歷 算法實現 遍歷命名 二叉樹的中序遍歷 二叉樹的后序遍歷 二叉樹的后序遍歷迭代算法 二叉樹的前序遍歷 二叉樹的前序遍歷迭代算法 樹 樹是一種非線性的數據結構,它是由n(n≥0)個有限節點組成一個具有層次關系…

Docker安裝 elasticsearch-head

目錄 前言安裝elasticsearch-head步驟1:準備1. 安裝docker2. 搜索可以使用的鏡像。3. 也可從docker hub上搜索鏡像。4. 選擇合適的redis鏡像。 步驟2:拉取elasticsearch-head鏡像拉取鏡像查看已拉取的鏡像 步驟3:創建容器創建容器方式1&#…

SpringBoot復習:(28)【前后端不分離】自定義View

一、自定義View package cn.edu.tju.view;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Comp…

C# --- Case Study

C# --- Case Study C# — Mongo數據庫事務的應用 C# — 如何解析Json文件并注入MongoDB C# — MongoDB如何安全的替換Collection

百度翻譯API整合SpringBoot

案例背景,按照官方給的Demo,實在是太啰嗦了, 大致步驟 封裝數據>簽名>發送請求, 仔細一看劈里啪啦一大堆,最后還要手動關流關連接,難道整合到SpringBoot項目里面我還得為內存管理考慮 所以就有了如下需求 使用 RestTemplate的對象進行發送請求數據,RestTemplate由s…

Redis緩存刪除略和內存淘汰策略及LRU

1、Redis內存若在配置文件中未設置,內存會無限制增長,直到超出物理內存,拋出out of memory內存耗盡異常 解決方法,調整maxmemory參數,一般設置為物理內存的3/4,并且添加緩存刪除策略 2、Redis對于設置了過…

項目經理的會議之道:全參與還是精選參與?

引言 在項目管理中,會議是一個常見的工具,用于溝通信息、解決問題、做出決策等。然而,項目經理是否需要參加所有的會議呢?這是一個值得深思的問題。作為項目經理,我們需要權衡會議的重要性和我們的時間管理。我們不能…

【第一階段】kotlin的函數

函數頭 fun main() {getMethod("zhangsan",22) }//kotlin語言默認是public,kotlin更規范,先有輸入( getMethod(name:String,age:Int))再有輸出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…

Elasticsearch集群shard過多后導致的性能問題分析

1.問題現象 上午上班以后發現ES日志集群狀態不正確,集群頻繁地重新發起選主操作。對外不能正常提供數據查詢服務,相關日志數據入庫也產生較大延時 2.問題原因 相關日志 查看ES集群日志如下: 00:00:51開始集群各個節點與當時的master節點…

Playwright快速上手-1

前言 隨著近年來對UI自動化測試的要求越來越高,,功能強大的測試框架也不斷的涌現。本系列主講的Playwright作為一款新興的端到端測試框架,憑借其獨特優勢,正在逐漸成為測試工程師的熱門選擇。 本系列文章將著重通過示例講解 Playwright python開發環境的搭建 …

Linux Day07

一、僵死進程 1.1僵死進程產生的原因 子進程先于父進程結束, 而父進程沒有獲取子進程退出碼,釋放子進程占用的資源,此時子進程將成為一個僵死進程。 在第一個框這里時父進程子進程都沒有結束,顯示其pid 父進程是2349,子進程是235…

【Nginx】Nginx網站服務

國外主流還是使用apache;國內現在主流是nginx(并發能力強,相對穩定) nginx:高性能、輕量級的web服務軟件 特點: 1.穩定性高(沒apache穩); 2.系統資源消耗比較低&#xf…