Spring IOC知識點(diǎn)一網(wǎng)打盡雹姊!

前言

只有光頭才能變強(qiáng)

回顧前面:

在刷Spring書籍的時候花了點(diǎn)時間去學(xué)習(xí)了單例模式和工廠模式,總的來說還是非常值得的职员!

本來想的是刷完《Spring 實(shí)戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》的IOC章節(jié)后來重新編寫一篇IOC的文章的麻蹋,看了一下之前已經(jīng)寫過的入門系列Spring入門這一篇就夠了Spring【依賴注入】就是這么簡單。最主要的知識點(diǎn)都已經(jīng)講過了廉邑,所以感覺就沒必要重新來編寫這些知識點(diǎn)了...

我個人又不喜歡將寫過的東西復(fù)制到新的文章中哥蔚,所以建議大家可以先去閱讀上面兩篇文章再來看這篇(工廠模式那篇如果沒有看過的同學(xué)也有必要去看看)~~

  • 為了這篇文章知識點(diǎn)的完整性,重要的知識點(diǎn)(IOC概念理解蛛蒙,創(chuàng)建Bean糙箍、注入的三種方式等)還是會出現(xiàn),但是不會將上面兩篇博文的代碼摘抄過來了牵祟。

這篇文章主要是補(bǔ)充和強(qiáng)化一些比較重要的知識點(diǎn)深夯,并會把上面的兩本書關(guān)于IOC的知識點(diǎn)整理出來并畫成一個思維導(dǎo)圖來全面了解Spring IOC的知識點(diǎn)!

那么接下來就開始吧,如果有錯的地方希望能多多包涵咕晋,并不吝在評論區(qū)指正雹拄!

一、Spring IOC全面認(rèn)知

結(jié)合《Spring 實(shí)戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》兩本書的IOC章節(jié)將其知識點(diǎn)整理起來~

1.1IOC和DI概述

在《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》中對IOC的定義是這樣的:

IoC(Inversion of Control)控制反轉(zhuǎn)掌呜,包含了兩個方面:一滓玖、控制。二质蕉、反轉(zhuǎn)

我們可以簡單認(rèn)為:

  • 控制指的是:當(dāng)前對象對內(nèi)部成員的控制權(quán)势篡。
  • 反轉(zhuǎn)指的是:這種控制權(quán)不由當(dāng)前對象管理了,由其他(類,第三方容器)來管理模暗。

IOC不夠開門見山禁悠,于是Martin Fowler提出了DI(dependency injection)來替代IoC,即讓調(diào)用類對某一接口實(shí)現(xiàn)類的依賴關(guān)系由第三方(容器或協(xié)作類)注入兑宇,以移除調(diào)用類對某一接口實(shí)現(xiàn)類的依賴碍侦。

在《Spring 實(shí)戰(zhàn) (第4版)》中并沒有提及到IOC,而是直接來說DI的:

通過DI隶糕,對象的依賴關(guān)系將由系統(tǒng)中負(fù)責(zé)協(xié)調(diào)各對象的第三方組件在創(chuàng)建對象的時候進(jìn)行設(shè)定瓷产,對象無需自行創(chuàng)建或管理它們的依賴關(guān)系,依賴關(guān)系將被自動注入到需要它們的對象當(dāng)中去

從書上我們也可以發(fā)現(xiàn):IoC和DI的定義(區(qū)別)并不是如此容易就可以說得清楚的了若厚。這里我就簡單摘抄一下:

  • IoC(思想拦英,設(shè)計模式)主要的實(shí)現(xiàn)方式有兩種:依賴查找,依賴注入测秸。
  • 依賴注入是一種更可取的方式(實(shí)現(xiàn)的方式)

對我們而言疤估,其實(shí)也沒必要分得那么清,混合一談也不影響我們的理解...

再通過昨天寫過的工廠模式理解了沒有霎冯?铃拇,我們現(xiàn)在就可以很清楚的發(fā)現(xiàn),其實(shí)所謂的IOC容器就是一個大工廠【第三方容器】(Spring實(shí)現(xiàn)的功能很強(qiáng)大沈撞!比我們自己手寫的工廠要好很多)慷荔。

