更新時間:2020-02-27 10:05:40 來源:動力節點 瀏覽2698次
請介紹一下Spring和AOP和IOC?
答:AOP面向方面編程基于IoC,是對OOP的補充。AOP利用一種稱為“橫切”的技術,剖解開封裝的對象內部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其名為“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,比如日志記錄,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。
實現AOP的技術,主要分為兩大類:一是采用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。
Spring實現AOP:JDK動態代理和CGLIB代理JDK動態代理:其代理對象必須是某個接口的實現,它是通過在運行期間創建一個接口的實現類來完成對目標對象的代理;其核心的兩個類是InvocationHandler和Proxy。CGLIB代理:實現原理類似于JDK動態代理,只是它在運行期間生成的代理對象是針對目標類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的java字節碼編輯類庫)操作字節碼實現的,性能比JDK強;需要引入包asm.jar和cglib.jar。使用AspectJ注入式切面和@AspectJ注解驅動的切面實際上底層也是通過動態代理實現的。
IoC(InversionofControl)是指容器控制程序對象之間的關系,而不是傳統實現中,由程序代碼直接操控。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。對于Spring而言,就是由Spring來控制對象的生命周期和對象之間的關系;IoC還有另外一個名字——“依賴注入(DependencyInjection)”。
依賴注入的思想是通過反射機制實現的,在實例化一個類時,它通過反射調用類中set方法將事先保存在HashMap中的類屬性注入到類中。總而言之,在傳統的對象創建方式中,通常由調用者來創建被調用者的實例,而在Spring中創建被調用者的工作由Spring來完成,然后注入調用者,即所謂的依賴注入or控制反轉。
MyBatis中的#和$的區別
答:#將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。$將傳入的數據直接顯示生成在sql中。#方式能夠很大程度防止sql注入。$方式無法防止Sql注入。$方式一般用于傳入數據庫對象,例如傳入表名。一般能用#的就別用$。
問:wait()notify()notifyAll()的區別
答:wait()方法將線程加入一個FIFO集合,notify()將等待中的線程隨機喚醒,notifyAll()將等待中的所有線程。
BIO和NIO的區別
答:JavaNIO和IO之間的第一個重要區別是IO是面向流的,其中NIO是面向緩沖區的。
面向流的JavaIO意味著您可以從流中一次讀取一個或多個字節。你對讀取的字節做什么取決于你。JavaNIO的面向緩沖區的方法略有不同。數據被讀入緩沖區,稍后處理該緩沖區。JavaIO的各種流都是blocking的。這意味著,當線程調用read()或write()時,該線程將被阻塞,直到有一些數據要讀取,或者數據被完全寫入,在此期間,該線程無法執行任何其他操作。JavaNIO的非阻塞模式允許線程請求從通道讀取數據,并且只獲取當前可用的內容,或者根本沒有數據,如果當前沒有數據可用。線程可以繼續使用其他內容,而不是在數據可供讀取之前保持阻塞狀態。
樂觀鎖和悲觀鎖的區別
答:悲觀鎖(PessimisticLock),顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖(OptimisticLock),顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似于write_condition機制的其實都是提供的樂觀鎖。
兩種鎖各有優缺點,不可認為一種好于另一種,像樂觀鎖適用于寫比較少的情況下,即沖突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生沖突,上層應用會不斷的進行retry,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適。
MyISAM和Innodb的區別
答:MyISAM不支持外鍵,Innodb支持,MyISAM不支持事務。對數據信息的存儲處理方式不同,如果存儲引擎是MyISAM的,則創建一張表對應三個文件,如果是Innodb則只有一個文件。對于MyISAM數據庫,需要定時清理,
SpringBoot有哪幾種讀取配置的方式?
答:SpringBoot可以通過@PropertySource,@Value,@Environment,@ConfigurationProperties來綁定變量。
TCP三次握手和四次揮手
答:第一次握手:Client將標志位SYN置為1,隨機產生一個值seq=J,并將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
第二次握手:Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,并將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
第三次握手:Client收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,并將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨后Client與Server之間可以開始傳輸數據了。
第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。
第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。
JAVA的異常處理機制
答:JAVA的異常處理機制:如果某個方法不能按照正常的途徑完成任務,就可以通過另一種路徑退出方法。在這種情況下會拋出一個封裝了錯誤信息的對象。此時,這個方法會立刻退出同時不返回任何值。另外,調用這個方法的其他代碼也無法繼續執行,異常處理機制會將代碼執行交給異常處理器。
以上就是動力節點Java培訓機構小編介紹的“常見Java中高級面試題大全整理”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習