吊打Java面試官!整理了一周的Spring面試大全(附答案)
對(duì)于Java的小伙伴來(lái)說(shuō),Spring是面試的必問(wèn)環(huán)節(jié),我研究Spring多年,甚至我的網(wǎng)名都叫SpringMeng。
最新整理的數(shù)據(jù)結(jié)構(gòu)和算法的值得收藏:
小孟肝了一周,繼續(xù)給大家整理Spring的系列,幫你offer收到手疼。先看下Spring的家族圖:

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

Q1:什 么 是 spring?
Sring是個(gè)java企業(yè)級(jí)應(yīng)用的開(kāi)源開(kāi)發(fā)框架 。Spring主要用來(lái)開(kāi)發(fā) Java應(yīng)用,但是有些擴(kuò)展是針 對(duì)構(gòu)建J2EE 平臺(tái)的web應(yīng)用 。Spring 框 架目標(biāo)是簡(jiǎn)化Java企業(yè)級(jí)應(yīng)用開(kāi)發(fā),并通過(guò) POJO為基 礎(chǔ)的編程模型促進(jìn)良好的編程習(xí)慣 。
Q2:使 用 Spring 框 架 的 好 處 是 什 么 ?
- 輕量:Spring 是輕量的,基本的版本大約2MB
- 控制反轉(zhuǎn) :Spring 通過(guò)控制反轉(zhuǎn)實(shí)現(xiàn)了松散耦合 ,對(duì)象們給出它們的依 賴(lài) ,而不是創(chuàng)建或查找依賴(lài)的對(duì)象們 。面向切面的編程(AOP):Spring 支持面向切面的編程 ,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開(kāi)。容器 :Spring 包含并管理應(yīng)用中對(duì)象的生命周期和配置 。
Dependency Injection(DI) 方法使得構(gòu)造器和 JavaBean properties 文件中的依賴(lài)關(guān)系一目了然。
與 EJB 容器相比較,IoC 容器更加趨向于輕量級(jí)。這樣一來(lái)IoC 容器在有限的內(nèi)存和 CPU 資源的情況下進(jìn)行應(yīng)用程序的開(kāi)發(fā)和發(fā)布就變得十分有利。
Spring的高度可開(kāi)放性,并不強(qiáng)制依賴(lài)于Spring,開(kāi)發(fā)者可以自由選擇Spring部分或全部。
- MVC框架:Spring 的 WEB 框 架 是個(gè)精心設(shè)計(jì)的框架,是 Web 框架的一個(gè)很好的替代品。
- 事務(wù)管理 :Spring 提供一個(gè)持 續(xù)的事務(wù)管理接口,可以擴(kuò)展到上至本地事務(wù)下至全局事務(wù)(JTA) 。
- 異常處理 :Spring 提供方便的 API把具體技術(shù)相關(guān)的異常(比如由JDBC,Hibernate or JDO拋出的) 轉(zhuǎn)化為一致的unchecked異常。
Q3:使 用 Spring 缺點(diǎn)是什么?
1,缺少一個(gè)公用控制器;
2,沒(méi)有SpringBoot好用;
3,Spring像一個(gè)膠水,將框架黏在一起,后面拆分的話就不容易拆分了。
總結(jié)下Spring的優(yōu)點(diǎn)和缺點(diǎn)。