使用IOC的好處(知乎@Intopass的回答):

  1. 不用自己組裝,拿來就用缠俺。
  2. 享受單例的好處显晶,效率高,不浪費(fèi)空間壹士。
  3. 便于單元測試磷雇,方便切換mock組件。
  4. 便于進(jìn)行AOP操作躏救,對于使用者是透明的唯笙。
  5. 統(tǒng)一配置螟蒸,便于修改。

參考資料:

1.2IOC容器的原理

從上面就已經(jīng)說了:IOC容器其實(shí)就是一個大工廠七嫌,它用來管理我們所有的對象以及依賴關(guān)系。

  • 原理就是通過Java的反射技術(shù)來實(shí)現(xiàn)的苞慢!通過反射我們可以獲取類的所有信息(成員變量诵原、類名等等等)!
  • 再通過配置文件(xml)或者注解來描述類與類之間的關(guān)系
  • 我們就可以通過這些配置信息和反射技術(shù)來構(gòu)建出對應(yīng)的對象和依賴關(guān)系了枉疼!

上面描述的技術(shù)只要學(xué)過點(diǎn)Java的都能說出來皮假,這一下子可能就會被面試官問倒了,我們簡單來看看實(shí)際Spring IOC容器是怎么實(shí)現(xiàn)對象的創(chuàng)建和依賴的:

image
  1. 根據(jù)Bean配置信息在容器內(nèi)部創(chuàng)建Bean定義注冊表
  2. 根據(jù)注冊表加載骂维、實(shí)例化bean、建立Bean與Bean之間的依賴關(guān)系
  3. 將這些準(zhǔn)備就緒的Bean放到Map緩存池中贺纲,等待應(yīng)用程序調(diào)用

Spring容器(Bean工廠)可簡單分成兩種:

  • BeanFactory
    • 這是最基礎(chǔ)航闺、面向Spring的
  • ApplicationContext
    • 這是在BeanFactory基礎(chǔ)之上,面向使用Spring框架的開發(fā)者猴誊。提供了一系列的功能潦刃!

幾乎所有的應(yīng)用場合都是使用ApplicationContext!

BeanFactory的繼承體系:

image

ApplicationContext的繼承體系:

image

其中在ApplicationContext子類中又有一個比較重要的:WebApplicationContext

  • 專門為Web應(yīng)用準(zhǔn)備的
image

Web應(yīng)用與Spring融合:

image

我們看看BeanFactory的生命周期:

image

接下來我們再看看ApplicationContext的生命周期:

image

初始化的過程都是比較長懈叹,我們可以分類來對其進(jìn)行解析:

  • Bean自身的方法:如調(diào)用 Bean 構(gòu)造函數(shù)實(shí)例化 Bean乖杠,調(diào)用 Setter 設(shè)置 Bean 的屬性值以及通過
  • Bean級生命周期接口方法:如 BeanNameAware、 BeanFactoryAware澄成、 InitializingBean 和 DisposableBean胧洒,這些接口方法由 Bean 類直接實(shí)現(xiàn);
  • 容器級生命周期接口方法:在上圖中帶“★” 的步驟是由 InstantiationAwareBean PostProcessor 和 BeanPostProcessor 這兩個接口實(shí)現(xiàn)墨状,一般稱它們的實(shí)現(xiàn)類為“ 后處理器” 卫漫。 后處理器接口一般不由 Bean 本身實(shí)現(xiàn),它們獨(dú)立于 Bean肾砂,實(shí)現(xiàn)類以容器附加裝置的形式注冊到Spring容器中并通過接口反射為Spring容器預(yù)先識別列赎。當(dāng)Spring 容器創(chuàng)建任何 Bean 的時候,這些后處理器都會發(fā)生作用镐确,所以這些后處理器的影響是全局性的包吝。當(dāng)然,用戶可以通過合理地編寫后處理器源葫,讓其僅對感興趣Bean 進(jìn)行加工處理

