Java經典面試題最全匯總208道(三)
前言
短時間提升自己最快的手段就是背面試題,最近總結瞭Java常用的面試題,分享給大傢,希望大傢都能圓夢大廠,加油,我命由我不由天。
websocket應用的是哪個協議
WebSocket是一個允許Web應用程序(通常指瀏覽器)與服務器進行雙向通信的協議。
HTML5的WebSocket API主要是為瀏覽器端提供瞭一個基於TCP協議實現全雙工通信的方法。
WebSocket優勢: 瀏覽器和服務器隻需要要做一個握手的動作,在建立連接之後,雙方可以在任意時刻,相互推送信息。
同時,服務器與客戶端之間交換的頭信息很小。
106、說一下 tcp 粘包是怎麼產生的?
發送方需要等緩沖區滿才能發送出去,造成粘包;
接收方不及時接收緩沖區的包,造成粘包;
107、請列舉出在 JDK 中幾個常用的設計模式?
1、單例模式
作用:保證類隻有一個實例。
JDK中體現:Runtime類。
2、靜態工廠模式
作用:代替構造函數創建對象,方法名比構造函數清晰。
JDK中體現:Integer.valueOf、Class.forName
3、抽象工廠
作用:創建某一種類的對象。
JDK中體現:Java.sql包。
4、原型模式
clone();
原型模式的本質是拷貝原型來創建新的對象,拷貝是比new更快的創建對象的方法,當需要大批量創建新對象而且都是同一個類的對象的時候考慮使用原型模式。
一般的克隆隻是淺拷貝(對象的hash值不一樣,但是對象裡面的成員變量的hash值是一樣的)。
有些場景需要深拷貝,這時我們就要重寫clone方法,以ArrayList為例:
5、適配器模式
作用:使不兼容的接口相容。
JDK中體現:InputStream、OutputStream。
6、裝飾器模式
作用:為類添加新的功能,防止類繼承帶來的類爆炸。
JDK中體現:io類、Collections、List。
7、外觀模式
作用:封裝一組交互類,一直對外提供接口。
JDK中體現:logging包。
8、享元模式
作用:共享對象、節省內存。
JDK中體現:Integer.valueOf、String常量池。
9、代理模式
作用:
(1)透明調用被代理對象,無須知道復雜實現細節;
(2)增加被代理類的功能;
JDK中體現:動態代理。
10、迭代器模式
作用:將集合的迭代和集合本身分離。
JDK中體現:Iterator
11、命令模式
作用:封裝操作,使接口一致。
JDK中體現:Runable、Callable、ThreadPoolExecutor。
108、什麼是設計模式?你是否在你的代碼裡面使用過任何設計模式?
1、什麼是設計模式?
設計模式是解決軟件開發某些特定問題而提出的一些解決方案,也可以理解為解決問題的一些固定思路。
通過設計模式可以幫助我們增強代碼的可復用性、可擴展性、靈活性。
我們使用設計模式的最終目的是實現代碼的高內聚、低耦合。
2、設計模式的七大原則
單一職責原則接口隔離原則依賴倒轉原則裡式替換原則開閉原則迪米特法則合成復用原則
3、你是否在你的代碼裡面使用過任何設計模式?
(1)單例模式
JDK種的runtime,Spring種的singeton。
(2)簡單工廠模式
Spring的BeanFactory,根據傳入一個唯一標識來獲得bean對象。
(3)原型模式
clone()
(4)代理模式
Spring的AOP中,Spring實現AOP功能的原理就是代理模式,①JDK動態代理。②CGLIB動態代理,使用Advice(通知)對類進行方法級別的切面增強。
(5)裝飾器模式
為類添加新的功能,防止類爆炸;
IO流、數據源包裝,Spring中用到的裝飾器模式表現在Wrapper。
109、Java 中什麼叫單例設計模式?請用 Java 寫出線程安全的單例模式
- 保證程序隻有一個對象的實例,叫做單例模式;
- 內部類的方式實現單例模式,是線程安全的;
- 雙重驗證方式實現單例模式也是線程安全的;
110、在 Java 中,什麼叫觀察者設計模式(observer design pattern)?
1、觀察者模式是一種一對多的依賴關系,讓多個觀察者同時監聽某一主題對象。當這個主題對象發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
2、Java提供的對觀察者模式的支持
在Java語言的java.util庫裡面,提供瞭一個Observable類以及一個Observer接口,構成Java語言對觀察者模式的支持。
(1)Observer接口
這個接口隻定義瞭一個方法,即update()方法,當被觀察者對象的狀態發生變化時,被觀察者對象的notifyObservers()方法就會調用這一方法。
public interface Observer { void update(Observable o, Object arg); }
(2)Observable類
被觀察者類都是java.util.Observable類的子類。
java.util.Observable提供公開的方法支持觀察者對象,這些方法中有兩個對Observable的子類非常重要:一個是setChanged(),另一個是notifyObservers()。
第一方法setChanged()被調用之後會設置一個內部標記變量,代表被觀察者對象的狀態發生瞭變化。
第二個是notifyObservers(),這個方法被調用時,會調用所有登記過的觀察者對象的update()方法,使這些觀察者對象可以更新自己。
111、使用工廠模式最主要的好處是什麼?在哪裡使用?
1、工廠模式好處
良好的封裝性、代碼結構清晰;擴展性好,如果想增加一個產品,隻需擴展一個工廠類即可;典型的解耦框架;
2、在哪裡使用?
需要生成對象的地方;不同數據庫的訪問;
112、請解釋自動裝配模式的區別?
有五種自動裝配的方式,可以用來指導 Spring 容器用自動裝配方式來進行依賴註入。
1、no
默認的方式是不進行自動裝配,通過顯式設置 ref 屬性來進行裝配。
2、byName
通過參數名 自動裝配,Spring 容器在配置文件中發現 bean的 autowire 屬性被設置成 byname,之後容器試圖匹配、裝配和該 bean 的屬性具有相同名字的 bean。
3、byType:
通過參數類型自動裝配,Spring 容器在配置文件中發現 bean的 autowire 屬性被設置成 byType,之後容器試圖匹配、裝配和該 bean 的屬性具有相同類型的 bean。
如果有多個 bean 符合條件,則拋出錯誤。
4、constructor
這個方式類似於 byType, 但是要提供給構造器參數,如果沒有確定的帶參數的構造器參數類型,將會拋出異常。
5、autodetect
首先嘗試使用 constructor 來自動裝配,如果無法工作,則使用 byType 方式。
113、舉一個用 Java 實現的裝飾模式(decorator design pattern)?它是作用於對象層次還是類層次?
- 在Java IO中運用瞭裝飾器模式,inputStream作為抽象類,其下有幾個實現類,表示從不同的數據源輸入:
- byteArrayInputStreamfileInputStreamStringBufferInputStreamPipedInputStream,從管道產生輸入;
- SequenceInputStream,可將其他流收集合並到一個流內;
- FilterInputStream作為裝飾器在JDK中是一個普通類,其下面有多個具體裝飾器比如BufferedInputStream、DataInputStream等。
- FilterInputStream內部封裝瞭基礎構件:
protected volatile InputStream in;
而BufferedInputStream在調用其read()讀取數據時會委托基礎構件來進行更底層的操作,而它自己所起的裝飾作用就是緩沖,在源碼中可以很清楚的看到這一切。
114、什麼是 Spring 框架?Spring 框架有哪些主要模塊?
Spring是一個控制反轉和面向切面的容器框架。
Spring有七大功能模塊:
1、Core
Core模塊是Spring的核心類庫,Core實現瞭IOC功能。
2、AOP
Apring AOP模塊是Spring的AOP庫,提供瞭AOP(攔截器)機制,並提供常見的攔截器,供用戶自定義和配置。
3、orm
提供對常用ORM框架的管理和支持,hibernate、mybatis等。
4、Dao
Spring提供對JDBC的支持,對JDBC進行封裝。
5、Web
對Struts2的支持。
6、Context
Context模塊提供框架式的Bean的訪問方式,其它程序可以通過Context訪問Spring的Bean資源,相當於資源註入。
7、MVC
MVC模塊為spring提供瞭一套輕量級的MVC實現,即Spring MVC。
115、使用 Spring 框架能帶來哪些好處?
1、輕量級框架、容器
Spring是一個容器,管理對象的生命周期和配置。基於一個可配置原型prototype,你的bean可以使單利的,也可以每次需要時都生成一個新的實例。
2、控制反轉IOC
Spring通過控制反轉實現松耦合。
3、支持AOP
Spring提供對AOP的支持,它允許將一些通用任務,如安全、事務、日志等進行集中式處理,從而提高瞭程序的復用性。
4、輕量級框架
5、方便測試
Spring提供Junit4的支持,可以通過註解方便測試spring程序。
6、對Java中很多API進行瞭封裝
7、方便集成各種優秀框架
如Struts、hibernate、mybstis。
8、支持聲明式事務處理
隻需通過配置就可以完成對事務的管理,而無須手動編程。
116、Spring IOC、AOP舉例說明
1、IOC理論的背景
我們都知道,在采用面向對象方法設計的軟件系統中,它的底層實現都是由N個對象組成的,所有的對象通過彼此的合作,最終實現系統的業務邏輯。
如果我們打開機械式手表的後蓋,就會看到與上面類似的情形,各個齒輪分別帶動時針、分針和秒針順時針旋轉,從而在表盤上產生正確的時間。
圖1中描述的就是這樣的一個齒輪組,它擁有多個獨立的齒輪,這些齒輪相互嚙合在一起,協同工作,共同完成某項任務。我們可以看到,在這樣的齒輪組中,如果有一個齒輪出瞭問題,就可能會影響到整個齒輪組的正常運轉。
齒輪組中齒輪之間的嚙合關系,與軟件系統中對象之間的耦合關系非常相似。
對象之間的耦合關系是無法避免的,也是必要的,這是協同工作的基礎。現在,伴隨著工業級應用的規模越來越龐大,對象之間的依賴關系也越來越復雜,經常會出現對象之間的多重依賴性關系
因此,架構師和設計師對於系統的分析和設計,將面臨更大的挑戰。對象之間耦合度過高的系統,必然會出現牽一發而動全身的情形。
耦合關系不僅會出現在對象與對象之間,也會出現在軟件系統的各模塊之間,以及軟件系統和硬件系統之間。如何降低系統之間、模塊之間和對象之間的耦合度,是軟件工程永遠追求的目標之一。
為瞭解決對象之間的耦合度過高的問題,軟件專傢Michael Mattson提出瞭IOC理論,用來實現對象之間的“解耦”,目前這個理論已經被成功地應用到實踐當中,很多的J2EE項目均采用瞭IOC框架產品Spring。
2、什麼是控制反轉
IOC是Inversion of Control的縮寫,多數書籍翻譯成“控制反轉”,還有些書籍翻譯成為“控制反向”或者“控制倒置”。
1996年,Michael Mattson在一篇有關探討面向對象框架的文章中,首先提出瞭IOC 這個概念。
對於面向對象設計及編程的基本思想,前面我們已經講瞭很多瞭,不再贅述,簡單來說就是把復雜系統分解成相互合作的對象,這些對象類通過封裝以後,內部實現對外部是透明的,從而降低瞭解決問題的復雜度,而且可以靈活地被重用和擴展。
IOC理論提出的觀點大體是這樣的:借助於“第三方”實現具有依賴關系的對象之間的解耦,如下圖:
大傢看到瞭吧,由於引進瞭中間位置的“第三方”,也就是IOC容器,使得A、B、C、D這4個對象沒有瞭耦合關系,齒輪之間的傳動全部依靠“第三方”瞭,全部對象的控制權全部上繳給“第三方”IOC容器,所以,IOC容器成瞭整個系統的關鍵核心,它起到瞭一種類似“粘合劑”的作用,把系統中的所有對象粘合在一起發揮作用,如果沒有這個“粘合劑”,對象與對象之間會彼此失去聯系,這就是有人把IOC容器比喻成“粘合劑”的由來。
我們再來做個試驗:把上圖中間的IOC容器拿掉,然後再來看看這套系統(拿掉IoC容器後的系統):
我們現在看到的畫面,就是我們要實現整個系統所需要完成的全部內容。
這時候,A、B、C、D這4個對象之間已經沒有瞭耦合關系,彼此毫無聯系,這樣的話,當你在實現A的時候,根本無須再去考慮B、C和D瞭,對象之間的依賴關系已經降低到瞭最低程度。
所以,如果真能實現IOC容器,對於系統開發而言,這將是一件多麼美好的事情,參與開發的每一成員隻要實現自己的類就可以瞭,跟別人沒有任何關系!
我們再來看看,控制反轉(IOC)到底為什麼要起這麼個名字?我們來對比一下:
軟件系統在沒有引入IOC容器之前,如圖1所示,對象A依賴於對象B,那麼對象A在初始化或者運行到某一點的時候,自己必須主動去創建對象B或者使用已經創建的對象B。
無論是創建還是使用對象B,控制權都在自己手上。
軟件系統在引入IOC容器之後,這種情形就完全改變瞭,如圖3所示,由於IOC容器的加入,對象A與對象B之間失去瞭直接聯系
所以,當對象A運行到需要對象B的時候,IOC容器會主動創建一個對象B註入到對象A需要的地方。
通過前後的對比,我們不難看出來:對象A獲得依賴對象B的過程,由主動行為變為瞭被動行為,控制權顛倒過來瞭,這就是“控制反轉”這個名稱的由來。
3、IOC的別名:依賴註入(DI)
2004年,Martin Fowler探討瞭同一個問題,既然IOC是控制反轉,那麼到底是“哪些方面的控制被反轉瞭呢?”
經過詳細地分析和論證後,他得出瞭答案:“獲得依賴對象的過程被反轉瞭”。
控制被反轉之後,獲得依賴對象的過程由自身管理變為瞭由IOC容器主動註入。
於是,他給“控制反轉”取瞭一個更合適的名字叫做“依賴註入(Dependency Injection)”。
他的這個答案,實際上給出瞭實現IOC的方法:註入。
所謂依賴註入,就是由IOC容器在運行期間,動態地將某種依賴關系註入到對象之中。
所以,依賴註入(DI)和控制反轉(IOC)是從不同的角度的描述的同一件事情,就是指通過引入IOC容器,利用依賴關系註入的方式,實現對象之間的解耦。
我們舉一個生活中的例子,來幫助理解依賴註入的過程。
大傢對USB接口和USB設備應該都很熟悉吧,USB為我們使用電腦提供瞭很大的方便,現在有很多的外部設備都支持USB接口。
現在,我們利用電腦主機和USB接口來實現一個任務:從外部USB設備讀取一個文件。
電腦主機讀取文件的時候,它一點也不會關心USB接口上連接的是什麼外部設備,而且它確實也無須知道。
它的任務就是讀取USB接口,掛接的外部設備隻要符合USB接口標準即可。所以,如果我給電腦主機連接上一個U盤,那麼主機就從U盤上讀取文件;
如果我給電腦主機連接上一個外置硬盤,那麼電腦主機就從外置硬盤上讀取文件。
掛接外部設備的權力由我作主,即控制權歸我,至於USB接口掛接的是什麼設備,電腦主機是決定不瞭,它隻能被動的接受。
電腦主機需要外部設備的時候,根本不用它告訴我,我就會主動幫它掛上它想要的外部設備,你看我的 服務是多麼的到位。這就是我們生活中常見的一個依賴註入的例子。
在這個過程中,我就起到瞭IOC容器的作用。
通過這個例子,依賴註入的思路已經非常清楚:當電腦主機讀取文件的時候,我就把它所要依賴的外部設備,幫他掛接上。整個外部設備註入的過程和一個被依賴的對象在系統運行時被註入另外一個對象內部的過程完全一樣。
我們把依賴註入應用到軟件系統中,再來描述一下這個過程:
對象A依賴於對象B,當對象 A需要用到對象B的時候,IOC容器就會立即創建一個對象B送給對象A。
IOC容器就是一個對象制造工廠,你需要什麼,它會給你送去,你直接使用就行瞭,而再也不用去關心你所用的東西是如何制成的,也不用關心最後是怎麼被銷毀的,這一切全部由IOC容器包辦。
在傳統的實現中,由程序內部代碼來控制組件之間的關系。
我們經常使用new關鍵字來實現兩個組件之間關系的組合,這種實現方式會造成組件之間耦合。
IOC很好地解決瞭該問題,它將實現組件間關系從程序內部提到外部容器,也就是說由容器在運行期將組件間的某種依賴關系動態註入組件中。
4、IOC為我們帶來瞭什麼好處
我們還是從USB的例子說起,使用USB外部設備比使用內置硬盤,到底帶來什麼好處?
第一、USB設備作為電腦主機的外部設備,在插入主機之前,與電腦主機沒有任何的關系,隻有被我們連接在一起之後,兩者才發生聯系,具有相關性。
所以,無論兩者中的任何一方出現什麼的問題,都不會影響另一方的運行。
這種特性體現在軟件工程中,就是可維護性比較好,非常便於進行單元測試,便於調試程序和診斷故障。
代碼中的每一個Class都可以單獨測試,彼此之間互不影響,隻要保證自身的功能無誤即可,這就是組件之間低耦合或者無耦合帶來的好處。
第二、USB設備和電腦主機的之間無關性,還帶來瞭另外一個好處,生產USB設備的廠商和生產電腦主機的廠商完全可以是互不相幹的人,各幹各事,他們之間唯一需要遵守的就是USB接口標準。
這種特性體現在軟件開發過程中,好處可是太大瞭。
每個開發團隊的成員都隻需要關心實現自身的業務邏輯,完全不用去關心其它的人工作進展,因為你的任務跟別人沒有任何關系,你的任務可以單獨測試,你的任務也不用依賴於別人的組件,再也不用扯不清責任瞭。
所以,在一個大中型項目中,團隊成員分工明確、責任明晰,很容易將一個大的任務劃分為細小的任務,開發效率和產品質量必將得到大幅度的提高。
第三、同一個USB外部設備可以插接到任何支持USB的設備,可以插接到電腦主機,也可以插接到DV機,USB外部設備可以被反復利用。在軟件工程中,這種特性就是可復用性好,我們可以把具有普遍性的常用組件獨立出來,反復利用到項目中的其它部分,或者是其它項目,當然這也是面向對象的基本特征。
顯然,IOC不僅更好地貫徹瞭這個原則,提高瞭模塊的可復用性。符合接口標準的實現,都可以插接到支持此標準的模塊中。
第四、同USB外部設備一樣,模塊具有熱插拔特性。IOC生成對象的方式轉為外置方式,也就是把對象生成放在配置文件裡進行定義,這樣,當我們更換一個實現子類將會變得很簡單,隻要修改配置文件就可以瞭,完全具有熱插撥的特性。
以上幾點好處,難道還不足以打動我們,讓我們在項目開發過程中使用IOC框架嗎?
5、IOC容器的技術剖析
IOC中最基本的技術就是“反射(Reflection)”編程,目前.Net C#、Java和PHP5等語言均支持,其中PHP5的技術書籍中,有時候也被翻譯成“映射”。有關反射的概念和用法,大傢應該都很清楚,通俗來講就是根據給出的類名(字符串方式)來動態地生成對象。
這種編程方式可以讓對象在生成時才決定到底是哪一種對象。
反射的應用是很廣泛的,很多的成熟的框架,比如象Java中的Hibernate、Spring框架,.Net中 NHibernate、Spring.Net框架都是把“反射”做為最基本的技術手段。
反射技術其實很早就出現瞭,但一直被忽略,沒有被進一步的利用。
當時的反射編程方式相對於正常的對象生成方式要慢至少得10倍。
現在的反射技術經過改良優化,已經非常成熟,反射方式生成對象和通常對象生成方式,速度已經相差不大瞭,大約為1-2倍的差距。
我們可以把IOC容器的工作模式看做是工廠模式的升華,可以把IOC容器看作是一個工廠,這個工廠裡要生產的對象都在配置文件中給出定義,然後利用編程語言的的反射編程,根據配置文件中給出的類名生成相應的對象。
從實現來看,IOC是把以前在工廠方法裡寫死的對象生成代碼,改變為由配置文件來定義,也就是把工廠和對象生成這兩者獨立分隔開來,目的就是提高靈活性和可維護性。
6、IOC容器的一些產品
Sun ONE技術體系下的IOC容器有:輕量級的有Spring、Guice、Pico Container、Avalon、HiveMind;
重量級的有EJB;
不輕不重的有JBoss,Jdon等等。
Spring框架作為Java開發中SSH(Struts、Spring、Hibernate)三劍客之一,大中小項目中都有使用,非常成熟,應用廣泛,EJB在關鍵性的工業級項目中也被使用,比如某些電信業務。
Net技術體系下的IOC容器有:Spring.Net、Castle等等。
Spring.Net是從Java的Spring移植過來的IOC容器,Castle的IOC容器就是Windsor部分。
它們均是輕量級的框架,比較成熟,其中Spring.Net已經被逐漸應用於各種項目中。
7、使用IOC框架應該註意什麼
使用IOC框架產品能夠給我們的開發過程帶來很大的好處,但是也要充分認識引入IOC框架的缺點,做到心中有數,杜絕濫用框架。
(1)軟件系統中由於引入瞭第三方IOC容器,生成對象的步驟變得有些復雜,本來是兩者之間的事情,又憑空多出一道手續
所以,我們在剛開始使用IOC框架的時候,會感覺系統變得不太直觀。所以,引入瞭一個全新的框架,就會增加團隊成員學習和認識的培訓成本,並且在以後的運行維護中,還得讓新加入者具備同樣的知識體系。
(2)由於IOC容器生成對象是通過反射方式,在運行效率上有一定的損耗。如果你要追求運行效率的話,就必須對此進行權衡。
(3)、具體到IOC框架產品(比如:Spring)來講,需要進行大量的配制工作,比較繁瑣,對於一些小的項目而言,客觀上也可能加大一些工作成本。
(4)IOC框架產品本身的成熟度需要進行評估,如果引入一個不成熟的IOC框架產品,那麼會影響到整個項目,所以這也是一個隱性的風險。
我們大體可以得出這樣的結論:一些工作量不大的項目或者產品,不太適合使用IOC框架產品。另外,如果團隊成員的知識能力欠缺,對於IOC框架產品缺乏深入的理解,也不要貿然引入。
最後,特別強調運行效率的項目或者產品,也不太適合引入IOC框架產品,象WEB2.0網站就是這種情況。
117、什麼是控制反轉(IOC)?什麼是依賴註入?
借助Spring實現具有依賴關系的對象之間的解耦。
對象A運行需要對象B,由主動創建變為IOC容器註入,這便是控制反轉。
獲得依賴對象的過程被反轉瞭,獲取依賴對象的過程由自身創建變為由IOC容器註入,這便是依賴註入。
118、BeanFactory 和 ApplicationContext 有什麼區別?
1、BeanFactory是Spring的最底層接口,包含bean的定義,管理bean的加載,實例化,控制bean的生命周期,特點是每次獲取對象時才會創建對象。
ApplicationContext是BeanFactory的子接口,擁有BeanFactory的全部功能,並且擴展瞭很多高級特性,每次容器啟動時就會創建所有的對象。
- ApplicationContext的額外功能:繼承MessageSource,支持國際化;
- 統一的資源文件訪問方式;
- 提供在監聽器中註冊bean;
- 同時加載過個配置文件;
- 載入多個(有繼承關系)上下文,使得每個上下文都專註於一個特定的層次,比如應用的web層;
2、BeanFactory通常以編程的方式被創建,ApplicationContext可以以聲明的方式創建,如使用ContextLoader。
3、BeanFactory 和 ApplicationContext都支持BeanPostProcessor,BeanFactoryPostProcessor,但BeanFactory需要手動註冊,ApplicationContext則是自動註冊。
119、什麼是 JavaConfig?
JavaConfig是Spring3.0新增的概念,就是以註解的形式取代Spring中繁瑣的xml文件。
JavaConfig結合瞭xml的解耦和java編譯時檢查的優點。
- @Configuration,表示這個類是配置類;
- @ComponentScan,相當於xml的<context:componentScan basepackage=>;
- @Bean,相當於xml的<bean id="student" class="com.guor.entity">;
- @EnableWebMvc,相當於xml的<mvc:annotation-driven>;
- @ImportResource,相當於xml的<import resource="application-context-cache.xml">;
- @PropertySource,用於讀取properties配置文件;
- @Profile,一般用於多環境配置,激活時可用
- @ActiveProfile("dev")註解;
120、什麼是 ORM 框架?
ORM(Object-relational mapping),對象關系映射。
是為瞭解決面向對象與關系型數據庫存在的不匹配問題。
ORM框架的優點:
- 開發效率更高
- 數據訪問更抽象、
- 輕便支持面向對象封裝
121、Spring 有幾種配置方式?
1、xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="jackma" class="com.tyq.dto.User"> <property name="name" value="jackma" /> <property name="age" value="55" /> <property name="dog" ref="jm" /> </bean> <bean id="jm" class="com.tyq.dto.Dog"> <property name="name" value="jack" /> <property name="breed" value="金毛" /> <property name="age" value="2" /> </bean> </beans>
2、基於註解的方式
項目越來越大,基於xml配置太麻煩,Spring 2.x時代提供瞭聲明bean的註解。
(1)Bean的定義
@Component、@Controller、@Service、@Repository。
(2)Bean的註入
@Autowire
3、基於Java的方式
Spring 3.x以後,可以通過Java代碼裝配Bean。
@Configuration public class DemoConfig { @Bean public User zs(){ return new User(); } @Bean public Dog dog(){ return new Dog(); } @Bean //兩個狗 public Dog haqi(){ return new Dog(); } }
@Component("zs") public class User { private String name; private int age; private Dog dog; //get,set方法略 }
原來就是配置類啊,通過@Bean、@Component、getBean方式進行Bean的註冊和發現。
122、請解釋 Spring Bean 的生命周期?
- 通過構造器或工廠方法創建bean實例;
- 為bean的屬性賦值;
- 調用bean的初始化方法;
- 使用bean;
- 當容器關閉時,調用bean的銷毀方法;
123、Spring Bean 的作用域之間有什麼區別?
Spring容器中的bean可以分為5個范圍:
- singleton:這種bean范圍是默認的,這種范圍確保不管接受多少請求,每個容器中隻喲一個bean的實例,單例模式;
- prototype:為每一個bean提供一個實例;
- request:在請求bean范圍內為每一個來自客戶端的網絡請求創建一個實例,在請求完畢後,bean會失效並被垃圾回收器回收;
- session:為每個session創建一個實例,session過期後,bean會隨之消失;
- global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet公用全局的存儲變量的話,那麼全局變量需要存儲在global-session中。
124、如何在 Spring Boot 中禁用 Actuator 端點安全性?
默認情況下,所有敏感的HTTP端點都是安全的,隻有具有Actuator角色的用戶才能訪問它們。
安全性是使用標準的HTTPServletRequest.isUserInRole方法實施的。
我們可以使用management.security.enable = false來禁用安全性。
隻有在執行機構端點在防火墻後訪問時,才建議禁用安全性。
125、什麼是 Spring inner beans?
在Spring框架中,無論何時bean被使用時,當僅被調用一個屬性。
可以將這個bean聲明為內部bean。
內部bean可以用setter註入“屬性”和構造方法註入“構造參數”的方式來實現。比如,在我們的應用程序中,一個Customer類引用瞭一個Person類,我們要做的是創建一個Person實例,然後再Customer內部使用。
package com; public class Customer { private Person person; } class Person{ private int id; private String name; private int age; }
<bean id="CustomerBean" class="com.Customer"> <property name="person"> <bean class="com.person"> <property name="id" value=1 /> <property name="name" value="素小暖" /> <property name="age" value=18 /> </bean> </property> </bean>
到此這篇關於Java經典面試題最全匯總208道(三)的文章就介紹到這瞭,更多相關Java面試題內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring概述和快速構建的方式
- Java Spring框架創建項目與Bean的存儲與讀取詳解
- Spring超詳細講解註解開發
- Spring Xml裝配Bean的思路詳解
- Spring IOC創建對象的兩種方式