Q4:IoC 是什么?
IoC即控制反轉(zhuǎn),簡(jiǎn)單來(lái)說(shuō)就是把原來(lái)代碼⾥需要實(shí)現(xiàn)的對(duì)象創(chuàng)建、依賴(lài)反轉(zhuǎn)給容器來(lái)幫忙實(shí)現(xiàn),需要?jiǎng)?chuàng)建⼀個(gè)容器并且需要⼀種描述讓容器知道要?jiǎng)?chuàng)建的對(duì)象間的關(guān)系,在 Spring 中管理對(duì)象及其依賴(lài)關(guān)系是通過(guò) Spring 的 IoC 容器實(shí)現(xiàn)的。
IoC 的實(shí)現(xiàn)方式有依賴(lài)注⼊和依賴(lài)查找,由于依賴(lài)查找使⽤的很少,因此 IoC 也叫做依賴(lài)注⼊。
依賴(lài)注入具體怎么實(shí)現(xiàn)的呢?
依賴(lài)注⼊指對(duì)象被動(dòng)地接受依賴(lài)類(lèi)⽽不用自己主動(dòng)去找,對(duì)象不是從容器中查找它依賴(lài)的類(lèi),而是在容器實(shí)例化對(duì)象時(shí)主動(dòng)將它依賴(lài)的類(lèi)注入給它。假設(shè)⼀個(gè) Car 類(lèi)需要⼀個(gè) Engine 的對(duì)象,那么⼀般需要手動(dòng) new一個(gè) Engine,利用 IoC 就只需要定義⼀個(gè)私有的 Engine 類(lèi)型的成員變量,容器會(huì)在運(yùn)行時(shí)自動(dòng)創(chuàng)建⼀個(gè) Engine 的實(shí)例對(duì)象并將引用自動(dòng)注⼊給成員變量。
Q5:IOC的優(yōu)點(diǎn)是什么
IOC 或依賴(lài)注入把應(yīng)用的代碼量 降到最低。 它使應(yīng) 容易測(cè)試 ,單元測(cè)試不再 需 要 單 例 和 JNDI查找機(jī)制。最小的代價(jià)和最小的侵入性使松散耦合得以實(shí)現(xiàn) 。IOC容器支持加 載 服務(wù)時(shí)的餓漢式初始化和懶加載 。

Q6:IoC 容器初始化過(guò)程?
基于 XML 的容器初始化,當(dāng)創(chuàng)建⼀個(gè) ClassPathXmlApplicationContext 時(shí),構(gòu)造方法做了兩件事:
① 調(diào)用父容器的構(gòu)造方法為容器設(shè)置好 Bean 資源加載器。
② 調(diào)用父類(lèi)的路徑。方法設(shè)置 Bean 配置信息定位。
ClassPathXmlApplicationContext 通過(guò)調(diào)用父類(lèi) AbstractApplicationContext 的方法啟動(dòng)
整個(gè) IoC 容器對(duì) Bean 定義的載入過(guò)程, refresh 是⼀個(gè)模板方法,規(guī)定了 IoC 容器的啟動(dòng)流程。在創(chuàng)建 IoC 容器前如果已有容器存在,需要把已有的容器銷(xiāo)毀,保證在的 IoC 容器。
方法后使用的是新創(chuàng)建容器創(chuàng)建后通過(guò)方法加載 Bean 配置資源,該方法做兩件事:
① 調(diào)用資源加載器的方法獲取要加載的資源。
② 真正執(zhí)行加載功能,由子類(lèi) XmlBeanDefinitionReader 實(shí)現(xiàn)。加載資源時(shí)⾸先解析配置文件路徑,讀取配置文件的內(nèi)容,然后通過(guò) XML 解析器將 Bean 配置信息轉(zhuǎn)換成⽂檔對(duì)象,之后按照 Spring Bean 的定義規(guī)則對(duì)⽂檔對(duì)象進(jìn)⾏解析。
Spring IoC 容器中注冊(cè)解析的 Bean 信息存放在⼀個(gè) HashMap 集合中,key 是字符串,值是BeanDefinition,注冊(cè)過(guò)程中需要使⽤ synchronized 保證線程安全。當(dāng)配置信息中配置的 Bean 被解析且被注冊(cè)到 IoC 容器中后,初始化就算真正完成了,Bean 定義信息已經(jīng)可以使⽤且可被檢索。Spring IoC 容器的作用就是對(duì)這些注冊(cè)的 Bean 定義信息進(jìn)⾏處理和維護(hù),注冊(cè)的 Bean 定義信息是控制反轉(zhuǎn)和依賴(lài)注⼊的基礎(chǔ)。
基于注解的容器初始化分為兩種:① 直接將注解 Bean 注冊(cè)到容器中,可以在初始化容器時(shí)注冊(cè),也可以在容器創(chuàng)建之后⼿動(dòng)注冊(cè),然后刷新容器使其對(duì)注冊(cè)的注解 Bean 進(jìn)行處理。② 通過(guò)掃描指定的包及其子包的所有類(lèi)處理, 在初始化注解容器時(shí)指定要⾃動(dòng)掃描的路徑。
Q7:依賴(lài)注⼊的實(shí)現(xiàn)方法有哪些?
構(gòu)造方法注入: IoC Service Provider 會(huì)檢查被注⼊對(duì)象的構(gòu)造⽅法,取得它所需要的依賴(lài)對(duì)象列表,進(jìn)⽽為其注⼊相應(yīng)的對(duì)象。這種方法的優(yōu)點(diǎn)是在對(duì)象構(gòu)造完成后就處于就緒狀態(tài),可以馬上使用。缺點(diǎn)是當(dāng)依賴(lài)對(duì)象較多時(shí),構(gòu)造⽅法的參數(shù)列表會(huì)比較長(zhǎng),構(gòu)造方法無(wú)法被繼承,無(wú)法設(shè)置默認(rèn)值。對(duì)于非必需的依賴(lài)處理可能需要引⼊多個(gè)構(gòu)造方法,參數(shù)數(shù)量的變動(dòng)可能會(huì)造成維護(hù)的困難。
setter 方法注入:當(dāng)前對(duì)象只需要為其依賴(lài)對(duì)象對(duì)應(yīng)的屬性添加 setter 方法,就可以通過(guò) setter 方法將依賴(lài)對(duì)象注入到被依賴(lài)對(duì)象中。setter方法注⼊在描述性上要比構(gòu)造方法注⼊強(qiáng),并且可以被集成, 允許設(shè)置默認(rèn)值。缺點(diǎn)是無(wú)法在對(duì)象構(gòu)造完成后馬上進(jìn)⼊就緒狀態(tài)。
接口注入:必須實(shí)現(xiàn)某個(gè)接口,接口提供方法來(lái)為其注⼊依賴(lài)對(duì)象。使用少,因?yàn)樗鼜?qiáng)制要求被注入對(duì)象實(shí)現(xiàn)不必要接口,侵入性強(qiáng)。

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