ApplicationContext和BeanFactory不同之處在于:

  • ApplicationContext會利用Java反射機(jī)制自動識別出配置文件中定義的BeanPostProcessor诗越、 InstantiationAwareBeanPostProcesso 和BeanFactoryPostProcessor后置器,并自動將它們注冊到應(yīng)用上下文中臼氨。而BeanFactory需要在代碼中通過手工調(diào)用addBeanPostProcessor()方法進(jìn)行注冊
  • ApplicationContext在初始化應(yīng)用上下文的時候就實(shí)例化所有單實(shí)例的Bean掺喻。而BeanFactory在初始化容器的時候并未實(shí)例化Bean,直到第一次訪問某個Bean時實(shí)例化目標(biāo)Bean。

有了上面的知識點(diǎn)了感耙,我們再來詳細(xì)地看看Bean的初始化過程:

image

簡要總結(jié):

  • BeanDefinitionReader讀取Resource所指向的配置文件資源褂乍,然后解析配置文件。配置文件中每一個<bean>解析成一個BeanDefinition對象即硼,并保存到BeanDefinitionRegistry中逃片;
  • 容器掃描BeanDefinitionRegistry中的BeanDefinition;調(diào)用InstantiationStrategy進(jìn)行Bean實(shí)例化的工作只酥;使用BeanWrapper完成Bean屬性的設(shè)置工作褥实;
  • 單例Bean緩存池:Spring 在DefaultSingletonBeanRegistry類中提供了一個用于緩存單實(shí)例 Bean 的緩存器,它是一個用HashMap實(shí)現(xiàn)的緩存器裂允,單實(shí)例的Bean以beanName為鍵保存在這個HashMap中损离。

1.3IOC容器裝配Bean

1.3.1裝配Bean方式

Spring4.x開始IOC容器裝配Bean有4種方式:

  • XML配置
  • 注解
  • JavaConfig
  • 基于Groovy DSL配置(這種很少見)

總的來說:我們以XML配置+注解來裝配Bean得多,其中注解這種方式占大部分绝编!

1.3.2依賴注入方式

依賴注入的方式有3種方式:

  • 屬性注入-->通過setter()方法注入
  • 構(gòu)造函數(shù)注入
  • 工廠方法注入

總的來說使用屬性注入是比較靈活和方便的僻澎,這是大多數(shù)人的選擇!

1.3.3對象之間關(guān)系

<bean>對象之間有三種關(guān)系:

  • 依賴-->挺少用的(使用depends-on就是依賴關(guān)系了-->前置依賴【依賴的Bean需要初始化之后十饥,當(dāng)前Bean才會初始化】)
  • 繼承-->可能會用到(指定abstract和parent來實(shí)現(xiàn)繼承關(guān)系)
  • 引用-->最常見(使用ref就是引用關(guān)系了)

1.3.4Bean的作用域

Bean的作用域:

  • 單例Singleton
  • 多例prototype
  • 與Web應(yīng)用環(huán)境相關(guān)的Bean作用域
    • reqeust
    • session

使用到了Web應(yīng)用環(huán)境相關(guān)的Bean作用域的話窟勃,是需要我們手動配置代理的~

image

原因也很簡單:因?yàn)槲覀兡J(rèn)的Bean是單例的,為了適配Web應(yīng)用環(huán)境相關(guān)的Bean作用域--->每個request都需要一個對象逗堵,此時我們返回一個代理對象出去就可以完成我們的需求了秉氧!

image

將Bean配置單例的時候還有一個問題:

  • 如果我們的Bean配置的是單例,而Bean對象里邊的成員對象我們希望是多例的話蜒秤。那怎么辦呢汁咏??
  • 默認(rèn)的情況下我們的Bean單例垦藏,返回的成員對象也默認(rèn)是單例的(因?yàn)閷ο缶椭挥心敲匆粋€)梆暖!

