
對于Java的小伙伴來說,Spring是面試的必問環節,我研究Spring多年,甚至我的網名都叫SpringMeng,
最新整理的資料結構和演算法的值得收藏:
??肝完了,一天掌握資料結構和演算法面試題,吊打面試官,建議收藏??
小孟肝了一周,繼續給大家整理Spring的系列,幫你offer收到手疼,先看下Spring的家族圖:

廢話不多話,直接上干貨,

目錄
Q1 什 么 是 spring?
Q2:使 用 Spring 框 架 的 好 處 是 什 么 ?
Q3:使 用 Spring 缺點是什么?
Q4:IoC 是什么?
Q5:IOC的優點是什么
Q6:IoC 容器初始化程序?
Q7:依賴注?的實作方法有哪些?
Q8:依賴注?的相關注解?
Q9:依賴注入的程序?
Q10:Bean 的生命周期?
Q11:Bean 的作?范圍?
Q12:如何通過 XML ?式創建 Bean?
Q13:Spring 有幾種配置方式?
Q14:如何用基于 XML 配置的方式配置 Spring?
Q15:如何通過注解創建 Bean?
Q17:如何通過注解配置?件?
Q18:BeanFactory、FactoryBean 和ApplicationContext 的區別?
Q19. 解 釋 Spring 框 架 中 bean 的 生 命 周 期 ,
Q20、怎樣開啟注解裝配 ?
Q21:Spring 支 持 的 ORM有那些?,
Q22、Spring 框架中的單例 Beans 是執行緒安全的么?
Q23:Spring 框架中都用到了哪些設計模式?
Q24、請舉例解釋@Autowired 注解?
Q1 什 么 是 spring?
Spring是個java企業級應用的開源開發框架 ,Spring主要用來開發 Java應用,但是有些擴展是針 對構建J2EE 平臺的web應用 ,Spring 框 架目標是簡化Java企業級應用開發,并通過 POJO為基 礎的編程模型促進良好的編程習慣 ,
Q2:使 用 Spring 框 架 的 好 處 是 什 么 ?
? 輕量 :Spring 是輕量的,基本的版本大約2MB,
? 控制反轉 :Spring 通過控制反轉實作了松散耦合 ,物件們給出它們的依 賴 ,而不是創建或查找依賴的物件們 ,面向切面的編程(AOP):Spring 支持面向切面的編程 ,并且把應用業務邏輯和系統服務分開,容器 :Spring 包含并管理應用中物件的生命周期和配置 ,
Dependency Injection(DI) 方法使得構造器和 JavaBean properties 檔案中的依賴關系一目了然,
與 EJB 容器相比較,IoC 容器更加趨向于輕量級,這樣一來IoC 容器在有限的記憶體和 CPU 資源的情況下進行應用程式的開發和發布就變得十分有利,
Spring的高度可開放性,并不強制依賴于Spring,開發者可以自由選擇Spring部分或全部,
? MVC框架:Spring 的 WEB 框 架 是個精心設計的框架,是 Web 框架的一個很好的替代品,
? 事務管理 :Spring 提供一個持 續的事務管理介面,可以擴展到上至本地事務下至全域事務(JTA) ,
? 例外處理 :Spring 提供方便的 API把具體技術相關的例外(比如由JDBC,Hibernate or JDO拋出的) 轉化為一致的unchecked例外,
Q3:使 用 Spring 缺點是什么?
1,缺少一個公用控制器;
2,沒有SpringBoot好用;
3,Spring像一個膠水,將框架黏在一起,后面拆分的話就不容易拆分了,
總結下Spring的優點和缺點,

Q4:IoC 是什么?
IoC即控制反轉,簡單來說就是把原來代碼?需要實作的物件創建、依賴反轉給容器來幫忙實作,需要創建?個容器并且需要?種描述讓容器知道要創建的物件間的關系,在 Spring 中管理物件及其依賴關系是通過 Spring 的 IoC 容器實作的,
IoC 的實作方式有依賴注?和依賴查找,由于依賴查找使?的很少,因此 IoC 也叫做依賴注?,
依賴注入具體怎么實作的呢?
依賴注?指物件被動地接受依賴類?不用自己主動去找,物件不是從容器中查找它依賴的類,而是在容器實體化物件時主動將它依賴的類注入給它,假設?個 Car 類需要?個 Engine 的物件,那么?般需要手動 new一個 Engine,利用 IoC 就只需要定義?個私有的 Engine 型別的成員變數,容器會在運行時自動創建?個 Engine 的實體物件并將參考自動注?給成員變數,
Q5:IOC的優點是什么
IOC 或依賴注入把應用的代碼量 降到最低, 它使應 容易測驗 ,單元測驗不再 需 要 單 例 和 JNDI查找機制,最小的代價和最小的侵入性使松散耦合得以實作 ,IOC容器支持加 載 服務時的餓漢式初始化和懶加載 ,

