由5名程式設計師親身面試百度,騰訊,阿里總結的20道面試必考題
寫在前面:
本篇文章由小編的幾位參加過阿里,騰訊,阿里面試的朋友整理總結而成,由於篇幅有限,所以挑選出其中最常問的20道面試必考題以及答案分享給大家。
1.BeanFactory 和 ApplicationContext 有什麼區別
> BeanFactory 可以理解為含有 bean 集合的工廠類。BeanFactory 包含了種 bean 的定義,
以便在接收到客戶端請求時將對應的 bean 例項化。
> BeanFactory 還能在例項化物件的時生成協作類之間的關係。此舉將 bean 自身與 bean 客
戶端的配置中解放出來。BeanFactory 還包含了 bean 生命週期的控制,呼叫客戶端的初始
> 從表面上看,application context 如同 bean factory 一樣具有 bean 定義、bean 關聯關
系的設定,根據請求分發 bean 的功能。但 application context 在此基礎上還提供了其他
的功能。
> 提供了支援國際化的文字訊息
> 統一的資原始檔讀取方式
> 已在監聽器中註冊的 bean 的事件
2.Spring Bean 的生命週期
> Spring Bean 的生命週期簡單易懂。在一個bean 例項被初始化時,需要執行一系列的初
作,並從 bean 容器中移除。
> Spring bean factory 負責管理在 spring 容器中被建立的 bean 的生命週期。Bean 的生命
週期由兩組回撥(call back)方法組成。
> 初始化之後呼叫的回撥方法。
> 銷燬之前呼叫的回撥方法。
> Spring 框架提供了以下四種方式來管理 bean 的生命週期事件:
> InitializingBean 和 DisposableBean 回撥介面
> 針對特殊行為的其他 Aware 介面
> Bean 配置檔案中的 Custom init()方法和 destroy()方法
3.Spring IOC 如何實現
> Spring 中的 org.springframework.beans 包和 org.springframework.context 包構成了Spring 框架 IoC 容器的基礎。
> BeanFactory 介面提供了一個先進的配置機制,使得任何型別的物件的配置成為可能。
ApplicationContex 介面對BeanFactory(是一個子介面)進行了擴充套件,在 BeanFactory 的
基礎上添加了其他功能,比如與 Spring 的 AOP 更容易整合,也提供了處理 message
resource 的機制(用於國際化)、事件傳播以及應用層的特別配置,比如針對 Web 應用的
WebApplicationContext。
> org.springframework.beans.factory.BeanFactory 是 Spring IoC 容器的具體實現,用
來包裝和管理前面提到的各種 bean。BeanFactory介面是 Spring IoC 容器的核心介面。
4. 說說 Spring AOP
> 面向切面程式設計,在我們的應用中,經常需要做一些事情,但是這些事情與核心業務無
關,比如,要記錄所有 update*方法的執行時間時間,操作人等等資訊,記錄到日誌,
> 通過 spring 的 AOP 技術,就可以在不修改 update*的程式碼的情況下完成該需求。
5.Spring AOP 實現原理
> Spring AOP 中的動態代理主要有兩種方式,JDK 動態代理和 CGLIB 動態代理。JDK 動態代
理通過反射來接收被代理的類,並且要求被代理的類必須實現一個介面。JDK 動態代理的
核心是 InvocationHandler介面和 Proxy類。
> 如果目標類沒有實現介面,那麼 Spring AOP 會選擇使用 CGLIB 來動態代理目標類。CGLIB
(Code Generation Library),是一個程式碼生成的類庫,可以在執行時動態的生成某個類
的子類,注意,CGLIB 是通過繼承的方式做的動態代理,因此如果某個類被標記為final,
那麼它是無法使用 CGLIB 做動態代理的。
6. 動態代理(cglib 與 JDK)
> JDK 動態代理類和委託類需要都實現同一個介面。也就是說只有實現了某個介面的類可以
使用 Java 動態代理機制。但是,事實上使用中並不是遇到的所有類都會給你實現一個接
口。因此,對於沒有實現介面的類,就不能使用該機制。而 CGLIB 則可以實現對類的動態
代理。
7. Spring 事務實現方式
> 1、編碼方式
> 所謂程式設計式事務指的是通過編碼方式實現事務,即類似於 JDBC 程式設計實現事務管理。
> 2、宣告式事務管理方式
> 宣告式事務管理又有兩種實現方式:基於 xml 配置檔案的方式;另一個實在業務方法上
進行@Transaction 註解,將事務規則應用到業務邏輯中
8. Spring 事務底層原理
> a、劃分處理單元——IOC
> 由於 spring 解決的問題是對單個數據庫進行區域性事務處理的,具體的實現首相用 spring
中的 IOC劃分了事務處理單元。並且將對事務的各種配置放到了 ioc容器中(設定事務管
理器,設定事務的傳播特性及隔離機制)。
> b、AOP 攔截需要進行事務處理的類
> Spring 事務處理模組是通過 AOP 功能來實現宣告式事務處理的,具體操作(比如事務實
行的配置和讀取,事務物件的抽象),用 TransactionProxyFactoryBean介面來使用 AOP
功能,生成 proxy代理物件,通過 TransactionInterceptor 完成對代理方法的攔截,將事
務處理的功能編織到攔截的方法中。讀取 ioc容器事務配置屬性,轉化為 spring 事務處理
需要的內部資料結構(TransactionAttributeSourceAdvisor),轉化為
TransactionAttribute 表示的資料物件。
> c、對事物處理實現(事務的生成、提交、回滾、掛起)
> spring 委託給具體的事務處理器實現。實現了一個抽象和適配。適配的具體事務處理
器:DataSource 資料來源支援、hibernate資料來源事務處理支援、JDO 資料來源事務處理支
持,JPA、JTA 資料來源事務處理支援。這些支援都是通過設計
PlatformTransactionManager、AbstractPlatforTransaction 一系列事務處理的支援。 為
常用資料來源支援提供了一系列的 TransactionManager。
> d、結合
> PlatformTransactionManager 實現了 TransactionInterception 介面,讓其與
TransactionProxyFactoryBean 結合起來,形成一個 Spring 宣告式事務處理的設計體系。
9. 如何自定義註解實現功能
> 建立自定義註解和建立一個介面相似,但是註解的 interface關鍵字需要以@符號開頭。
> 註解方法不能帶有引數;
> 註解方法返回值型別限定為:基本型別、String、Enums、Annotation 或者是這些型別的
陣列;
> 註解方法可以有預設值;
> 註解本身能夠包含元註解,元註解被用來註解其它註解。
10.Spring MVC 執行流程
> 1.spring mvc 將所有的請求都提交給 DispatcherServlet,它會委託應用系統的其他模組
負責對請求 進行真正的處理工作。
> 2.DispatcherServlet 查詢一個或多個HandlerMapping,找到處理請求的 Controller.
> 3.DispatcherServlet 請請求提交到目標 Controller
> 4.Controller 進行業務邏輯處理後,會返回一個 ModelAndView
> 5.Dispathcher 查詢一個或多個 ViewResolver 檢視解析器,找到 ModelAndView 物件指定
的檢視物件
> 6.檢視物件負責渲染返回給客戶端。
11. Spring MVC 啟動流程
> 在 web.xml 檔案中給 Spring MVC 的 Servlet 配置了 load-on-startup,所以程式啟動的
> 時候會初始化 Spring MVC,在 HttpServletBean 中將配置的 contextConfigLocation
> 屬性設定到 Servlet 中,然後在 FrameworkServlet 中建立了 WebApplicationContext,
> DispatcherServlet 根據 contextConfigLocation 配置的 classpath 下的 xml 檔案初始化
了
> Spring MVC 總的元件。
12.Spring 的單例實現原理
> Spring 對 Bean 例項的建立是採用單例登錄檔的方式進行實現的,而這個登錄檔的快取是
ConcurrentHashMap 物件。
13. Spring 框架中用到了哪些設計模式
> 代理模式—在 AOP 和 remoting 中被用的比較多。
> 單例模式—在 spring 配置檔案中定義的 bean 預設為單例模式。
> 模板方法—用來解決程式碼重複的問題。比如. RestTemplate, JmsTemplate,
JpaTemplate。
> 前端控制器—Spring 提供了 DispatcherServlet 來對請求進行分發。
> 檢視幫助(View Helper )—Spring 提供了一系列的 JSP 標籤,高效巨集來輔助將分散的程式碼
整合在視圖裡。
> 依賴注入—貫穿於 BeanFactory / ApplicationContext 介面的核心理念。
> 工廠模式—BeanFactory 用來建立物件的例項。
Netty
14.為什麼選擇 Netty
> 1) API 使用簡單,開發門檻低;
> 2) 功能強大,預置了多種編解碼功能,支援多種主流協議;
> 3) 定製能力強,可以通過 ChannelHandler 對通訊框架進行靈活的擴充套件;
> 4) 效能高,通過與其它業界主流的 NIO 框架對比,Netty 的綜合性能最優;
> 5) 成熟、穩定,Netty 修復了已經發現的所有 JDK NIO BUG,業務開發人員不需要再為
NIO 的 BUG 而煩惱;
> 6) 社群活躍,版本迭代週期短,發現的 BUG 可以被及時修復,同時,更多的新功能會被
加入;
> 7) 經歷了大規模的商業應用考驗,質量已經得到驗證。在網際網路、大資料、網路遊戲、
企業應用、電信軟體等眾多行業得到成功商用,證明了它可以完全滿足不同行業的商業應
用。
> 正是因為這些優點,Netty 逐漸成為 Java NIO 程式設計的首選框架。
15.說說業務中,Netty 的使用場景
> 構建高效能、低時延的各種 Java 中介軟體,例如 MQ、分散式服務框架、ESB 訊息匯流排等,
Netty 主要作為基礎通訊框架提供高效能、低時延的通訊服務;
> 公有或者私有協議棧的基礎通訊框架,例如可以基於 Netty 構建非同步、高效能的
WebSocket 協議棧;
> 各領域應用,例如大資料、遊戲等,Netty 作為高效能的通訊框架用於內部各模組的資料
分發、傳輸和彙總等,實現模組之間高效能通訊。
16.原生的 NIO 在 JDK 1.7 版本存在 epoll bug
> 它會導致 Selector 空輪詢,最終導致 CPU 100%。官方聲稱在 JDK 1.6 版本的 update18 修
復了該問題,但是直到 JDK 1.7版本該問題仍舊存在,只不過該 BUG發生概率降低了一些
而已,它並沒有得到根本性解決。
17.什麼是 TCP 粘包/拆包
> 1、要傳送的資料大於 TCP 傳送緩衝區剩餘空間大小,將會發生拆包。
> 2、待發送資料大於 MSS(最大報文長度),TCP在傳輸前將進行拆包。
> 3、要傳送的資料小於 TCP 傳送緩衝區的大小,TCP 將多次寫入緩衝區的資料一次傳送出
去,將會發生粘包。
> 4、接收資料端的應用層沒有及時讀取接收緩衝區中的資料,將發生粘包。
18.TCP 粘包/拆包的解決辦法
> 1、傳送端給每個資料包新增包首部,首部中應該至少包含資料包的長度,這樣接收端在
接收到資料後,通過讀取包首部的長度欄位,便知道每一個數據包的實際長度了。
> 2、傳送端將每個資料包封裝為固定長度(不夠的可以通過補 0 填充),這樣接收端每次
從接收緩衝區中讀取固定長度的資料就自然而然的把每個資料包拆分開來。
> 3、可以在資料包之間設定邊界,如新增特殊符號,這樣,接收端通過這個邊界就可以將
不同的資料包拆分開。
19.Netty 執行緒模型
> 首先,Netty 使用 EventLoop 來處理連線上的讀寫事件,而一個連線上的所有請求都保證
在一個 EventLoop中被處理,一個 EventLoop中只有一個 Thread,所以也就實現了一個連
接上的所有事件只會在一個執行緒中被執行。一個 EventLoopGroup 包含多個 EventLoop,可
以把一個 EventLoop 當做是 Reactor執行緒模型中的一個執行緒,而一個 EventLoopGroup 類似
於一個 ExecutorService
20.說說 Netty 的零拷貝
> “零拷貝”是指計算機操作的過程中,CPU 不需要為資料在記憶體之間的拷貝消耗資源。而
它通常是指計算機在網路上傳送檔案時,不需要將檔案內容拷貝到使用者空間(User
Space)而直接在核心空間(Kernel Space)中傳輸到網路的方式。
&n