百度-Java中级面试题分享-
BeanFactory 和 ApplicationContext 有什么區(qū)別
> BeanFactory?可以理解為含有 bean?集合的工廠類。BeanFactory?包含了種 bean?的定義, 以便在接收到客戶端請求時將對應的 bean?實例化。?
> BeanFactory?還能在實例化對象的時生成協作類之間的關系。此舉將 bean?自身與 bean?客戶端的配置中解放出來。BeanFactory?還包含了 bean?生命周期的控制,調用客戶端的初始化方法(initialization methods)和銷毀方法(destruction methods)。?
> 從表面上看,application?context?如同 bean?factory?一樣具有 bean?定義、bean?關聯關系的設置,根據請求分發(fā) bean?的功能。但 application context?在此基礎上還提供了其他的功能。?
> 提供了支持國際化的文本消息?
> 統(tǒng)一的資源文件讀取方式?
> 已在監(jiān)聽器中注冊的 bean 的事件?
Spring Bean 的生命周期
> Spring Bean?的生命周期簡單易懂。在一個 bean?實例被初始化時,需要執(zhí)行一系列的初始化操作以達到可用的狀態(tài)。同樣的,當一個 bean?不在被調用時需要進行相關的析構操作,并從 bean?容器中移除。?
> Spring bean factory?負責管理在 spring?容器中被創(chuàng)建的 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
> 面向切面編程,在我們的應用中,經常需要做一些事情,但是這些事情與核心業(yè)務無關,比如,要記錄所有 update*方法的執(zhí)行時間時間,操作人等等信息,記錄到日志,?
> 通過 spring 的 AOP 技術,就可以在不修改 update*的代碼的情況下完成該需求。?
Spring AOP 實現原理
> Spring AOP?中的動態(tài)代理主要有兩種方式,JDK?動態(tài)代理和 CGLIB?動態(tài)代理。JDK?動態(tài)代理通過反射來接收被代理的類,并且要求被代理的類必須實現一個接口。JDK?動態(tài)代理的核心是 InvocationHandler?接口和 Proxy?類。?
> 如果目標類沒有實現接口,那么 Spring AOP?會選擇使用 CGLIB?來動態(tài)代理目標類。CGLIB
(Code Generation Library),是一個代碼生成的類庫,可以在運行時動態(tài)的生成某個類的子類,注意,CGLIB?是通過繼承的方式做的動態(tài)代理,因此如果某個類被標記為 final, 那么它是無法使用 CGLIB?做動態(tài)代理的。?
動態(tài)代理(cglib 與 JDK)
> JDK?動態(tài)代理類和委托類需要都實現同一個接口。也就是說只有實現了某個接口的類可以使用 Java?動態(tài)代理機制。但是,事實上使用中并不是遇到的所有類都會給你實現一個接口。因此,對于沒有實現接口的類,就不能使用該機制。而 CGLIB?則可以實現對類的動態(tài)代理。?
Spring 事務實現方式
> 1、編碼方式?
> 所謂編程式事務指的是通過編碼方式實現事務,即類似于 JDBC 編程實現事務管理。?
> 2、聲明式事務管理方式?
> 聲明式事務管理又有兩種實現方式:基于 xml?配置文件的方式;另一個實在業(yè)務方法上進行@Transaction?注解,將事務規(guī)則應用到業(yè)務邏輯中?
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 聲明式事務處理的設計體系。?
如何自定義注解實現功能
> 創(chuàng)建自定義注解和創(chuàng)建一個接口相似,但是注解的 interface 關鍵字需要以@符號開頭。?
> 注解方法不能帶有參數;?
> 注解方法返回值類型限定為:基本類型、String、Enums、Annotation?或者是這些類型的數組;?
> 注解方法可以有默認值;?
> 注解本身能夠包含元注解,元注解被用來注解其它注解。?
Spring MVC 運行流程
> 1.spring mvc?將所有的請求都提交給 DispatcherServlet,它會委托應用系統(tǒng)的其他模塊負責對請求 進行真正的處理工作。?
> 2.DispatcherServlet 查詢一個或多個 HandlerMapping,找到處理請求的 Controller.?
> 3.DispatcherServlet 請請求提交到目標 Controller?
> 4.Controller 進行業(yè)務邏輯處理后,會返回一個 ModelAndView?
> 5.Dispathcher?查詢一個或多個 ViewResolver?視圖解析器,找到 ModelAndView?對象指定的視圖對象?
> 6.視圖對象負責渲染返回給客戶端。?
Spring MVC 啟動流程
> 在 web.xml 文件中給 Spring MVC 的 Servlet 配置了 load-on-startup,所以程序啟動的?
> 時候會初始化 Spring MVC,在 HttpServletBean 中將配置的 contextConfigLocation?
> 屬性設置到 Servlet 中,然后在 FrameworkServlet 中創(chuàng)建了 WebApplicationContext,?
> DispatcherServlet?根據 contextConfigLocation?配置的 classpath?下的 xml?文件初始化了?
> Spring MVC 總的組件。?
為什么選擇 Netty
> 1) API 使用簡單,開發(fā)門檻低;?
> 2) 功能強大,預置了多種編解碼功能,支持多種主流協議;?
> 3) 定制能力強,可以通過 ChannelHandler 對通信框架進行靈活的擴展;?
> 4) 性能高,通過與其它業(yè)界主流的 NIO 框架對比,Netty 的綜合性能最優(yōu);?
> 5) 成熟、穩(wěn)定,Netty?修復了已經發(fā)現的所有 JDK NIO BUG,業(yè)務開發(fā)人員不需要再為NIO?的 BUG?而煩惱;?
> 6)?社區(qū)活躍,版本迭代周期短,發(fā)現的 BUG?可以被及時修復,同時,更多的新功能會被加入;?
> 7) 經歷了大規(guī)模的商業(yè)應用考驗,質量已經得到驗證。在互聯網、大數據、網絡游戲、企業(yè)應用、電信軟件等眾多行業(yè)得到成功商用,證明了它可以完全滿足不同行業(yè)的商業(yè)應用。?
> 正是因為這些優(yōu)點,Netty 逐漸成為 Java NIO 編程的首選框架。?
說說業(yè)務中,Netty 的使用場景
> 構建高性能、低時延的各種 Java?中間件,例如 MQ、分布式服務框架、ESB?消息總線等, Netty?主要作為基礎通信框架提供高性能、低時延的通信服務;?
> 公有或者私有協議棧的基礎通信框架,例如可以基于 Netty?構建異步、高性能的WebSocket?協議棧;?
> 各領域應用,例如大數據、游戲等,Netty?作為高性能的通信框架用于內部各模塊的數據分發(fā)、傳輸和匯總等,實現模塊之間高性能通信。?
原生的 NIO 在 JDK 1.7 版本存在 epoll bug
> 它會導致 Selector?空輪詢,最終導致 CPU 100%。官方聲稱在 JDK 1.6?版本的 update18?修復了該問題,但是直到 JDK 1.7?版本該問題仍舊存在,只不過該 BUG?發(fā)生概率降低了一些而已,它并沒有得到根本性解決。?
什么是 TCP 粘包/拆包
> 1、要發(fā)送的數據大于 TCP 發(fā)送緩沖區(qū)剩余空間大小,將會發(fā)生拆包。?
> 2、待發(fā)送數據大于 MSS(最大報文長度),TCP 在傳輸前將進行拆包。?
> 3、要發(fā)送的數據小于 TCP?發(fā)送緩沖區(qū)的大小,TCP?將多次寫入緩沖區(qū)的數據一次發(fā)送出去,將會發(fā)生粘包。?
> 4、接收數據端的應用層沒有及時讀取接收緩沖區(qū)中的數據,將發(fā)生粘包。?
TCP 粘包/拆包的解決辦法
> 1、發(fā)送端給每個數據包添加包首部,首部中應該至少包含數據包的長度,這樣接收端在接收到數據后,通過讀取包首部的長度字段,便知道每一個數據包的實際長度了。?
> 2、發(fā)送端將每個數據包封裝為固定長度(不夠的可以通過補 0?填充),這樣接收端每次從接收緩沖區(qū)中讀取固定長度的數據就自然而然的把每個數據包拆分開來。?
> 3、可以在數據包之間設置邊界,如添加特殊符號,這樣,接收端通過這個邊界就可以將不同的數據包拆分開。?
Netty 線程模型
> 首先,Netty?使用 EventLoop?來處理連接上的讀寫事件,而一個連接上的所有請求都保證在一個 EventLoop?中被處理,一個 EventLoop?中只有一個 Thread,所以也就實現了一個連接上的所有事件只會在一個線程中被執(zhí)行。一個 EventLoopGroup?包含多個 EventLoop,可以把一個 EventLoop?當做是 Reactor?線程模型中的一個線程,而一個 EventLoopGroup?類似于一個 ExecutorService?
說說 Netty 的零拷貝
> “零拷貝”是指計算機操作的過程中,CPU?不需要為數據在內存之間的拷貝消耗資源。而它通常是指計算機在網絡上發(fā)送文件時,不需要將文件內容拷貝到用戶空間(User Space)而直接在內核空間(Kernel Space)中傳輸到網絡的方式。?
Netty 內部執(zhí)行流程
> 1. Netty?的接收和發(fā)送 ByteBuffer?采用 DIRECT BUFFERS,使用堆外直接內存進行Socket?讀寫,不需要進行字節(jié)緩沖區(qū)的二次拷貝。如果使用傳統(tǒng)的堆內存(HEAP BUFFERS)進行 Socket?讀寫,JVM?會將堆內存 Buffer?拷貝一份到直接內存中,然后才寫入Socket?中。相比于堆外直接內存,消息在發(fā)送過程中多了一次緩沖區(qū)的內存拷貝。?
需要白嫖java學習資料包括《JVM、Netty、Mysql、Mybatis、Redis、Dubbo、Nginx、設計模式》等10G資料禮包、可以看我主頁或私信博主都行
打卡更新Java文章??23?/ 100天
大家可以點贊、收藏、關注、評論我啦 、下面的投票也可以積極互動起來喲
總結
以上是生活随笔為你收集整理的百度-Java中级面试题分享-的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CSDN】-官方插件推荐懒人必备神器
- 下一篇: 基于Java学院网页的搜索引擎设计和实现