Java經典面試題Spring是什麼 Spring框架入門詳解

2020-12-06 很神很奇很神奇

SpringLOGO

Spring是什麼,談談你對Spring的理解。這是初級開發人員必然被問道的問題,如果你不懂Spring你就無法從事這一行業,此處僅限技術人員,公司的繼承人等其他個例不受此限制。那麼Spring是什麼呢,Spring遵循分層的結構思想什麼什麼實現了高內聚低耦合巴拉巴拉一大堆,咬文嚼字不是我的強項,直接開幹,讓你們看看Spring到底是什麼東西。

通過maven下載好Spring的jar包

我們在src下/main/resources下創建配置文件applicationContext.xml 並為其配置xsd約束

把上面這一對約束複製到applicationContext.xml 中然後ctrls+s保存,Spring框架到目前為止已經搭建完畢。配置文件中的根標籤是beans,所以配置一定要寫到beans裡面。到目前為止Sping框架就搭建完畢了。創建下面一個pojo看看spring都有哪些功能

Sping有一個功能就是幫我們創建pojo對象實例,下面我麼需要在applicationContext.xml中將pojo配置為bean,註冊到spring容器中。

bean的name可以隨便取,一會我們會用到,class就是pojo的完整類名。下面請看java代碼

我們通過ClassPathXmlApplicationContext類傳入applicationContext.xml配置文件的相對路徑,創建出spring的容器對象ApplicationContext,在通過容器對象中的方法獲取到Spring容器為我們創建的user對象,其實Spring兩個容器,除了ApplicationContext外還有一個BeanFactory ,那麼他們有什麼區別呢?BeanFactory :是在getBean的時候才會生成類的實例. applicationContext :在加載applicationContext.xml(容器啟動)時候就會創建. BeanFactory 是一種懶加載的方式,那麼當訪問的bean過多的時候伺服器壓力就變大了,所以beanFactory實際上是一種淘汰了的容器,而applicationContext更類似於一種緩存機制,所以它受眾更高,下面看一下列印結果

可以看到User的toString方法已經打出,補充一下以上代碼我並沒有運行在java的main線程裡面,而是使用的junit單元測試。我們在main方法外部隨意創建一個public的方法,在上部使用@Test註解即可運行,這樣能夠幫我們節省在main方法內通過對象調用方法的時間。

以上的就是Spring被外行廣為流傳的,傳說中的IOC的使用,什麼是IOC中文意思就是控制反轉,什麼意思?我們平時創建對象需要自己手動創建,現在對象都是通過spring容器ApplicationContext創建,這就是所謂的IOC控制反轉,如果有了解工廠設計模式的朋友會更容易理解,ApplicationContext此處就相當於一個工廠類。我之前講解MyBatis框架的SqlSession就是由SqlSesionFactory創建的。

接下來我們看一下spring另一個特性,DI依賴注入是什麼。上面Java代碼中的username,userage都是由我手動設置的,但是這樣實在太過於麻煩,於是Spring提供了為對象屬性注入的功能。下面回到剛才xml中的userBean部分

創建property字標籤,name為pojo中需要注入的變量名,value就是需要注入的值,

結果顯示已經注入成功了。那麼spring是否能夠完成我們自定義java對象的注入呢?

新建一個pojo類User2並在User中作為變量引入,

xml中新增一個bean user2,將User2對象交給spring創建,在User的Bean配置user2的引用,property的name還是變量名,這裡的value要換成ref,ref為要引用的對象的bean的name,下面我們看執行結果

它的原理是spring讀到xml中的值調用pojo內部的set方法完成注入的m所以這種方式必須要有set方法。除此之外我們還可以通過構造方法在創建對象的時候為屬性賦值,在xml中使用<constructor-arg></constructor-arg>標籤來實現,也很簡單照葫蘆畫瓢參照上面的配就行。

注意構造函數有幾個參數這裡就要傳入幾個參數,如果你只創建了一個三個參數的構造方法,那你傳2個參數就報錯,沒傳參也報錯,所以必須創建所有參數的構造方法才能讓程序穩定運行,這種注入方式讓人很有負擔。除了構造外,spring還支持p名稱空間注入和spel表達式注入,spel基於set方法和構造方法注入的,所以我們通過圖中的注入方式足矣,也是主流的注入方式。p和spel注入在這裡就不演示了,以上就是spring的DI依賴注入了,下面我們看看如給集合對象注入,

還是先創建一個pojo,然後我們在xml中為集合注入值

如圖所示,如果沒有指定泛型,那麼可以用value傳值,也可以用ref傳對象,可以不指定集合元素的類型,還是比較簡單,下面看看輸出結果

