Java面試3-框架篇
框架篇
Spring
BeanFactory 和 ApplicationContext 有什麼區別
BeanFactory 可以理解為含有bean集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請求時將對應的bean例項化。
BeanFactory還能在例項化物件的時生成協作類之間的關係。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命週期的控制,呼叫客戶端的初始化方法(initialization methods)和銷燬方法(destruction methods)。
從表面上看,application context如同bean factory一樣具有bean定義、bean關聯關係的設定,根據請求分發bean的功能。但application context在此基礎上還提供了其他的功能。
提供了支援國際化的文字訊息
統一的資原始檔讀取方式
已在監聽器中註冊的bean的事件
摘抄自:Spring Bean 的生命週期
Spring Bean的生命週期簡單易懂。在一個bean例項被初始化時,需要執行一系列的初始化操作以達到可用的狀態。同樣的,當一個bean不在被呼叫時需要進行相關的析構操作,並從bean容器中移除。
Spring bean factory 負責管理在spring容器中被建立的bean的生命週期。Bean的生命週期由兩組回撥(call back)方法組成。
初始化之後呼叫的回撥方法。
銷燬之前呼叫的回撥方法。
Spring框架提供了以下四種方式來管理bean的生命週期事件:
InitializingBean和DisposableBean回撥介面
針對特殊行為的其他Aware介面
Bean配置檔案中的Custom init()方法和destroy()方法
@PostConstruct和@PreDestroy註解方式
摘抄自: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 容器的核心介面。說說 Spring AOP
面向切面程式設計,在我們的應用中,經常需要做一些事情,但是這些事情與核心業務無關,比如,要記錄所有update方法的執行時間時間,操作人等等資訊,記錄到日誌,
通過spring的AOP技術,就可以在不修改update的程式碼的情況下完成該需求。Spring AOP 實現原理
Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理。JDK動態代理通過反射來接收被代理的類,並且要求被代理的類必須實現一個介面。JDK動態代理的核心是InvocationHandler介面和Proxy類。
如果目標類沒有實現介面,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB(Code Generation Library),是一個程式碼生成的類庫,可以在執行時動態的生成某個類的子類,注意,CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那麼它是無法使用CGLIB做動態代理的。動態代理(cglib 與 JDK)
JDK 動態代理類和委託類需要都實現同一個介面。也就是說只有實現了某個介面的類可以使用Java動態代理機制。但是,事實上使用中並不是遇到的所有類都會給你實現一個介面。因此,對於沒有實現介面的類,就不能使用該機制。而CGLIB則可以實現對類的動態代理。
摘抄自: http://www.importnew.com/22015.htmlSpring 事務實現方式
1、編碼方式
所謂程式設計式事務指的是通過編碼方式實現事務,即類似於JDBC程式設計實現事務管理。
2、宣告式事務管理方式
宣告式事務管理又有兩種實現方式:基於xml配置檔案的方式;另一個實在業務方法上進行@Transaction註解,將事務規則應用到業務邏輯中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宣告式事務處理的設計體系。如何自定義註解實現功能
建立自定義註解和建立一個介面相似,但是註解的interface關鍵字需要以@符號開頭。
註解方法不能帶有引數;
註解方法返回值型別限定為:基本型別、String、Enums、Annotation或者是這些型別的陣列;
註解方法可以有預設值;
註解本身能夠包含元註解,元註解被用來註解其它註解。
摘抄自:http://www.importnew.com/20286.htmlSpring MVC 執行流程
1.spring mvc將所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模組負責對請求 進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請請求提交到目標Controller
4.Controller進行業務邏輯處理後,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver檢視解析器,找到ModelAndView物件指定的檢視物件
6.檢視物件負責渲染返回給客戶端。
摘抄自:http://blog.csdn.net/liangzi_lucky/article/details/52459378Spring MVC 啟動流程
在 web.xml 檔案中給 Spring MVC 的 Servlet 配置了 load-on-startup,所以程式啟動的
時候會初始化 Spring MVC,在 HttpServletBean 中將配置的 contextConfigLocation
屬性設定到 Servlet 中,然後在 FrameworkServlet 中建立了 WebApplicationContext,
DispatcherServlet 根據 contextConfigLocation 配置的 classpath 下的 xml 檔案初始化了
Spring MVC 總的元件。
摘自: 《SpringMVC 原始碼分析與實踐》Spring 框架中用到了哪些設計模式
代理模式—在AOP和remoting中被用的比較多。
單例模式—在spring配置檔案中定義的bean預設為單例模式。
模板方法—用來解決程式碼重複的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。
前端控制器—Spring提供了DispatcherServlet來對請求進行分發。
檢視幫助(View Helper )—Spring提供了一系列的JSP標籤,高效巨集來輔助將分散的程式碼整合在視圖裡。
依賴注入—貫穿於BeanFactory / ApplicationContext介面的核心理念。
工廠模式—BeanFactory用來建立物件的例項。
摘抄自: http://www.importnew.com/15851.html#design_patterns_used_in_springSpring 其他產品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)
Netty
為什麼選擇 Netty
1) API使用簡單,開發門檻低;
2) 功能強大,預置了多種編解碼功能,支援多種主流協議;
3) 定製能力強,可以通過 ChannelHandler 對通訊框架進行靈活的擴充套件;
4) 效能高,通過與其它業界主流的NIO框架對比,Netty的綜合性能最優;
5) 成熟、穩定,Netty修復了已經發現的所有JDK NIO BUG,業務開發人員不需要再為NIO的BUG而煩惱;
6) 社群活躍,版本迭代週期短,發現的BUG可以被及時修復,同時,更多的新功能會被加入;
7) 經歷了大規模的商業應用考驗,質量已經得到驗證。在網際網路、大資料、網路遊戲、企業應用、電信軟體等眾多行業得到成功商用,證明了它可以完全滿足不同行業的商業應用。
正是因為這些優點,Netty逐漸成為Java NIO程式設計的首選框架。
摘抄自:http://ifeve.com/netty-2-6/說說業務中,Netty 的使用場景
構建高效能、低時延的各種Java中介軟體,例如MQ、分散式服務框架、ESB訊息匯流排等,Netty主要作為基礎通訊框架提供高效能、低時延的通訊服務;
公有或者私有協議棧的基礎通訊框架,例如可以基於Netty構建非同步、高效能的WebSocket協議棧;
各領域應用,例如大資料、遊戲等,Netty作為高效能的通訊框架用於內部各模組的資料分發、傳輸和彙總等,實現模組之間高效能通訊。
摘抄自:http://www.voidcn.com/article/p-xydqhgxk-uk.html原生的 NIO 在 JDK 1.7 版本存在 epoll bug
它會導致Selector空輪詢,最終導致CPU 100%。官方聲稱在JDK 1.6版本的update18修復了該問題,但是直到JDK 1.7版本該問題仍舊存在,只不過該BUG發生概率降低了一些而已,它並沒有得到根本性解決。
摘抄自: http://blog.csdn.net/broadview2006/article/details/46041995什麼是TCP 粘包/拆包
1、要傳送的資料大於TCP傳送緩衝區剩餘空間大小,將會發生拆包。
2、待發送資料大於MSS(最大報文長度),TCP在傳輸前將進行拆包。
3、要傳送的資料小於TCP傳送緩衝區的大小,TCP將多次寫入緩衝區的資料一次傳送出去,將會發生粘包。
4、接收資料端的應用層沒有及時讀取接收緩衝區中的資料,將發生粘包。
摘抄自:https://blog.insanecoder.top/tcp-packet-splice-and-split-issue/TCP粘包/拆包的解決辦法
1、傳送端給每個資料包新增包首部,首部中應該至少包含資料包的長度,這樣接收端在接收到資料後,通過讀取包首部的長度欄位,便知道每一個數據包的實際長度了。
2、傳送端將每個資料包封裝為固定長度(不夠的可以通過補0填充),這樣接收端每次從接收緩衝區中讀取固定長度的資料就自然而然的把每個資料包拆分開來。
3、可以在資料包之間設定邊界,如新增特殊符號,這樣,接收端通過這個邊界就可以將不同的資料包拆分開。
摘抄自:https://blog.insanecoder.top/tcp-packet-splice-and-split-issue/Netty 執行緒模型
首先,Netty使用EventLoop來處理連線上的讀寫事件,而一個連線上的所有請求都保證在一個EventLoop中被處理,一個EventLoop中只有一個Thread,所以也就實現了一個連線上的所有事件只會在一個執行緒中被執行。一個EventLoopGroup包含多個EventLoop,可以把一個EventLoop當做是Reactor執行緒模型中的一個執行緒,而一個EventLoopGroup類似於一個ExecutorService
作者:一字馬胡
連結:https://www.jianshu.com/p/128ddc36e713
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。說說 Netty 的零拷貝
“零拷貝”是指計算機操作的過程中,CPU不需要為資料在記憶體之間的拷貝消耗資源。而它通常是指計算機在網路上傳送檔案時,不需要將檔案內容拷貝到使用者空間(User Space)而直接在核心空間(Kernel Space)中傳輸到網路的方式。
Netty 內部執行流程
- Netty的接收和傳送ByteBuffer採用DIRECT BUFFERS,使用堆外直接記憶體進行Socket讀寫,不需要進行位元組緩衝區的二次拷貝。如果使用傳統的堆記憶體(HEAP BUFFERS)進行Socket讀寫,JVM會將堆記憶體Buffer拷貝一份到直接記憶體中,然後才寫入Socket中。相比於堆外直接記憶體,訊息在傳送過程中多了一次緩衝區的記憶體拷貝。
- Netty提供了組合Buffer物件,可以聚合多個ByteBuffer物件,使用者可以像操作一個Buffer那樣方便的對組合Buffer進行操作,避免了傳統通過記憶體拷貝的方式將幾個小Buffer合併成一個大的Buffer。
【轉載自:】http://www.spring4all.com/article/951