此時我們需要用到了lookup方法注入,使用也很簡單掂骏,看看例子就明白了:

image

1.3.6處理自動裝配的歧義性

昨天在刷書的時候剛好看到了有人在知乎邀請我回答這個問題:

image

結(jié)合兩本書的知識點(diǎn)轰驳,可以歸納成兩種解決方案:

  • 使用@Primary注解設(shè)置為首選的注入Bean
  • 使用@Qualifier注解設(shè)置特定名稱的Bean來限定注入!
    • 也可以使用自定義的注解來標(biāo)識

1.3.7引用屬性文件以及Bean屬性

之前在寫配置文件的時候都是直接將我們的數(shù)據(jù)庫配置信息在里面寫死的了:

image

其實(shí)我們有更優(yōu)雅的做法:將這些配置信息寫到配置文件上(因?yàn)檫@些配置信息很可能是會變的弟灼,而且有可能被多個配置文件引用).

  • 如此一來级解,我們改的時候就十分方便了。
image

引用配置文件的數(shù)據(jù)使用的是${}

除了引用配置文件上的數(shù)據(jù)田绑,我們還可以引用Bean的屬性

s3FrqCY.png
image

引用Bean的屬性使用的是#{}

在這種技術(shù)在《Spring 實(shí)戰(zhàn) 第四版》稱之為Spring EL勤哗,跟我們之前學(xué)過的EL表達(dá)式是類似的。主要的功能就是上面的那種掩驱,想要更深入了解可參考下面的鏈接:

1.3.8組合配置文件

xml文件之間組合:

image

xml和javaconfig互相組合的方式:


    public static void main(String[] args) {

        //1.通過構(gòu)造函數(shù)加載配置類
         ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class);

        //2.通過編碼方式注冊配置類
         AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
         ctx.register(DaoConfig.class);
         ctx.register(ServiceConfig.class);
         ctx.refresh();

        //3.通過XML組裝@Configuration配置類所提供的配置信息
         ApplicationContext ctx = new ClassPathXmlApplicationContext("com/smart/conf/beans2.xml");

        //4.通過@Configuration組裝XML配置所提供的配置信息
         ApplicationContext ctx = new AnnotationConfigApplicationContext(LogonAppConfig.class);

         //5.@Configuration的配置類相互引用
         ApplicationContext ctx = new AnnotationConfigApplicationContext(DaoConfig.class,ServiceConfig.class);
         LogonService logonService = ctx.getBean(LogonService.class);
         System.out.println((logonService.getLogDao() !=null));
         logonService.printHelllo();   
    }

第一種的例子:

image

第二種的例子:

image
image

第三種的例子:

image

第四種的例子:

btjHZOQ.png

第五種的例子:

  • 代碼由上可見

1.3.9裝配Bean總結(jié)

總的來說芒划,Spring IOC容器就是在創(chuàng)建Bean的時候有很多的方式給了我們實(shí)現(xiàn)冬竟,其中也包括了很多關(guān)于Bean的配置~

對于Bean相關(guān)的注入教程代碼和簡化配置(p和c名稱空間)我就不一一說明啦,你們?nèi)タ?a target="_blank" rel="nofollow">Spring入門這一篇就夠了和Spring【依賴注入】就是這么簡單就行了民逼。

總的對比圖:

image
image

分別的應(yīng)用場景:

image

至于一些小的知識點(diǎn):

  • 方法替換
    • 使用某個Bean的方法替換成另一個Bean的方法
  • 屬性編輯器
    • Spring可以對基本類型做轉(zhuǎn)換就歸結(jié)于屬性編輯器的功勞泵殴!
  • 國際化
    • 使用不同語言(英語、中文)的操作系統(tǒng)去顯式不同的語言
  • profile與條件化的Bean
    • 滿足了某個條件才初始化Bean拼苍,這可以方便切換生產(chǎn)環(huán)境和開發(fā)環(huán)境~
  • 容器事件
    • 類似于我們的Servlet的監(jiān)聽器笑诅,只不過它是在Spring中實(shí)現(xiàn)了~