Q6:IoC 容器初始化程序?
基于 XML 的容器初始化,當創建?個 ClassPathXmlApplicationContext 時,構造方法做了兩件事:
① 呼叫父容器的構造方法為容器設定好 Bean 資源加載器,
② 呼叫父類的路徑,方法設定 Bean 配置資訊定位,
ClassPathXmlApplicationContext 通過呼叫父類 AbstractApplicationContext 的方法啟動
整個 IoC 容器對 Bean 定義的載入程序, refresh 是?個模板方法,規定了 IoC 容器的啟動流程,在創建 IoC 容器前如果已有容器存在,需要把已有的容器銷毀,保證在的 IoC 容器,
方法后使用的是新創建容器創建后通過方法加載 Bean 配置資源,該方法做兩件事:
① 呼叫資源加載器的方法獲取要加載的資源,
② 真正執行加載功能,由子類 XmlBeanDe?nitionReader 實作,加載資源時?先決議組態檔路徑,讀取組態檔的內容,然后通過 XML 決議器將 Bean 配置資訊轉換成?檔物件,之后按照 Spring Bean 的定義規則對?檔物件進?決議,
Spring IoC 容器中注冊決議的 Bean 資訊存放在?個 HashMap 集合中,key 是字串,值是BeanDe?nition,注冊程序中需要使? synchronized 保證執行緒安全,當配置資訊中配置的 Bean 被決議且被注冊到 IoC 容器中后,初始化就算真正完成了,Bean 定義資訊已經可以使?且可被檢索,Spring IoC 容器的作用就是對這些注冊的 Bean 定義資訊進?處理和維護,注冊的 Bean 定義資訊是控制反轉和依賴注?的基礎,
基于注解的容器初始化分為兩種:① 直接將注解 Bean 注冊到容器中,可以在初始化容器時注冊,也可以在容器創建之后?動注冊,然后重繪容器使其對注冊的注解 Bean 進行處理,② 通過掃描指定的包及其子包的所有類處理, 在初始化注解容器時指定要?動掃描的路徑,
Q7:依賴注?的實作方法有哪些?
構造方法注入: IoC Service Provider 會檢查被注?物件的構造?法,取得它所需要的依賴物件串列,進?為其注?相應的物件,這種方法的優點是在物件構造完成后就處于就緒狀態,可以馬上使用,缺點是當依賴物件較多時,構造?法的引數串列會比較長,構造方法無法被繼承,無法設定默認值,對于非必需的依賴處理可能需要引?多個構造方法,引數數量的變動可能會造成維護的困難,
setter 方法注入:當前物件只需要為其依賴物件對應的屬性添加 setter 方法,就可以通過 setter 方法將依賴物件注入到被依賴物件中,setter方法注?在描述性上要比構造方法注?強,并且可以被集成, 允許設定默認值,缺點是無法在物件構造完成后馬上進?就緒狀態,
介面注入:必須實作某個介面,介面提供方法來為其注?依賴物件,使用少,因為它強制要求被注入物件實作不必要介面,侵入性強,