Q16:如何通過(guò)注解配置⽂件?
⽤于指定當(dāng)前類(lèi)是⼀個(gè) spring 配置類(lèi),當(dāng)創(chuàng)建容器時(shí)會(huì)從該類(lèi)上加載注解,value 屬性用于指定配置類(lèi)的字節(jié)碼。
⽤于指定 Spring 在初始化容器時(shí)要掃描的包。basePackages 屬性用于指定要掃描的包。
用于加載文件中的配置。value 屬性用于指定⽂件位置,如果是在類(lèi)路徑下需要加上 classpath。用于導(dǎo)⼊其他配置類(lèi),在引入其他配置類(lèi)時(shí)可以不⽤再寫(xiě)注解。有的是父配置類(lèi),引入的是子配置類(lèi)。value 屬性用于指定其他配置類(lèi)的字節(jié)碼。
Q17:BeanFactory、FactoryBean 和ApplicationContext 的區(qū)別?
BeanFactory 是⼀個(gè) Bean 工廠,使用簡(jiǎn)單工廠模式,是 Spring IoC 容器頂級(jí)接口,可以理解為含有Bean 集合的工廠類(lèi),作用是管理 Bean,包括實(shí)例化、定位、配置對(duì)象及建⽴這些對(duì)象間的依賴(lài)。BeanFactory 實(shí)例化后并不會(huì)自動(dòng)實(shí)例化 Bean,只有當(dāng) Bean 被使⽤時(shí)才實(shí)例化與裝配依賴(lài)關(guān)系,屬于延遲加載,適合多例模式。
FactoryBean 是⼀個(gè)工廠Bean,使用了工廠方法模式,作⽤是⽣產(chǎn)其他 Bean 實(shí)例,可以通過(guò)實(shí)現(xiàn)該接⼝,提供⼀個(gè)工廠方法來(lái)⾃定義實(shí)例化 Bean 的邏輯。FactoryBean 接口由 BeanFactory 中配置的對(duì)象實(shí)現(xiàn),這些對(duì)象本身就是用于創(chuàng)建對(duì)象的工廠,如果⼀個(gè) Bean 實(shí)現(xiàn)了這個(gè)接口,那么它就是創(chuàng)建對(duì)象的工廠 Bean,而不是 Bean 實(shí)例本身。
ApplicationConext 是 BeanFactory 的子接口,擴(kuò)展了 BeanFactory 的功能,提供了支持國(guó)際化的⽂本消息,統(tǒng)⼀的資源⽂件讀取方式,事件傳播以及應(yīng)⽤層的特別配置等。容器會(huì)在初始化時(shí)對(duì)配置的Bean 進(jìn)行預(yù)實(shí)例化,Bean 的依賴(lài)注入在容器初始化時(shí)就已經(jīng)完成,屬于立即加載,適合單例模式,⼀般推薦使用。
Q18: 解 釋 Spring 框 架 中 bean 的 生 命 周 期 。
Spring容器從XML文件中 取 bean的定義,并實(shí)例化 bean。
Spring 根 據(jù) bean 的定義填充所有的屬 性 。
如果bean實(shí)現(xiàn)了BeanNameAware 接口 ,Spring 傳遞bean 的 ID到setBeanName 方法 。
如果 Bean實(shí)現(xiàn)了BeanFactoryAware 接口 ,Spring傳 遞 beanfactory 給 setBeanFactory方法。
如果有任何與bean 相關(guān)的BeanPostProcessors,Spring會(huì)在 postProcesserBeforeInitialization()方 法內(nèi) 調(diào) 用 它 們 。
如 果 bean 實(shí) 現(xiàn) IntializingBean了 ,調(diào) 用 它 的afterPropertySet 方法 ,如果 bean聲明了初始化方法 ,調(diào)用此初始化方法 。
如果有BeanPostProcessors 和bean關(guān)聯(lián) ,這些 bean的postProcessAfterInitialization() 方法將 被調(diào)用 。
如果bean實(shí)現(xiàn)了DisposableBean, 它將調(diào)用destroy()方 法 。
Q19:怎樣開(kāi)啟注解裝配 ?
注解裝配在默認(rèn)情 況下是不開(kāi)啟的 ,為了使用注解裝配 ,我們必須在Spring 配置文件中配置元素 。
Q20:Spring 支 持 的 ORM有那些?,
Spring支持以下ORM:
1,Hibernate
2,iBatis
3,JPA (Java Persistence API)
4,TopLink
5,JDO (Java Data Objects)
6,OJB
Q21:Spring 框架中的單例 Beans 是線程安全的么?
Spring 框架并沒(méi)有對(duì)單例 bean 進(jìn)行任何多線程的封裝處理。
關(guān)于單例 bean 的線程安全和并發(fā)問(wèn)題需要開(kāi)發(fā)者自行去搞定。但實(shí)際上大部分的 Spring bean 并沒(méi)有可變的狀態(tài)(比如 Serview 類(lèi)和 DAO 類(lèi)),所以在某種程度上說(shuō) Spring 的單例 bean 是線程安全的。如果你的 bean 有多種狀態(tài)的話(比如 View Model 對(duì)象),就需要自行保證線程安全。
最淺顯的解決辦法就是將多態(tài) bean 的作用域由“singleton”變更為“prototype”。
Q22:Spring 框架中都用到了哪些設(shè)計(jì)模式?
Spring 框架中使用到了大量的設(shè)計(jì)模式,下面列舉了比較有代表性的:
1. 代理模式—在 AOP 和 remoting 中被用的比較多。
2. 單例模式—在 spring 配置文件中定義的 bean 默認(rèn)為單例模式。
3. 模板方法—用來(lái)解決代碼重復(fù)的問(wèn)題。比如. RestTemplate,JmsTemplate, JpaTemplate。
4. 前端控制器—Spring 提供了 DispatcherServlet 來(lái)對(duì)請(qǐng)求進(jìn)行分發(fā)。
5. 視圖幫助(View Helper )—Spring 提供了一系列的 JSP 標(biāo)簽,高效宏來(lái)輔助將分散的代碼整合在視圖里。
6. 依賴(lài)注入—貫穿于 BeanFactory / ApplicationContext 接口的核心理念。
7. 工廠模式—BeanFactory 用來(lái)創(chuàng)建對(duì)象的實(shí)。
Q23:請(qǐng)舉例解釋@Autowired 注解?
@Autowired 注解對(duì)自動(dòng)裝配何時(shí)何處被實(shí)現(xiàn)提供了更多細(xì)粒度的控制。@Autowired 注解可以像@Required 注解、構(gòu)造器一樣被用于在 bean 的設(shè)值方法上自動(dòng)裝配 bean 的屬性,一個(gè)參數(shù)或者帶有任意名稱(chēng)或帶有多個(gè)參數(shù)的方法
比如,可以在設(shè)值方法上使用@Autowired 注解來(lái)替代配置文件中的元素。當(dāng) Spring 容器在 setter 方法上找到@Autowired 注解時(shí),會(huì)嘗試用 byType 自動(dòng)裝配。
當(dāng)然我們也可以在構(gòu)造方法上使用@Autowired 注解。帶有@Autowired 注解的構(gòu)造方法意味著在創(chuàng)建一個(gè) bean 時(shí)將會(huì)被自動(dòng)裝配,即便在配置文件中使用元素。
public class TextEditor {
private SpellChecker spellChecker;
@Autowired
public TextEditor(SpellChecker spellChecker){
System.out.println("Inside TextEditor
constructor." );
this.spellChecker = spellChecker;
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}
下面是沒(méi)有構(gòu)造參數(shù)的配置方式:
<beans> <context:annotation-config/> <!-- Definition for textEditor bean without constructor-arg --> <bean id="textEditor" class="com.springmeng.TextEditor"> </bean> <!-- Definition for spellChecker bean --> <bean id="spellChecker" class="com.howtodoinjava.SpellChecker"> </bean> </beans>
到此這篇關(guān)于吊打Java面試官!整理了一周的Spring面試大全(附答案)的文章就介紹到這了,更多相關(guān)Java面試Spring內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot使用hibernate validator校驗(yàn)方式
hibernate validator提供了一套比較完善、便捷的驗(yàn)證實(shí)現(xiàn)方式。下面小編給大家介紹下springboot使用hibernate validator校驗(yàn)方式,感興趣的朋友一起看看吧2018-01-01
Springboot整合企業(yè)微信機(jī)器人助手推送消息的實(shí)現(xiàn)
本文主要介紹了Springboot整合企業(yè)微信機(jī)器人助手推送消息的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Java8使用Supplier啟動(dòng)ScheduledThread代碼實(shí)例
這篇文章主要介紹了Java8使用Supplier啟動(dòng)ScheduledThread詳解,項(xiàng)目開(kāi)啟立即啟動(dòng)定時(shí)任務(wù)是很多項(xiàng)目都會(huì)遇到的一個(gè)需求,如何利用Java提供的函數(shù)優(yōu)雅的寫(xiě)出來(lái)十分考驗(yàn)一個(gè)人的功底,需要的朋友可以參考下2024-01-01
SpringBoot使用@Cacheable注解實(shí)現(xiàn)緩存功能流程詳解
最近一直再學(xué)Spring Boot,在學(xué)習(xí)的過(guò)程中也有過(guò)很多疑問(wèn)。為了解答自己的疑惑,也在網(wǎng)上查了一些資料,以下是對(duì)@Cacheable注解的一些理解2023-01-01
SpringBoot 靜態(tài)資源導(dǎo)入及首頁(yè)設(shè)置問(wèn)題
本節(jié)了解一下 SpringBoot 中 Web 開(kāi)發(fā)的靜態(tài)資源導(dǎo)入和首頁(yè)設(shè)置,對(duì)應(yīng) SpringBoot-03-Web 項(xiàng)目,本節(jié)主要是從源碼的角度,研究了一下靜態(tài)資源導(dǎo)入和首頁(yè)設(shè)置的問(wèn)題2021-09-09