上面這些小知識點(diǎn)比較少情況會用到,這也不去講解啦疮鲫。知道有這么一回事吆你,到時候查查就會用啦~~~

二、Spring IOC相關(guān)面試題

將SpringIOC相關(guān)知識點(diǎn)整理了一遍俊犯,要想知道哪些知識點(diǎn)是比較重要的妇多。很簡單,我們?nèi)フ艺蚁嚓P(guān)的面試題就知道了燕侠,如果該面試題是常見的砌梆,那么說明這個知識點(diǎn)還是相對比較重要的啦!

以下的面試題從各種博客上摘抄下來贬循,摘抄量較大的會注明出處的~

2.1什么是spring?

什么是spring?

Spring 是個java企業(yè)級應(yīng)用的開源開發(fā)框架。Spring主要用來開發(fā)Java應(yīng)用桃序,但是有些擴(kuò)展是針對構(gòu)建J2EE平臺的web應(yīng)用杖虾。Spring框架目標(biāo)是簡化Java企業(yè)級應(yīng)用開發(fā),并通過POJO為基礎(chǔ)的編程模型促進(jìn)良好的編程習(xí)慣媒熊。

2.2使用Spring框架的好處是什么奇适?

使用Spring框架的好處是什么?

  • 輕量:Spring 是輕量的芦鳍,基本的版本大約2MB嚷往。
  • 控制反轉(zhuǎn):Spring通過控制反轉(zhuǎn)實(shí)現(xiàn)了松散耦合,對象們給出它們的依賴柠衅,而不是創(chuàng)建或查找依賴的對象們皮仁。
  • 面向切面的編程(AOP):Spring支持面向切面的編程,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開菲宴。
  • 容器:Spring 包含并管理應(yīng)用中對象的生命周期和配置贷祈。
  • MVC框架:Spring的WEB框架是個精心設(shè)計的框架,是Web框架的一個很好的替代品喝峦。
  • 事務(wù)管理:Spring 提供一個持續(xù)的事務(wù)管理接口势誊,可以擴(kuò)展到上至本地事務(wù)下至全局事務(wù)(JTA)。
  • 異常處理:Spring 提供方便的API把具體技術(shù)相關(guān)的異常(比如由JDBC谣蠢,Hibernate or JDO拋出的)轉(zhuǎn)化為一致的unchecked 異常粟耻。

2.3Spring由哪些模塊組成?

Spring由哪些模塊組成?

簡單可以分成6大模塊:

  • Core
  • AOP
  • ORM
  • DAO
  • Web
  • Spring EE
image

2.4BeanFactory 實(shí)現(xiàn)舉例

BeanFactory 實(shí)現(xiàn)舉例

Bean工廠是工廠模式的一個實(shí)現(xiàn)查近,提供了控制反轉(zhuǎn)功能,用來把應(yīng)用的配置和依賴從正真的應(yīng)用代碼中分離挤忙。

在spring3.2之前最常用的是XmlBeanFactory的霜威,但現(xiàn)在被廢棄了,取而代之的是:XmlBeanDefinitionReader和DefaultListableBeanFactory

2.5什么是Spring的依賴注入饭玲?

什么是Spring的依賴注入侥祭?

依賴注入,是IOC的一個方面茄厘,是個通常的概念矮冬,它有多種解釋。這概念是說你不用創(chuàng)建對象次哈,而只需要描述它如何被創(chuàng)建胎署。你不在代碼里直接組裝你的組件和服務(wù),但是要在配置文件里描述哪些組件需要哪些服務(wù)窑滞,之后一個容器(IOC容器)負(fù)責(zé)把他們組裝起來琼牧。

2.6有哪些不同類型的IOC(依賴注入)方式?

