欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

吊打Java面試官!整理了一周的Spring面試大全(附答案)

 更新時(shí)間:2021年08月17日 16:20:08   作者:我是springmeng  
這篇文章主要介紹了Spring面試資料(附答案)建議收藏留存,學(xué)Java的小伙伴都知道Spring是面試的必問(wèn)環(huán)節(jié),看完了一天就可掌握數(shù)據(jù)結(jié)構(gòu)和算法的面試題,快來(lái)看看吧

對(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)文章

  • Java接口回調(diào)的本質(zhì)詳解

    Java接口回調(diào)的本質(zhì)詳解

    大家好,本篇文章主要講的是Java接口回調(diào)的本質(zhì)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • springboot使用hibernate validator校驗(yàn)方式

    springboot使用hibernate validator校驗(yàn)方式

    hibernate validator提供了一套比較完善、便捷的驗(yàn)證實(shí)現(xiàn)方式。下面小編給大家介紹下springboot使用hibernate validator校驗(yàn)方式,感興趣的朋友一起看看吧
    2018-01-01
  • Java 替換word文檔文字并指定位置插入圖片

    Java 替換word文檔文字并指定位置插入圖片

    這篇文章主要介紹了Java 替換word文檔文字,指定位置插入圖片功能,本文通過(guò)實(shí)例代碼給大家講解,需要的朋友可以參考下
    2018-02-02
  • Java Lambda表達(dá)式超詳細(xì)介紹

    Java Lambda表達(dá)式超詳細(xì)介紹

    這篇文章主要介紹了Java Lambda表達(dá)式,Lambda表達(dá)式是Java SE 8中一個(gè)重要的新特性, Lambda 表達(dá)式(Lambda expression)可以看作是一個(gè)匿名函數(shù),基于數(shù)學(xué)中的λ演算得名,也可稱(chēng)為閉包(Closure),下面來(lái)看看文章具體的詳細(xì)介紹吧
    2022-02-02
  • Java 深入分析鏈表面試實(shí)例題目

    Java 深入分析鏈表面試實(shí)例題目

    鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的,本篇帶你通過(guò)兩個(gè)實(shí)例題目來(lái)深入探索
    2022-03-03
  • Springboot整合企業(yè)微信機(jī)器人助手推送消息的實(shí)現(xiàn)

    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代碼實(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)緩存功能流程詳解

    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)題

    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
  • java必學(xué)必會(huì)之線程(1)

    java必學(xué)必會(huì)之線程(1)

    java必學(xué)必會(huì)之線程第一篇,介紹了線程的基本概念、線程的創(chuàng)建和啟動(dòng),想要學(xué)好java線程的朋友一定要好好閱讀這篇文章
    2015-12-12

最新評(píng)論