IOC需要DI的支持為什麼呢?因為沒有DI的注入Spring創造出的對象都是空值是無法使用的,所以說IOC和DI多數是同時出現人們眼前的。 下面補充一下Bean元素的屬性

scope是範圍的意思,在絕地求生中scope意為瞄準鏡,如果你的隊友是個老外你就和他說 i want this 4times scope他就明白了。在bean中scope表示bean對象的作用域,有兩個選項singlton,和prototype。什麼意思呢,singlton時spring只會創建單例對象,就是你反覆從容器中取到堆中的同一對象,而prototype則會創建多個對象。

那麼bean的生命周期是什麼呢,我認為通常生命周期這四個字只出現在web層面,所以這裡應該是配置controller的,看它的兩個屬性nit-method="init" 和destroy-method="destory",init是初始化的意思,裡面寫的是pojo的方法名,該方法一定是public的,而destory是銷毀方法,同init一樣用法,那麼他們分別是什麼時候執行的呢?如果使用applicationContext容易,那麼項目啟動時就會執行init方法,銷毀方法想要執行,需要是單例創建的Bean而且在工廠關閉的時候,Bean才會被銷毀. 什麼時候工廠開啟關閉呢?web項目中隨著中間件tommcat啟動,那麼bean的init就會被執行,關閉tommcat時 destory方法就會執行。

最後給大家看一道java面試題,問圖下輸出結果

有的人一看,main方法裡是空的,怎麼輸出啊?原來啊,在我們執行main方法之前,Jvm的classLoader需要將這個類加載到內存,首先加載的就是被static修飾的變量,也就是全局變量。這裡先聲明一個List 集合,然後在堆中創建一個ArrayList的子類對象,大家看這個對象的創建方法是不是與我們平時創建對象的方式是不是不太一樣呢?這個叫做匿名內部類,匿名內部類被創建時會執行它的方法,因為它的匿名內部類,所以和我們平時通過對象調用方法不太一樣,這裡沒有顯示調用它的對象名,但是方法還是被執行了。先對集合添加一個子串,然後列印集合中的內容,那麼列印出來的是什麼呢?結果是null,為什麼呢?因為在內部類的方法執行完成之前,還沒有結束對象的創建,所以聲明NAMES的引用並沒有與堆中任一對象進行連接,此處列印的相當於List<String> NAMES;只完成了前半段語句,所以列印出來的是空的,如果等內部類中方法都結束時,在main中重新列印NAMES的內容才可以看到集合中的元素。這道題主要考察的是Java實例化一個對象在堆棧中的過程。

以上就是今天的內容了,Spring中有著非常多的設計模式的影子,並不想SpringMVC 或MyBatis中有比較深的東西,所以我們只需要會使用spring框架就夠了。