有哪些不同類型的IOC(依賴注入)方式哀卫?

  • 構(gòu)造器依賴注入:構(gòu)造器依賴注入通過容器觸發(fā)一個類的構(gòu)造器來實(shí)現(xiàn)的巨坊,該類有一系列參數(shù),每個參數(shù)代表一個對其他類的依賴此改。
  • Setter方法注入:Setter方法注入是容器通過調(diào)用無參構(gòu)造器或無參static工廠 方法實(shí)例化bean之后趾撵,調(diào)用該bean的setter方法,即實(shí)現(xiàn)了基于setter的依賴注入共啃。
  • 工廠注入:這個是遺留下來的占调,很少用的了!

2.7哪種依賴注入方式你建議使用移剪,構(gòu)造器注入究珊,還是 Setter方法注入?

哪種依賴注入方式你建議使用纵苛,構(gòu)造器注入剿涮,還是 Setter方法注入?

你兩種依賴方式都可以使用赶站,構(gòu)造器注入和Setter方法注入幔虏。最好的解決方案是用構(gòu)造器參數(shù)實(shí)現(xiàn)強(qiáng)制依賴,setter方法實(shí)現(xiàn)可選依賴贝椿。

2.8什么是Spring beans?

什么是Spring beans?

Spring beans 是那些形成Spring應(yīng)用的主干的java對象想括。它們被Spring IOC容器初始化,裝配烙博,和管理瑟蜈。這些beans通過容器中配置的元數(shù)據(jù)創(chuàng)建烟逊。比如,以XML文件中<bean/>的形式定義铺根。

這里有四種重要的方法給Spring容器提供配置元數(shù)據(jù)宪躯。

  • XML配置文件。
  • 基于注解的配置位迂。
  • 基于java的配置访雪。
  • Groovy DSL配置

2.9解釋Spring框架中bean的生命周期

解釋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)聯(lián)的BeanPostProcessors锣杂,Spring會在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()方法朽基。

2.10解釋不同方式的自動裝配

解釋不同方式的自動裝配

  • no:默認(rèn)的方式是不進(jìn)行自動裝配,通過顯式設(shè)置ref 屬性來進(jìn)行裝配离陶。
  • byName:通過參數(shù)名 自動裝配稼虎,Spring容器在配置文件中發(fā)現(xiàn)bean的autowire屬性被設(shè)置成byname,之后容器試圖匹配招刨、裝配和該bean的屬性具有相同名字的bean霎俩。
  • byType::通過參數(shù)類型自動裝配,Spring容器在配置文件中發(fā)現(xiàn)bean的autowire屬性被設(shè)置成byType沉眶,之后容器試圖匹配打却、裝配和該bean的屬性具有相同類型的bean。如果有多個bean符合條件谎倔,則拋出錯誤柳击。
  • constructor:這個方式類似于byType, 但是要提供給構(gòu)造器參數(shù)片习,如果沒有確定的帶參數(shù)的構(gòu)造器參數(shù)類型捌肴,將會拋出異常蹬叭。
  • autodetect:首先嘗試使用constructor來自動裝配,如果無法工作状知,則使用byType方式秽五。

只用注解的方式時,注解默認(rèn)是使用byType的饥悴!

2.11IOC的優(yōu)點(diǎn)是什么坦喘?

IOC的優(yōu)點(diǎn)是什么?

IOC 或 依賴注入把應(yīng)用的代碼量降到最低西设。它使應(yīng)用容易測試瓣铣,單元測試不再需要單例和JNDI查找機(jī)制。最小的代價和最小的侵入性使松散耦合得以實(shí)現(xiàn)济榨。IOC容器支持加載服務(wù)時的餓漢式初始化和懶加載坯沪。

2.12哪些是重要的bean生命周期方法? 你能重載它們嗎擒滑?

哪些是重要的bean生命周期方法腐晾? 你能重載它們嗎?

有兩個重要的bean 生命周期方法丐一,第一個是setup藻糖, 它是在容器加載bean的時候被調(diào)用。第二個方法是 teardown 它是在容器卸載類的時候被調(diào)用库车。

