首頁 > 軟體

Java經典面試題最全彙總208道(三)

2023-01-18 14:01:24

前言 

短時間提升自己最快的手段就是背面試題,最近總結了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 寫出執行緒安全的單例模式

  1. 保證程式只有一個物件的範例,叫做單例模式;
  2. 內部類的方式實現單例模式,是執行緒安全的;
  3. 雙重驗證方式實現單例模式也是執行緒安全的;

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)?它是作用於物件層次還是類層次?

  1. 在Java IO中運用了裝飾器模式,inputStream作為抽象類,其下有幾個實現類,表示從不同的資料來源輸入:
  2. byteArrayInputStreamfileInputStreamStringBufferInputStreamPipedInputStream,從管道產生輸入;
  3. SequenceInputStream,可將其他流收集合併到一個流內;
  4. FilterInputStream作為裝飾器在JDK中是一個普通類,其下面有多個具體裝飾器比如BufferedInputStream、DataInputStream等。
  5. 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編譯時檢查的優點。

  1. @Configuration,表示這個類是設定類;
  2. @ComponentScan,相當於xml的<context:componentScan basepackage=>;
  3. @Bean,相當於xml的<bean id="student" class="com.guor.entity">;
  4. @EnableWebMvc,相當於xml的<mvc:annotation-driven>;
  5. @ImportResource,相當於xml的<import resource="application-context-cache.xml">;
  6. @PropertySource,用於讀取properties組態檔;
  7. @Profile,一般用於多環境設定,啟用時可用
  8. @ActiveProfile("dev")註解;

120、什麼是 ORM 框架?

ORM(Object-relational mapping),物件關係對映。

是為了解決物件導向與關係型資料庫存在的不匹配問題。

ORM框架的優點:

  1. 開發效率更高
  2. 資料存取更抽象、
  3. 輕便支援物件導向封裝

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 的生命週期?

  1. 通過構造器或工廠方法建立bean範例;
  2. 為bean的屬性賦值;
  3. 呼叫bean的初始化方法;
  4. 使用bean;
  5. 當容器關閉時,呼叫bean的銷燬方法;

123、Spring Bean 的作用域之間有什麼區別?

Spring容器中的bean可以分為5個範圍:

  1. singleton:這種bean範圍是預設的,這種範圍確保不管接受多少請求,每個容器中只喲一個bean的範例,單例模式;
  2. prototype:為每一個bean提供一個範例;
  3. request:在請求bean範圍內為每一個來自使用者端的網路請求建立一個範例,在請求完畢後,bean會失效並被垃圾回收器回收;
  4. session:為每個session建立一個範例,session過期後,bean會隨之消失;
  5. 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面試題內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com