相關焦點

  • Spring Boot 2.4 第一個示例程序書寫代碼
    為了完成我們的第一個 Spring Boot 示例程序,我們需要向已經創建的項目框架中創建一個 Java 文件。在默認情況下,Maven 會編譯 src/main/java 目錄中的原始碼(這個是與 Maven 使用的約定有關的,這個目錄結構可以修改,但是不建議修改,因為絕大部分人都會遵守這個約定)。根據 Maven 的原始碼約定,你需要按照下面的目錄路徑和文件名創建一個 Example.java 文件,完整的路徑如下: src/main/java/Example.java 。
  • Java面試高頻考點:手寫Spring IOC實現機制
    目前大多數的Java軟體開發都是基於Spring框架,而Spring最為核心的概念就是IOC,也就是控制反轉,何謂「控制反轉」,一種直白的解釋方式就是「原來需要什麼東西都要自己去拿,現在需要什麼東西都是別人送過來」。
  • 面試官問spring mvc底層實現流程,該怎麼說?
    引言今年各個小夥伴在面試的時候,很大機率都會被問到這個問題,所以我們簡單描述一下當被問到時如何應對。流程說明通常面試都是先整體到局部。主要組件說明首先,我們得說出每個組件是做什麼的,當然要每個單詞讀出來最好。DispatcherServlet:spring mvc的入口,整個框架運行就是在這個servlet中完成。
  • SSM框架-SpringMVC詳解
    springmvc概述Springmvc是spring框架的一個模塊,spring和springmvc無需中間整合層整合。Springmvc是一個基於mvc的web框架表現層的三大任務:URL到controller的映射http請求參數綁定http響應的生成和輸出MVC設計模式
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful下路徑可能會匹配執行邏輯錯誤問題 增加配置項 駝峰轉換配置 spring.rocket-api.map-underscore-to-camel-case
  • 基於OSGi和Spring開發Web應用
    Spring 是一個著名的 輕量級 J2EE 開發框架,其特點是面向接口編程和非侵入式的依賴注入。將 OSGi 和 Spring 結合能充分發揮二者各自的特長,更好地滿足企業級應用開發的需求。Spring 開發組織在 2008 年發布了將 OSGi 和 Spring 結合的***個版本:Spring-DM。
  • SpringCloud微服務架構篇7:Config配置資源庫及加解密
    01配置資源庫1、配置資源規則詳解在加載Environment相應資源時參數變化成了以下變量:{application}:對應客戶端配置中的spring.application.name。{profile}:對應客戶端配置中的spring.profiles.action。
  • 「spring water」是指泉水,那「spring back」是指什麼呢?
    例句:It's staying light until after 6:00 PM now,and I'm beginning to feel a little bit of spring fever.現在下午六點以後天還亮著,我開始覺得有點坐不住了。2、spring back這是什麼意思呢?
  • 基於Spring Boot + MVC 之控制器Controller實現
    寫在前面,首先我們要有一個Spring Boot的項目工程,查看 通過Idea創建Spring Boot java項目,先建立一個Spring Boot的項目工程,以下內容將在之前的demo基礎上,實現通過url向後臺請求一個學生名稱。
  • Springmvc框架對json的支持 Java程式設計師必看
    json是一種前後端分離思想所使用的存儲數據的格式,然而使用Springmvc這個框架在對前臺參數處理時會遇到很多坑,下面我們就模擬一下前臺發送json數據看springmvc能否成功接收。解決了發送json的問題後,又遇到一個bug,發送的json字符串返回的確實一個http415錯誤代碼,大概是說後端接收的參數類型不正確的意思,下面請看java代碼。
  • StepChain 0.0.7 發布,Java 通用業務處理框架
    stepchain 通用業務流程流水線處理框架。 類似於Commons Chain和Commons Pipeline這樣的Java Pipeline Step Chain用於組織複雜處理流程執行的流行技術。
  • Spring Boot 2.2.0 發布,性能提升、支持 Java 13
    Spring Boot 2.2.0 正式發布了,可從 repo.spring.io 或是 Maven Central 獲取。
  • 14個編寫Spring MVC控制器的實用小技巧
    編寫Spring MVC控制器的最佳技巧本文介紹了編寫Spring MVC框架的控制器(controller)的基礎技巧和最佳操作。在Spring MVC框架中,編寫控制器類通常是為了處理用戶提出的請求。
  • 如何使用SpringCloud進行灰度發布
    在其上可以進行A/B testing,即讓一部分用戶繼續用產品特性A,一部分用戶開始用產品特性B,如果用戶對B沒有什麼反對意見,那麼逐步擴大範圍,把所有用戶都遷移到B上面來。灰度發布可以保證整體系統的穩定,在初始灰度的時候就可以發現、調整問題,以保證其影響度。
  • Spring 的生命周期
    InitializingBean,它會第二次回調你的afterPropertiesSet方法,對bean做進一步設置,bean的二次加工完成之後,你的bean就已經建立完成了,也就是說他會根據你的bean的scope,如果是一個單列的bean,默認是單例的,它就會走下去,如果是多實例,你的bean的scope是prototype,多實例的話,就會移交給你去管理它的後續的生命周期,單實例的話,生命周期還是由spring
  • Spring Boot Admin快速打造監控平臺
    Spring Boot Admin 開源地址:https://github.com/codecentric/spring-boot-adminSpring Boot Admin分為server和client,使用非常方便,server端可查看各個微服務的狀態,client端將微服務註冊到server端。
  • 實用英語:廚房詞霸(Dialog for Spring Onions)
    vegetable chef: The spring onions.   commis cook : What shall I do first (2) ?   vegetable chef: Wash the spring onions.   commis cook : And then?
  • Spring City是指泉城還是春城?
    生活日報濟南12月3日訊 (記者邱建國)「我是濟南人,咱濟南以泉水著稱,可『泉城』用英文應該怎麼說還真拿不準,我上學的時候學過英語,知道泉水是spring,按理說泉城似乎應該是Spring City,可spring還有春天的意思,Spring City好像更容易讓人想到春城昆明,遇到外國人想跟他們說明白還真費腦筋。」
  • Spring中這些能升華代碼的技巧,可能會讓你愛不釋手
    有些讀者私信我說希望後面多分享spring方面的文章,這樣能夠在實際工作中派上用場。正好我對spring源碼有過一定的研究,並結合我這幾年實際的工作經驗,把spring中我認為不錯的知識點總結一下,希望對您有所幫助。