Q8:依賴注入的相關注解?
@Autowired :自動按型別注?,如果有多個匹配則按照指定 Bean 的 id 查找,查找不到會報錯,
@Qualifier :在自動按照型別注入的基礎上再按照 Bean 的 id 注入,給變數注入時必須搭配,
@Autowired ,給方法注?時可單獨使?,直接按照 Bean 的 id 注入,只能注入Bean 型別,
Q9:依賴注入的程序?
方法獲取 Bean 實體,該方法調?Bean 的功能,也是觸發依賴注入的地方,具體創建 Bean 物件的程序由 ObjectFactory 的, doGetBean 真正實作從 IoC 容器獲取完成,該方法主要通過依賴注入進?處理,方法生成Bean 包含的 Java 物件實體和方法對 Bean 屬性的,
在 populateBean 方法中,注入程序主要分為兩種情況:① 屬性值型別不需要強制轉換時,不需要決議屬性值,直接進行依賴注入,②屬性值型別需要強制轉換時,首先決議屬性值,然后對決議后的屬性值進行依賴注?,依賴注入的程序就是將 Bean 物件實體設定到它所依賴的 Bean 物件屬性上,真正的
依賴注入是通過方法實作的,該方法使用了委派模式,
BeanWrapperImpl 類負責對完成初始化的 Bean 物件進行依賴注入,對于非集合型別屬性,使用 JDK反射,通過屬性的 setter 方法為屬性設定注入后的值,對于集合型別的屬性,將屬性值決議為?標型別的集合后直接賦值給屬性,
當容器對 Bean 的定位、載入、決議和依賴注?全部完成后就不再需要手動創建物件,IoC 容器會?動為我們創建物件并且注入依賴,
Q10:Bean 的生命周期?
在 IoC 容器的初始化程序中會對 Bean 定義完成資源定位,加載讀取配置并決議,最后將決議的 Bean 資訊放在?個 HashMap 集合中,當 IoC 容器初始化完成后,會進行對 Bean 實體的創建和依賴注?程序,注?物件依賴的各種屬性值,在初始化時可以指定自定義的初始化方法,經過這?系列初始化操作后 Bean 達到可?狀態,接下來就可以使? Bean 了,當使用完成后會調? destroy 方法進?銷毀,此時也可以指定?定義的銷毀方法,最終 Bean 被銷毀且從容器中移除,
XML 方式通過配置 bean 標簽中的 init-Method 和 destory-Method 指定自定義初始化和銷毀方法,注解方式通過和注解指定?定義初始化和銷毀方法,
@PostConstruct 和@PreDestroy 注解方式,使用 customInit()和customDestroy()方法管理 bean 生命周期的代碼樣例如下:
1. <beans>
2. <bean id="demoBean"
class="com.springmeng.task.DemoBean"
3. init-method="customInit" destroymethod="customDestroy"></bean>
4. </beans>
更多內容請參考:Spring 生命周期 Spring Bean Life Cycle:
https://howtodoinjava.com/spring-core/spring-beanlife-cycle/
Q11:Bean 的作?范圍?
通過 scope 屬性指定 bean 的作用范圍,包括:
① singleton:單例模式,是默認作用域,不管收到多少 Bean 請求每個容器中只有?個唯?的 Bean 實體,
② prototype:原型模式,和 singleton 相反,每次 Bean 請求都會創建?個新的實體,
③ request:每次 HTTP 請求都會創建?個新的 Bean 并把它放到 request 域中,在請求完成后 Bean會失效并被垃圾收集器回收,
④ session:和 request 類似,確保每個 session 中有?個 Bean 實體,session 過期后bean會隨之失效,
⑤ global session:當應?部署在 Portlet 容器時,如果想讓所有 Portlet 共?全域存盤變數,那么該變數需要存盤在 global session 中,
Q12:如何通過 XML ?式創建 Bean?
默認無參構造方法,只需要指明 bean 標簽中的 id 和 class 屬性,如果沒有無參構造方法報錯,
靜態工廠方法,通過 bean 標簽中的 class 屬性指明靜態工廠,factory-method 屬性指明靜態工廠方法,
實體工廠方法,通過 bean 標簽中的 factory-bean 屬性指明實體工廠,factory-method 屬性指明實體工廠方法,
Q13、Spring 有幾種配置方式?
將 Spring 配置到應用開發中有以下三種方式:
1. 基于 XML 的配置
2. 基于注解的配置
3. 基于 Java 的配置
Q14如何用基于 XML 配置的方式配置 Spring?
在 Spring 框架中,依賴和服務需要在專門的組態檔來實作,我常用的 XML 格式的組態檔,這些組態檔的格式通常用開頭,然后一系列的 bean 定義和專門的應用配置選項組成,
SpringXML 配置的主要目的時候是使所有的 Spring 組件都可以用 xml 檔案的形式來進行配置,這意味著不會出現其他的Spring 配置型別(比如宣告的方式或基于 Java Class 的配置方式),Spring 的 XML 配置方式是使用被 Spring 命名空間的所支持的一系列的 XML 標簽來實作的,Spring 有以下主要的命名空間:context、beans、jdbc、tx、aop、mvc 和 aso,
1. <beans>
2.
3. <!-- JSON Support -->
4. <bean name="viewResolver"
class="org.springframework.web.servlet.view.BeanNameVi
ewResolver"/>
5. <bean name="jsonTemplate"
class="org.springframework.web.servlet.view.json.Mappi
ngJackson2JsonView"/>
6.
7. <bean id="restTemplate"
class="org.springframework.web.client.RestTemplate"/>
8.
9. </beans>
Q15:如何通過注解創建 Bean?
把當前類物件存入 Spring 容器中,相當于在 xml 中配置?個 bean 標簽,value 屬性指定 bean 的 id,默認使用當前類的字母首小寫的類名,
@Controller,@Service ,@Repository 三個注解都是的衍生注解,作用及屬性都是?模?樣的,只是提供了更加明確語意, @Controller 用于控制層,@Service用于業務層,@Repository 用于持久層,如果注解中有且只有?個 value 屬性要賦值時可以省略 value,
如果想將第三方的類變成組件又沒有源代碼,也就沒辦法使用 進行自動配置,這種時候就要使?注解,被注解的?法回傳值是?個物件,將會實體化,配置和初始化?個新物件并回傳,這個物件由 Spring 的 IoC 容器管理,name 屬性用于給當前注解方法創建的物件指定?個名稱,即 bean 的 id,當使用注解配置方法時,如果方法有引數,Spring 會去容器查找是否有可? bean物件,查找方式和?樣,
1. <web-app>
2. <display-name>Archetype Created Web
Application</display-name>
3.
4. <servlet>
5. <servlet-name>spring</servlet-name>
6. <servlet-class>
7.
org.springframework.web.servlet.DispatcherServlet
8. </servlet-class>
9. <load-on-startup>1</load-on-startup>
10. </servlet>
11.
12. <servlet-mapping>
13. <servlet-name>spring</servlet-name>
14. <url-pattern>/</url-pattern>
15. </servlet-mapping>
16.
17. </web-app>
看到這里的小伙伴,給個三連支持下,祝你offer收到手疼,嘿嘿……一起進步!

