?? 作者簡介:王哥,CSDN2022博客總榜Top100??、博客專家??
?? 技術交流:定期更新Java硬核干貨,不定期送書活動
?? 王哥多年工作總結:Java學習路線總結, 點擊 突擊面試
?? 數(shù)十萬人的面試選擇: 面試說人話系列《面試1v1》
我是 javapub,一名 Markdown
程序員從?????,八股文種子選手。
《面試1v1》 連載中…
我是 javapub,一名 Markdown
程序員從?????,八股文種子選手。
面試官: 想請你簡單介紹一下 Spring 框架,它的核心特性是什么?
候選人: Spring 是一個開源框架,目的是簡化 JavaEE 開發(fā)。它的核心特性有:
- IoC(Inverse of Control):通過 DI(Dependency Injection)實現(xiàn)將對象間的依賴關系交給 Spring 管理。
- AOP(Aspect Oriented Programming):面向切面編程,可以在程序運行期間動態(tài)的將某段代碼切入到指定的方法、指定的位置進行運行。
- Portlet MVC:Spring 提供 MVC 框架可以快速開發(fā) Web 應用。
- 事務管理:Spring 提供廣泛的事務管理接口,支持 JDBC、Hibernate 等事務管理。
- Spring 統(tǒng)一一體化了其他框架和技術,如:Struts、Hibernate、Quartz 等。
面試官(笑):你說的真是五花八門,讓我有點暈,來聊點具體的吧。Spring 是如何工作的,它如何用于構建 Web 應用程序?
候選人: 好的,Spring 的工作原理主要是 IoC 容器。對 Web 應用來說,Spring MVC 是基于 JavaEE 的 Model-View-Controller 設計模式構建的,主要工作流程是:
- 瀏覽器發(fā)送請求到 DispatcherServlet。
- DispatcherServlet 接收請求后會轉(zhuǎn)交給 HandlerMapping 得到請求對應的 Handler。
- HandlerMapping 將 Handler 映射到 HandlerAdapter。
- HandlerAdapter 調(diào)用 Handler 處理請求,Handler 會返回一個 ModelAndView。
- ViewResolver 解析 ModelAndView,找到正確的 View。
- DispatcherServlet 將 View 返回給瀏覽器。
通過這個流程,Spring MVC 應用了 MVC 模式,實現(xiàn)了業(yè)務邏輯、控制邏輯、表現(xiàn)邏輯的分離,使我們可以更加專注于業(yè)務開發(fā)。
面試官: 你說的很具體,我明白了。那么 Spring 可以在哪些實際場景中使用?開發(fā)人員在使用 Spring 時常犯哪些錯誤?
候選人: Spring 可以應用在很多實際場景中:
- Web 應用:Spring MVC 是 Spring 體系中最為成熟的框架,可以用來開發(fā)網(wǎng)站、BBS、博客等 Web 應用。
- 企業(yè)應用:Spring 提供事務管理、數(shù)據(jù)訪問等功能,非常適用于開發(fā)企業(yè)級應用。
- 微服務:Spring Boot 提供了快速開發(fā)單個微服務的能力,配合 Spring Cloud 可以開發(fā)微服務架構的系統(tǒng)。
- Android 應用:Spring for Android 提供了在 Android 應用中使用 Spring 的能力。
開發(fā)人員在使用 Spring 時常犯的幾個錯誤:
- 容器管理對象依賴關系錯亂:未正確配置 bean 的依賴關系,導致依賴注入錯誤。
- 上下文目錄 problemas:beans.xml 配置文件放在了非上下文目錄,導致 Spring 無法識別。
- 事務管理錯誤:未正確配置事務屬性,導致事務管理不生效。
- AOP 誤用:濫用 AOP 或錯誤使用 AOP 導致 sistem 過于復雜或 AOP 不生效。
- 未考慮擴展性:在開發(fā)初期未考慮系統(tǒng)擴展性,導致系統(tǒng)難以演進。
面試官: 那么如何使基于 Spring 的應用程序更高效、更可擴展?
候選人: 這里有幾點建議:
- 采用模塊化設計,遵循高內(nèi)聚低耦合原則,每個模塊保持高內(nèi)聚,模塊之間低耦合。
- 使用設計模式,如工廠模式、單例模式、代理模式等,提高系統(tǒng)擴展性。
- 應用 AOP,通過預置切點在不修改源代碼的情況下增加新功能。
- 使用 Spring 的事件機制,通過事件監(jiān)聽器監(jiān)聽事件,當事件觸發(fā)時執(zhí)行相應邏輯。
- 應用 Spring 的 Profile 功能,可以根據(jù)環(huán)境部署不同的 bean,提高系統(tǒng)靈活性。
- 使用 Spring Boot 依賴管理和自動配置的能力,簡化構建過程,提高開發(fā)效率。
- 應用微服務架構,將單體應用拆分成職責單一、松耦合的服務,更容易擴展和升級。
- 使用緩存技術,如 Redis 緩存數(shù)據(jù)庫查詢結果,降低數(shù)據(jù)庫壓力,提高系統(tǒng)吞吐量。
面試官: 很棒,你對 Spring 和高可擴展系統(tǒng)的理解很透徹!最后一個問題,Spring 的源碼中 IoC 容器的實現(xiàn)你可以大致描述一下嗎?
候選人: 可以的,IoC 容器的實現(xiàn)主要在 AbstractApplicationContext 及其子類 ClassPathXmlApplicationContext 和FileSystemXmlApplicationContext 中。主要流程是:
- 容器啟動時會調(diào)用 refresh() 方法,其中會調(diào)用 obtainFreshBeanFactory() 方法初始化 DefaultListableBeanFactory,此為 IoC 容器的核心。
// AbstractApplicationContext.java
public void refresh() throws BeansException, IllegalStateException {
// 初始化 BeanFactory
DefaultListableBeanFactory beanFactory = obtainFreshBeanFactory();
}
- 然后會調(diào)用 loadBeanDefinitions(beanFactory) 方法加載 bean 定義,主要通過 XmlBeanDefinitionReader 解析 bean 定義文件。
// AbstractXmlApplicationContext.java
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
// Create a new XmlBeanDefinitionReader for the given BeanFactory.
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
// Configure the bean definition reader with this context's
// resource loading environment.
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
// Allow a subclass to provide custom initialization of the reader,
// then proceed with actually loading the bean definitions.
initBeanDefinitionReader(beanDefinitionReader);
loadBeanDefinitions(beanDefinitionReader);
}
- bean 實例化階段會調(diào)用 getBean() 方法,通過工廠方法或構造器實例化 bean。
- 實例化 bean 后,會對 bean 進行屬性注入、初始化以及其他Aware接口回調(diào)。
- bean 的生命周期至此結束,容器會對 bean 進行管理,直至容器關閉。
這就是 IoC 容器實現(xiàn)的大致流程,關鍵是 bean 定義資源的加載和解析,以及 bean 的實例化及生命周期管理。IoC 容器屏蔽了 bean 之間的依賴關系,使 bean 的使用者可以零配置使用 bean。
面試官: 你的解釋很到位,IoC 容器的源碼分析確實需要對它的原理有深入了解。最后一個問題,在你的項目中是如何設計一個高并發(fā)的系統(tǒng)的?
候選人: 設計一個高并發(fā)系統(tǒng),有以下幾點建議:
- 選擇高性能技術棧:選擇支持高并發(fā)的語言(Java、Go 等)和框架(Spring、Vert.x 等)。
- 采用分布式和微服務架構:將系統(tǒng)拆分為多個單一職責的服務,部署在不同服務器上,可以實現(xiàn)高可用和負載均衡。
- 選擇高性能存儲:使用能支撐高并發(fā)讀寫的數(shù)據(jù)庫,如 Redis、Kafka 等。對關系型數(shù)據(jù)庫進行分庫分表、添加緩存等優(yōu)化。
- 限流與降級:使用限流手段控制流量,避免被高流量打垮;使用降級策略保證核心服務可用。
- 緩存與異步:對頻繁讀取數(shù)據(jù)的接口使用緩存;對非關鍵性計算使用異步處理,避免線程阻塞。
- 服務治理:使用服務注冊與發(fā)現(xiàn)、熔斷器、網(wǎng)關等手段管理各服務。
- 線程模型優(yōu)化:根據(jù)業(yè)務選擇恰當?shù)木€程模型。如對大量短連接使用線程池;對長連接使用主從 Reactor 線程模型等。
- 利用好硬件資源:合理分配 CPU 和內(nèi)存資源給應用;利用好多核 CPU 進行并行計算等。
- 測試與監(jiān)控:進行壓力測試,監(jiān)控系統(tǒng)的負載、吞吐量和延遲指標,并進行優(yōu)化。
- 容錯和自動恢復:設計穩(wěn)定的容錯方案,當系統(tǒng)發(fā)生故障時可以自動檢測并恢復。
這些方面搭配得當,可以設計一個高性能、高并發(fā)的系統(tǒng)。但需要權衡系統(tǒng)復雜性,在滿足需求前提下保持最簡實現(xiàn)。
面試官: 很棒,你在高并發(fā)系統(tǒng)設計方面有很強的理解力和豐富經(jīng)驗。
最近我在更新《面試1v1》系列文章,主要以場景化的方式,講解我們在面試中遇到的問題,致力于讓每一位工程師拿到自己心儀的offer,感興趣可以關注JavaPub追更!
《面試1v1》 連載中…
??目錄合集:
Gitee:https://gitee.com/rodert/JavaPub
GitHub:https://github.com/Rodert/JavaPub
文章來源:http://www.zghlxwxcb.cn/news/detail-495708.html
http://javapub.net.cn文章來源地址http://www.zghlxwxcb.cn/news/detail-495708.html
到了這里,關于《面試1v1》Spring基礎的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!