The bean 標(biāo)簽有兩個重要的屬性(init-methoddestroy-method)巨柒。用它們你可以自己定制初始化和注銷方法。它們也有相應(yīng)的注解(@PostConstruct@PreDestroy)柠衍。

2.13怎么回答面試官:你對Spring的理解洋满?

怎么回答面試官:你對Spring的理解?

來源:

下面我就截幾個答案:

一珍坊、

image

二牺勾、

image

2.14Spring框架中的單例Beans是線程安全的么?

Spring框架中的單例Beans是線程安全的么阵漏?

Spring框架并沒有對單例bean進(jìn)行任何多線程的封裝處理驻民。關(guān)于單例bean的線程安全和并發(fā)問題需要開發(fā)者自行去搞定。但實(shí)際上履怯,大部分的Spring bean并沒有可變的狀態(tài)(比如Serview類和DAO類)回还,所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態(tài)的話(比如 View Model 對象)叹洲,就需要自行保證線程安全柠硕。

最淺顯的解決辦法就是將多態(tài)bean的作用域由“singleton”變更為“prototype”

2.15FileSystemResource和ClassPathResource有何區(qū)別?

FileSystemResource和ClassPathResource有何區(qū)別运提?

在FileSystemResource 中需要給出spring-config.xml文件在你項(xiàng)目中的相對路徑或者絕對路徑仅叫。在ClassPathResource中spring會在ClassPath中自動搜尋配置文件帜篇,所以要把ClassPathResource文件放在ClassPath下。

如果將spring-config.xml保存在了src文件夾下的話诫咱,只需給出配置文件的名稱即可笙隙,因?yàn)閟rc文件夾是默認(rèn)。

簡而言之坎缭,ClassPathResource在環(huán)境變量中讀取配置文件竟痰,F(xiàn)ileSystemResource在配置文件中讀取配置文件

三掏呼、總結(jié)

這篇文章的主要知識點(diǎn)我畫了一張思維導(dǎo)圖來總結(jié)啦坏快,當(dāng)學(xué)習(xí)到AOP的時候,這張思維導(dǎo)圖會繼續(xù)補(bǔ)充的哦~~~

Spring知識點(diǎn).png

參考資料:

如果文章有錯的地方歡迎指正憎夷,大家互相交流莽鸿。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué)拾给,可以關(guān)注微信公眾號:Java3y祥得。為了大家方便,剛新建了一下qq群:742919422蒋得,大家也可以去交流交流级及。謝謝支持了!希望能多介紹給其他有需要的朋友

文章的目錄導(dǎo)航

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末额衙,一起剝皮案震驚了整個濱河市饮焦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窍侧,老刑警劉巖县踢,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伟件,居然都是意外死亡殿雪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門锋爪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爸业,你說我怎么就攤上這事其骄。” “怎么了扯旷?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵拯爽,是天一觀的道長。 經(jīng)常有香客問我钧忽,道長毯炮,這世上最難降的妖魔是什么逼肯? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮桃煎,結(jié)果婚禮上篮幢,老公的妹妹穿的比我還像新娘。我一直安慰自己为迈,他們只是感情好三椿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葫辐,像睡著了一般搜锰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耿战,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天蛋叼,我揣著相機(jī)與錄音,去河邊找鬼剂陡。 笑死狈涮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹏倘。 我是一名探鬼主播薯嗤,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纤泵!你這毒婦竟也來了骆姐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤捏题,失蹤者是張志新(化名)和其女友劉穎玻褪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體公荧,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡带射,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了循狰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窟社。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绪钥,靈堂內(nèi)的尸體忽然破棺而出灿里,到底是詐尸還是另有隱情,我是刑警寧澤程腹,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布匣吊,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏色鸳。R本人自食惡果不足惜社痛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望命雀。 院中可真熱鬧蒜哀,春花似錦、人聲如沸咏雌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赊抖。三九已至统倒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氛雪,已是汗流浹背房匆。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留报亩,地道東北人浴鸿。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像弦追,于是被迫代替她去往敵國和親岳链。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345