Q17:如何通過注解配置?件?
?于指定當前類是?個 spring 配置類,當創建容器時會從該類上加載注解,value 屬性用于指定配置類的位元組碼,
?于指定 Spring 在初始化容器時要掃描的包,basePackages 屬性用于指定要掃描的包,
用于加載檔案中的配置,value 屬性用于指定?件位置,如果是在類路徑下需要加上 classpath,用于導?其他配置類,在引入其他配置類時可以不?再寫注解,有的是父配置類,引入的是子配置類,value 屬性用于指定其他配置類的位元組碼,
Q18:BeanFactory、FactoryBean 和ApplicationContext 的區別?
BeanFactory 是?個 Bean 工廠,使用簡單工廠模式,是 Spring IoC 容器頂級介面,可以理解為含有Bean 集合的工廠類,作用是管理 Bean,包括實體化、定位、配置物件及建?這些物件間的依賴,BeanFactory 實體化后并不會自動實體化 Bean,只有當 Bean 被使?時才實體化與裝配依賴關系,屬于延遲加載,適合多例模式,
FactoryBean 是?個工廠Bean,使用了工廠方法模式,作?是?產其他 Bean 實體,可以通過實作該接?,提供?個工廠方法來?定義實體化 Bean 的邏輯,FactoryBean 介面由 BeanFactory 中配置的物件實作,這些物件本身就是用于創建物件的工廠,如果?個 Bean 實作了這個介面,那么它就是創建物件的工廠 Bean,而不是 Bean 實體本身,
ApplicationConext 是 BeanFactory 的子介面,擴展了 BeanFactory 的功能,提供了支持國際化的?本訊息,統?的資源?件讀取方式,事件傳播以及應?層的特別配置等,容器會在初始化時對配置的Bean 進行預實體化,Bean 的依賴注入在容器初始化時就已經完成,屬于立即加載,適合單例模式,?般推薦使用,
Q19. 解 釋 Spring 框 架 中 bean 的 生 命 周 期 ,
? Spring容器從XML檔案中 取 bean的定義,并實體化 bean,
? Spring 根 據 bean 的定義填充所有的屬 性 ,
? 如果bean實作了BeanNameAware 介面 ,Spring 傳遞bean 的 ID到setBeanName 方法 ,
? 如果 Bean實作了BeanFactoryAware 介面 ,Spring傳 遞 beanfactory 給 setBeanFactory方法,
? 如果有任何與bean 相關的BeanPostProcessors,Spring會在 postProcesserBeforeInitialization()方 法內 調 用 它 們 ,
? 如 果 bean 實 現 IntializingBean了 ,調 用 它 的afterPropertySet 方法 ,如果 bean宣告了初始化方法 ,呼叫此初始化方法 ,
?如果有BeanPostProcessors 和bean關聯 ,這些 bean的postProcessAfterInitialization() 方法將 被呼叫 ,
? 如果bean實作了DisposableBean, 它將呼叫destroy()方 法 ,
Q20、怎樣開啟注解裝配 ?
注解裝配在默認情 況下是不開啟的 ,為了使用注解裝配 ,我們必須在Spring 組態檔中配置元素 ,
Q21:Spring 支 持 的 ORM有那些?,
Spring支持以下ORM:
1,Hibernate
2,iBatis
3,JPA (Java Persistence API)
4,TopLink
5,JDO (Java Data Objects)
6,OJB
Q22、Spring 框架中的單例 Beans 是執行緒安全的么?
Spring 框架并沒有對單例 bean 進行任何多執行緒的封裝處理,
關于單例 bean 的執行緒安全和并發問題需要開發者自行去搞定,但實際上大部分的 Spring bean 并沒有可變的狀態(比如 Serview 類和 DAO 類),所以在某種程度上說 Spring 的單例 bean 是執行緒安全的,如果你的 bean 有多種狀態的話(比如 View Model 物件),就需要自行保證執行緒安全,
最淺顯的解決辦法就是將多型 bean 的作用域由“singleton”變更為“prototype”,
Q23:Spring 框架中都用到了哪些設計模式?
Spring 框架中使用到了大量的設計模式,下面列舉了比較有代表性的:
1. 代理模式—在 AOP 和 remoting 中被用的比較多,
2. 單例模式—在 spring 組態檔中定義的 bean 默認為單例模式,
3. 模板方法—用來解決代碼重復的問題,比如. RestTemplate,JmsTemplate, JpaTemplate,
4. 前端控制器—Spring 提供了 DispatcherServlet 來對請求進行分發,
5. 視圖幫助(View Helper )—Spring 提供了一系列的 JSP 標簽,高效宏來輔助將分散的代碼整合在視圖里,
6. 依賴注入—貫穿于 BeanFactory / ApplicationContext 介面的核心理念,
7. 工廠模式—BeanFactory 用來創建物件的實,
Q24、請舉例解釋@Autowired 注解?
@Autowired 注解對自動裝配何時何處被實作提供了更多細粒度的控制,@Autowired 注解可以像@Required 注解、構造器一樣被用于在 bean 的設值方法上自動裝配 bean 的屬性,一個引數或者帶有任意名稱或帶有多個引數的方法
比如,可以在設值方法上使用@Autowired 注解來替代組態檔中的元素,當 Spring 容器在 setter 方法上找到@Autowired 注解時,會嘗試用 byType 自動裝配,
當然我們也可以在構造方法上使用@Autowired 注解,帶有@Autowired 注解的構造方法意味著在創建一個 bean 時將會被自動裝配,即便在配置檔案中使用元素,
1. public class TextEditor {
2. private SpellChecker spellChecker;
3.
4. @Autowired
5. public TextEditor(SpellChecker spellChecker){
6. System.out.println("Inside TextEditor
constructor." );
7. this.spellChecker = spellChecker;
8. }
9.
10. public void spellCheck(){
11. spellChecker.checkSpelling();
12. }
13. }
下面是沒有構造引數的配置方式:
1. <beans>
2.
3. <context:annotation-config/>
4.
5. <!-- Definition for textEditor bean without
constructor-arg -->
6. <bean id="textEditor"
class="com.springmeng.TextEditor">
7. </bean>
8.
9. <!-- Definition for spellChecker bean -->
10. <bean id="spellChecker"
class="com.howtodoinjava.SpellChecker">
11. </bean>
12.
13. </beans>
好了,spring面試整理結束,小伙伴們點贊、收藏、評論,一鍵三連走起呀,下期見~~

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/293601.html
標籤:java
