Spring面試題集錦(精選)

以下來(lái)自網(wǎng)絡(luò)收集挠说,找不到原文出處澡谭。此次主要為了面試收集,希望對(duì)大家有所幫助~~~~

Spring面試題集錦(精選)

1.什么是Spring损俭?

Spring是一個(gè)開源的Java EE開發(fā)框架蛙奖。Spring框架的核心功能可以應(yīng)用在任何Java應(yīng)用程序中册倒,但對(duì)Java EE平臺(tái)上的Web應(yīng)用程序有更好的擴(kuò)展性健爬。Spring框架的目標(biāo)是使得Java EE應(yīng)用程序的開發(fā)更加簡(jiǎn)捷,通過(guò)使用POJO為基礎(chǔ)的編程模型促進(jìn)良好的編程風(fēng)格匙铡。

2.Spring有哪些優(yōu)點(diǎn)拧咳?

  • 輕量級(jí):Spring在大小和透明性方面絕對(duì)屬于輕量級(jí)的伯顶,基礎(chǔ)版本的Spring框架大約只有2MB。
  • 控制反轉(zhuǎn)(IOC):Spring使用控制反轉(zhuǎn)技術(shù)實(shí)現(xiàn)了松耦合。依賴被注入到對(duì)象祭衩,而不是創(chuàng)建或?qū)ふ乙蕾噷?duì)象灶体。
  • 面向切面編程(AOP): Spring支持面向切面編程,同時(shí)把應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)的服務(wù)分離開來(lái)掐暮。
  • 容器:Spring包含并管理應(yīng)用程序?qū)ο蟮呐渲眉吧芷凇?/li>
  • MVC框架:Spring的web框架是一個(gè)設(shè)計(jì)優(yōu)良的web MVC框架蝎抽,很好的取代了一些web框架。
  • 事務(wù)管理:Spring對(duì)下至本地業(yè)務(wù)上至全局業(yè)務(wù)(JAT)提供了統(tǒng)一的事務(wù)管理接口路克。
  • 異常處理:Spring提供一個(gè)方便的API將特定技術(shù)的異常(由JDBC, Hibernate, 或JDO拋出)轉(zhuǎn)化為一致的樟结、Unchecked異常。

3. Spring 事務(wù)實(shí)現(xiàn)方式有哪些精算?

  • 編程式事務(wù)管理:這意味著你可以通過(guò)編程的方式管理事務(wù)瓢宦,這種方式帶來(lái)了很大的靈活性,但很難維護(hù)灰羽。
  • 聲明式事務(wù)管理:這種方式意味著你可以將事務(wù)管理和業(yè)務(wù)代碼分離驮履。你只需要通過(guò)注解或者XML配置管理事務(wù)。

4.Spring框架的事務(wù)管理有哪些優(yōu)點(diǎn)廉嚼?

  • 它為不同的事務(wù)API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統(tǒng)一的編程模型玫镐。
  • 它為編程式事務(wù)管理提供了一個(gè)簡(jiǎn)單的API而非一系列復(fù)雜的事務(wù)API(如JTA). 它支持聲明式事務(wù)管理。
  • 它可以和Spring 的多種數(shù)據(jù)訪問(wèn)技術(shù)很好的融合怠噪。

5.spring事務(wù)定義的傳播規(guī)則

  • PROPAGATION_REQUIRED: 支持當(dāng)前事務(wù)恐似,如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)傍念。這是最常見的選擇蹂喻。
  • PROPAGATION_SUPPORTS: 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù)捂寿,就以非事務(wù)方式執(zhí)行口四。
  • PROPAGATION_MANDATORY: 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù)秦陋,就拋出異常蔓彩。
  • PROPAGATION_REQUIRES_NEW: 新建事務(wù),如果當(dāng)前存在事務(wù)驳概,把當(dāng)前事務(wù)掛起赤嚼。
  • PROPAGATION_NOT_SUPPORTED: 以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù)顺又,就把當(dāng)前事務(wù)掛起更卒。
  • PROPAGATION_NEVER: 以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù)稚照,則拋出異常蹂空。
  • PROPAGATION_NESTED:如果當(dāng)前存在事務(wù)俯萌,則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù)上枕,則進(jìn)行與PROPAGATION_REQUIRED類似的操作咐熙。

6.Spring 事務(wù)底層原理

  • 劃分處理單元——IoC

由于spring解決的問(wèn)題是對(duì)單個(gè)數(shù)據(jù)庫(kù)進(jìn)行局部事務(wù)處理的,具體的實(shí)現(xiàn)首先用spring中的IoC劃分了事務(wù)處理單元辨萍。并且將對(duì)事務(wù)的各種配置放到了ioc容器中(設(shè)置事務(wù)管理器棋恼,設(shè)置事務(wù)的傳播特性及隔離機(jī)制)。

  • AOP攔截需要進(jìn)行事務(wù)處理的類

Spring事務(wù)處理模塊是通過(guò)AOP功能來(lái)實(shí)現(xiàn)聲明式事務(wù)處理的锈玉,具體操作(比如事務(wù)實(shí)行的配置和讀取爪飘,事務(wù)對(duì)象的抽象),用TransactionProxyFactoryBean接口來(lái)使用AOP功能拉背,生成proxy代理對(duì)象师崎,通過(guò)TransactionInterceptor完成對(duì)代理方法的攔截,將事務(wù)處理的功能編織到攔截的方法中去团。讀取ioc容器事務(wù)配置屬性,轉(zhuǎn)化為spring事務(wù)處理需要的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(TransactionAttributeSourceAdvisor)穷蛹,轉(zhuǎn)化為TransactionAttribute表示的數(shù)據(jù)對(duì)象土陪。

  • 對(duì)事務(wù)處理實(shí)現(xiàn)(事務(wù)的生成、提交肴熏、回滾鬼雀、掛起)

spring委托給具體的事務(wù)處理器實(shí)現(xiàn)。實(shí)現(xiàn)了一個(gè)抽象和適配蛙吏。適配的具體事務(wù)處理器:DataSource數(shù)據(jù)源支持源哩、hibernate數(shù)據(jù)源事務(wù)處理支持、JDO數(shù)據(jù)源事務(wù)處理支持鸦做,JPA励烦、JTA數(shù)據(jù)源事務(wù)處理支持。這些支持都是通過(guò)設(shè)計(jì)PlatformTransactionManager泼诱、AbstractPlatforTransaction一系列事務(wù)處理的支持坛掠。 為常用數(shù)據(jù)源支持提供了一系列的TransactionManager。

  • 結(jié)合

PlatformTransactionManager實(shí)現(xiàn)了TransactionInterception接口治筒,讓其與TransactionProxyFactoryBean結(jié)合起來(lái)屉栓,形成一個(gè)Spring聲明式事務(wù)處理的設(shè)計(jì)體系。

7. Spring的單例實(shí)現(xiàn)原理

Spring框架對(duì)單例的支持是采用單例注冊(cè)表的方式進(jìn)行實(shí)現(xiàn)的耸袜,而這個(gè)注冊(cè)表的緩存是HashMap對(duì)象友多,如果配置文件中的配置信息不要求使用單例,Spring會(huì)采用新建實(shí)例的方式返回對(duì)象實(shí)例堤框。

8. 有哪些不同類型的IOC(依賴注入)域滥?

  • 構(gòu)造器依賴注入:構(gòu)造器依賴注入在容器觸發(fā)構(gòu)造器的時(shí)候完成纵柿,該構(gòu)造器有一系列的參數(shù),每個(gè)參數(shù)代表注入的對(duì)象骗绕。

  • Setter方法依賴注入:首先容器會(huì)觸發(fā)一個(gè)無(wú)參構(gòu)造函數(shù)或無(wú)參靜態(tài)工廠方法實(shí)例化對(duì)象藐窄,之后容器調(diào)用bean中的setter方法完成Setter方法依賴注入。

  • 注解注入:基于@Autowired的自動(dòng)裝配酬土,默認(rèn)是根據(jù)類型注入荆忍,可以用于構(gòu)造器、字段撤缴、方法注入刹枉。

9. 你推薦哪種依賴注入?構(gòu)造器依賴注入還是Setter方法依賴注入屈呕?

你可以同時(shí)使用兩種方式的依賴注入微宝,最好的選擇是使用構(gòu)造器參數(shù)實(shí)現(xiàn)強(qiáng)制依賴注入,使用setter方法實(shí)現(xiàn)可選的依賴關(guān)系虎眨。

10.簡(jiǎn)述一下Spring框架蟋软?

概念

  • Spring致力于Java EE應(yīng)用的各種解決方案,是一款輕量級(jí)框架嗽桩,大大簡(jiǎn)化了Java企業(yè)級(jí)開發(fā)岳守,提供了強(qiáng)大、穩(wěn)定的功能碌冶。
  • Spring主要有兩個(gè)目標(biāo):一是讓先有技術(shù)更易于使用湿痢,二是促進(jìn)良好的編程習(xí)慣(或者稱為最佳實(shí)踐)

優(yōu)點(diǎn)

  • 輕量級(jí):Spring在大小和透明性方面絕對(duì)屬于輕量級(jí)的,基礎(chǔ)版本的Spring框架大約只有2MB

  • 控制反轉(zhuǎn)(IOC):Spring使用控制反轉(zhuǎn)技術(shù)實(shí)現(xiàn)了松耦合扑庞。依賴被注入到對(duì)象譬重,而不是創(chuàng)建或?qū)ふ乙蕾噷?duì)象。

  • 方便解耦罐氨,簡(jiǎn)化開發(fā):Spring就是一個(gè)大工廠臀规,可以將所有對(duì)象創(chuàng)建和依賴關(guān)系維護(hù),交給Spring管理

  • AOP編程的支持:Spring提供面向切面編程栅隐,可以方便的實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截以现、運(yùn)行監(jiān)控等功能

  • 聲明式事務(wù)的支持:只需要通過(guò)配置就可以完成對(duì)事務(wù)的管理,而無(wú)需手動(dòng)編程

  • 方便集成各種優(yōu)秀框架:Spring不排斥各種優(yōu)秀的開源框架约啊,其內(nèi)部提供了對(duì)各種優(yōu)秀框架(如:Struts2邑遏、Hibernate、MyBatis恰矩、Quartz等)的直接支持

  • 降低JavaEE API的使用難度:Spring 對(duì)JavaEE開發(fā)中非常難用的一些API(JDBC记盒、JavaMail、遠(yuǎn)程調(diào)用等)外傅,都提供了封裝纪吮,使這些API應(yīng)用難度大大降低

11.簡(jiǎn)單介紹一下Spring七大模塊俩檬?

  • Spring Core:Core封裝包是框架的最基礎(chǔ)部分,提供IOC和依賴注入特性碾盟。這里的基礎(chǔ)概念是BeanFactory棚辽,它提供對(duì)Factory模式的經(jīng)典實(shí)現(xiàn)來(lái)消除對(duì)程序性單例模式的需要,并真正地允許你從程序邏輯中分離出依賴關(guān)系和配置冰肴。

  • Spring Context:構(gòu)建于Core封裝包基礎(chǔ)上的 Context封裝包屈藐,提供了一種框架式的對(duì)象訪問(wèn)方法,有些象JNDI注冊(cè)器熙尉。Context封裝包的特性得自于Beans封裝包联逻,并添加了對(duì)國(guó)際化(I18N)的支持(例如資源綁定),事件傳播检痰,資源裝載的方式和Context的透明創(chuàng)建包归,比如說(shuō)通過(guò)Servlet容器。

  • Spring DAO:DAO (Data Access Object)提供了JDBC的抽象層铅歼,它可消除冗長(zhǎng)的JDBC編碼和解析數(shù)據(jù)庫(kù)廠商特有的錯(cuò)誤代碼公壤。 并且,JDBC封裝包還提供了一種比編程性更好的聲明性事務(wù)管理方法椎椰,不僅僅是實(shí)現(xiàn)了特定接口厦幅,而且對(duì)所有的POJOs(plain old Java objects)都適用。

  • Spring ORM:ORM 封裝包提供了常用的“對(duì)象/關(guān)系”映射APIs的集成層俭识。 其中包括JPA慨削、JDO洞渔、Hibernate 和 iBatis 套媚。利用ORM封裝包,可以混合使用所有Spring提供的特性進(jìn)行“對(duì)象/關(guān)系”映射磁椒,如前邊提到的簡(jiǎn)單聲明性事務(wù)管理堤瘤。

  • Spring AOP:Spring的 AOP 封裝包提供了符合AOP Alliance規(guī)范的面向方面的編程實(shí)現(xiàn),讓你可以定義浆熔,例如方法攔截器(method-interceptors)和切點(diǎn)(pointcuts)本辐,從邏輯上講,從而減弱代碼的功能耦合医增,清晰的被分離開慎皱。而且,利用source-level的元數(shù)據(jù)功能叶骨,還可以將各種行為信息合并到你的代碼中茫多。

  • Spring Web:Spring中的 Web 包提供了基礎(chǔ)的針對(duì)Web開發(fā)的集成特性,例如多方文件上傳忽刽,利用Servlet listeners進(jìn)行IOC容器初始化和針對(duì)Web的ApplicationContext天揖。當(dāng)與WebWork或Struts一起使用Spring時(shí)夺欲,這個(gè)包使Spring可與其他框架結(jié)合。

  • Spring Web MVC:Spring中的MVC封裝包提供了Web應(yīng)用的Model-View-Controller(MVC)實(shí)現(xiàn)今膊。Spring的MVC框架并不是僅僅提供一種傳統(tǒng)的實(shí)現(xiàn)些阅,它提供了一種清晰的分離模型,在領(lǐng)域模型代碼和Web Form之間斑唬。并且市埋,還可以借助Spring框架的其他特性。

12. Spring中的設(shè)計(jì)模式

spring中常用的設(shè)計(jì)模式達(dá)到九種赖钞,我們舉例說(shuō)明:

第一種:簡(jiǎn)單工廠

又叫做靜態(tài)工廠方法(StaticFactory Method)模式腰素,但不屬于23種GOF設(shè)計(jì)模式之一。 簡(jiǎn)單工廠模式的實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù)雪营,動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類弓千。 spring中的BeanFactory就是簡(jiǎn)單工廠模式的體現(xiàn),根據(jù)傳入一個(gè)唯一的標(biāo)識(shí)來(lái)獲得bean對(duì)象献起,但是否是在傳入?yún)?shù)后創(chuàng)建還是傳入?yún)?shù)前創(chuàng)建這個(gè)要根據(jù)具體情況來(lái)定洋访。

第二種:工廠方法(Factory Method)

通常由應(yīng)用程序直接使用new創(chuàng)建新的對(duì)象,為了將對(duì)象的創(chuàng)建和使用相分離谴餐,采用工廠模式,即應(yīng)用程序?qū)?duì)象的創(chuàng)建及初始化職責(zé)交給工廠對(duì)象姻政。一般情況下,應(yīng)用程序有自己的工廠對(duì)象來(lái)創(chuàng)建bean.如果將應(yīng)用程序自己的工廠對(duì)象交給Spring管理,那么Spring管理的就不是普通的bean,而是工廠Bean。

第三種:?jiǎn)卫J剑⊿ingleton)

保證一個(gè)類僅有一個(gè)實(shí)例岂嗓,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)汁展。
spring中的單例模式完成了后半句話,即提供了全局的訪問(wèn)點(diǎn)BeanFactory厌殉。但沒有從構(gòu)造器級(jí)別去控制單例食绿,這是因?yàn)閟pring管理的是是任意的java對(duì)象。

第四種:適配器(Adapter)

在Spring的Aop中公罕,使用的Advice(通知)來(lái)增強(qiáng)被代理類的功能器紧。Spring實(shí)現(xiàn)這一AOP功能的原理就使用代理模式(1、JDK動(dòng)態(tài)代理楼眷。2铲汪、CGLib字節(jié)碼生成技術(shù)代理。)對(duì)類進(jìn)行方法級(jí)別的切面增強(qiáng)罐柳,即掌腰,生成被代理類的代理類, 并在代理類的方法前张吉,設(shè)置攔截器齿梁,通過(guò)執(zhí)行攔截器重的內(nèi)容增強(qiáng)了代理方法的功能,實(shí)現(xiàn)的面向切面編程芦拿。

第五種:包裝器(Decorator)

在我們的項(xiàng)目中遇到這樣一個(gè)問(wèn)題:我們的項(xiàng)目需要連接多個(gè)數(shù)據(jù)庫(kù)士飒,而且不同的客戶在每次訪問(wèn)中根據(jù)需要會(huì)去訪問(wèn)不同的數(shù)據(jù)庫(kù)查邢。我們以往在spring和hibernate框架中總是配置一個(gè)數(shù)據(jù)源,因而sessionFactory的dataSource屬性總是指向這個(gè)數(shù)據(jù)源并且恒定不變酵幕,所有DAO在使用sessionFactory的時(shí)候都是通過(guò)這個(gè)數(shù)據(jù)源訪問(wèn)數(shù)據(jù)庫(kù)扰藕。但是現(xiàn)在,由于項(xiàng)目的需要芳撒,我們的DAO在訪問(wèn)sessionFactory的時(shí)候都不得不在多個(gè)數(shù)據(jù)源中不斷切換邓深,問(wèn)題就出現(xiàn)了:如何讓sessionFactory在執(zhí)行數(shù)據(jù)持久化的時(shí)候,根據(jù)客戶的需求能夠動(dòng)態(tài)切換不同的數(shù)據(jù)源笔刹?我們能不能在spring的框架下通過(guò)少量修改得到解決芥备?是否有什么設(shè)計(jì)模式可以利用呢? 首先想到在spring的applicationContext中配置所有的dataSource舌菜。這些dataSource可能是各種不同類型的萌壳,比如不同的數(shù)據(jù)庫(kù):Oracle、SQL Server日月、MySQL等袱瓮,也可能是不同的數(shù)據(jù)源:比如apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等爱咬。然后sessionFactory根據(jù)客戶的每次請(qǐng)求尺借,將dataSource屬性設(shè)置成不同的數(shù)據(jù)源,以到達(dá)切換數(shù)據(jù)源的目的精拟。
spring中用到的包裝器模式在類名上有兩種表現(xiàn):一種是類名中含有Wrapper燎斩,另一種是類名中含有Decorator》湟铮基本上都是動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)栅表。

第六種:代理(Proxy)

為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。 從結(jié)構(gòu)上來(lái)看和Decorator模式類似荡碾,但Proxy是控制谨读,更像是一種對(duì)功能的限制局装,而Decorator是增加職責(zé)坛吁。
spring的Proxy模式在aop中有體現(xiàn),比如JdkDynamicAopProxy和Cglib2AopProxy铐尚。

第七種:觀察者(Observer)

定義對(duì)象間的一種一對(duì)多的依賴關(guān)系拨脉,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新宣增。
spring中Observer模式常用的地方是listener的實(shí)現(xiàn)玫膀。如ApplicationListener。

第八種:策略(Strategy)

定義一系列的算法爹脾,把它們一個(gè)個(gè)封裝起來(lái)帖旨,并且使它們可相互替換箕昭。本模式使得算法可獨(dú)立于使用它的客戶而變化。

第九種:模板方法(Template Method)

定義一個(gè)操作中的算法的骨架解阅,而將一些步驟延遲到子類中落竹。Template Method使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
Template Method模式一般是需要繼承的货抄。這里想要探討另一種對(duì)Template Method的理解述召。spring中的JdbcTemplate,在用這個(gè)類時(shí)并不想去繼承這個(gè)類蟹地,因?yàn)檫@個(gè)類的方法太多积暖,但是我們還是想用到JdbcTemplate已有的穩(wěn)定的、公用的數(shù)據(jù)庫(kù)連接怪与,那么我們?cè)趺崔k呢夺刑?我們可以把變化的東西抽出來(lái)作為一個(gè)參數(shù)傳入JdbcTemplate的方法中。但是變化的東西是一段代碼分别,而且這段代碼會(huì)用到JdbcTemplate中的變量性誉。怎么辦?那我們就用回調(diào)對(duì)象吧茎杂。在這個(gè)回調(diào)對(duì)象中定義一個(gè)操縱JdbcTemplate中變量的方法错览,我們?nèi)?shí)現(xiàn)這個(gè)方法,就把變化的東西集中到這里了煌往。然后我們?cè)賯魅脒@個(gè)回調(diào)對(duì)象到JdbcTemplate倾哺,從而完成了調(diào)用。這可能是Template Method不需要繼承的另一種實(shí)現(xiàn)方式吧刽脖。

13.ApplicationContext與BeanFactory的區(qū)別

兩者都是通過(guò)xml配置文件加載bean,ApplicationContextBeanFacotry相比,提供了更多的擴(kuò)展功能羞海,但其主要區(qū)別在于后者是延遲加載,如果Bean的某一個(gè)屬性沒有注入,BeanFacotry加載后曲管,直至第一次使用調(diào)用getBean方法才會(huì)拋出異常却邓;而ApplicationContext則在初始化自身是檢驗(yàn),這樣有利于檢查所依賴屬性是否注入院水;所以通常情況下我們選擇使用ApplicationContext腊徙。

BeanFactroy采用的是延遲加載形式來(lái)注入Bean的,即只有在使用到某個(gè)Bean時(shí)(調(diào)用getBean())檬某,才對(duì)該Bean進(jìn)行加載實(shí)例化撬腾,這樣,我們就不能發(fā)現(xiàn)一些存在的Spring的配置問(wèn)題恢恼。而ApplicationContext則相反民傻,它是在容器啟動(dòng)時(shí),一次性創(chuàng)建了所有的Bean。這樣漓踢,在容器啟動(dòng)時(shí)牵署,我們就可以發(fā)現(xiàn)Spring中存在的配置錯(cuò)誤。

BeanFactoryApplicationContext都支持BeanPostProcessor喧半、BeanFactoryPostProcessor的使用碟刺,但兩者之間的區(qū)別是:BeanFactory需要手動(dòng)注冊(cè),而ApplicationContext則是自動(dòng)注冊(cè)

14. 如何理解IoC和DI薯酝?

IOC:
IOC就是控制反轉(zhuǎn)半沽,通俗的說(shuō)就是我們不用自己創(chuàng)建實(shí)例對(duì)象,這些都交給Spring的bean工廠幫我們創(chuàng)建管理吴菠。這也是Spring的核心思想者填,通過(guò)面向接口編程的方式來(lái)是實(shí)現(xiàn)對(duì)業(yè)務(wù)組件的動(dòng)態(tài)依賴。這就意味著IOC是Spring針對(duì)解決程序耦合而存在的做葵。在實(shí)際應(yīng)用中占哟,Spring通過(guò)配置文件(xml或者properties)指定需要實(shí)例化的java類(類名的完整字符串),包括這些java類的一組初始化值酿矢,通過(guò)加載讀取配置文件榨乎,用Spring提供的方法(getBean())就可以獲取到我們想要的根據(jù)指定配置進(jìn)行初始化的實(shí)例對(duì)象。

  • 優(yōu)點(diǎn):IOC或依賴注入減少了應(yīng)用程序的代碼量瘫筐。它使得應(yīng)用程序的測(cè)試很簡(jiǎn)單蜜暑,因?yàn)樵趩卧獪y(cè)試中不再需要單例或JNDI查找機(jī)制。簡(jiǎn)單的實(shí)現(xiàn)以及較少的干擾機(jī)制使得松耦合得以實(shí)現(xiàn)策肝。IOC容器支持勤性單例及延遲加載服務(wù)肛捍。

** DI:DI—Dependency** Injection,即“依賴注入”:組件之間依賴關(guān)系由容器在運(yùn)行期決定之众,形象的說(shuō)拙毫,即由容器動(dòng)態(tài)的將某個(gè)依賴關(guān)系注入到組件之中。依賴注入的目的并非為軟件系統(tǒng)帶來(lái)更多功能棺禾,而是為了提升組件重用的頻率缀蹄,并為系統(tǒng)搭建一個(gè)靈活、可擴(kuò)展的平臺(tái)膘婶。通過(guò)依賴注入機(jī)制缺前,我們只需要通過(guò)簡(jiǎn)單的配置,而無(wú)需任何代碼就可指定目標(biāo)需要的資源竣付,完成自身的業(yè)務(wù)邏輯诡延,而不需要關(guān)心具體的資源來(lái)自何處滞欠,由誰(shuí)實(shí)現(xiàn)古胆。

15.介紹一下AOP相關(guān)術(shù)語(yǔ)?

  • 切面(Aspect):被抽取的公共模塊,可能會(huì)橫切多個(gè)對(duì)象逸绎。 在Spring AOP中惹恃,切面可以使用通用類(基于模式的風(fēng)格) 或者在普通類中以 @AspectJ 注解來(lái)實(shí)現(xiàn)。

  • 連接點(diǎn)(Join point):指方法棺牧,在Spring AOP中巫糙,一個(gè)連接點(diǎn) 總是 代表一個(gè)方法的執(zhí)行。

  • 通知(Advice):在切面的某個(gè)特定的連接點(diǎn)(Join point)上執(zhí)行的動(dòng)作颊乘。通知有各種類型参淹,其中包括“around”、“before”和“after”等通知乏悄。許多AOP框架浙值,包括Spring,都是以攔截器做通知模型檩小, 并維護(hù)一個(gè)以連接點(diǎn)為中心的攔截器鏈开呐。

  • 切入點(diǎn)(Pointcut):切入點(diǎn)是指 我們要對(duì)哪些Join point進(jìn)行攔截的定義。通過(guò)切入點(diǎn)表達(dá)式规求,指定攔截的方法筐付,比如指定攔截add、search阻肿。

  • 引入(Introduction):(也被稱為內(nèi)部類型聲明(inter-type declaration))瓦戚。聲明額外的方法或者某個(gè)類型的字段。Spring允許引入新的接口(以及一個(gè)對(duì)應(yīng)的實(shí)現(xiàn))到任何被代理的對(duì)象丛塌。例如伤极,你可以使用一個(gè)引入來(lái)使bean實(shí)現(xiàn) IsModified 接口,以便簡(jiǎn)化緩存機(jī)制姨伤。

  • 目標(biāo)對(duì)象(Target Object): 被一個(gè)或者多個(gè)切面(aspect)所通知(advise)的對(duì)象哨坪。也有人把它叫做 被通知(adviced) 對(duì)象。 既然Spring AOP是通過(guò)運(yùn)行時(shí)代理實(shí)現(xiàn)的乍楚,這個(gè)對(duì)象永遠(yuǎn)是一個(gè) 被代理(proxied) 對(duì)象当编。

  • 織入(Weaving):指把增強(qiáng)應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理對(duì)象的過(guò)程。Spring是在運(yùn)行時(shí)完成織入徒溪。

切入點(diǎn)(pointcut)和連接點(diǎn)(join point)匹配的概念是AOP的關(guān)鍵忿偷,這使得AOP不同于其它僅僅提供攔截功能的舊技術(shù)。 切入點(diǎn)使得定位通知(advice)可獨(dú)立于OO層次臊泌。 例如鲤桥,一個(gè)提供聲明式事務(wù)管理的around通知可以被應(yīng)用到一組橫跨多個(gè)對(duì)象中的方法上(例如服務(wù)層的所有業(yè)務(wù)操作)。

AOP相關(guān)術(shù)語(yǔ)

16.你是如何理解Spring AOP渠概?

概念

面向切面編程茶凳。AOP是OOP的延續(xù)嫂拴,是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容贮喧,利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離筒狠,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性箱沦,同時(shí)提高了開發(fā)的效率辩恼。

核心思想
可以在不修改源代碼的前提下,對(duì)程序進(jìn)行增強(qiáng)

實(shí)現(xiàn)原理
Spring框架的AOP技術(shù)底層也是采用的代理技術(shù)谓形,所謂的動(dòng)態(tài)代理就是說(shuō) AOP 框架不會(huì)去修改字節(jié)碼灶伊,而是在內(nèi)存中臨時(shí)為方法生成一個(gè) AOP 對(duì)象,這個(gè) AOP 對(duì)象包含了目標(biāo)對(duì)象的全部方法寒跳,并且在特定的切點(diǎn)做了增強(qiáng)處理谁帕,并回調(diào)原對(duì)象的方法 。Spring AOP 中的動(dòng)態(tài)代理主要有兩種方式冯袍, JDK 動(dòng)態(tài)代理和 CGLIB 動(dòng)態(tài)代理 匈挖。

  • JDK 動(dòng)態(tài)代理:通過(guò)反射來(lái)接收被代理的類,并且要求被代理的類必須實(shí)現(xiàn)一個(gè)接口 康愤。JDK 動(dòng)態(tài)代理的核心是 InvocationHandler 接口和 Proxy 類 儡循。

  • CGLIB動(dòng)態(tài)代理: 如果目標(biāo)類沒有實(shí)現(xiàn)接口,那么 Spring AOP 會(huì)選擇使用 CGLIB 來(lái)動(dòng)態(tài)代理目標(biāo)類 征冷。CGLIB ( Code Generation Library )择膝,是一個(gè)代碼生成的類庫(kù),可以在運(yùn)行時(shí)動(dòng)態(tài)的生成某個(gè)類的子類检激,注意肴捉, CGLIB 是通過(guò)繼承的方式做的動(dòng)態(tài)代理,因此如果某個(gè)類被標(biāo)記為 final 叔收,那么它是無(wú)法使用 CGLIB 做動(dòng)態(tài)代理的齿穗。

17. Spring中有哪些增強(qiáng)處理,區(qū)別饺律?

  • 前置增強(qiáng):org.springframework.aop.BeforeAdvice代表前置增強(qiáng)窃页,表示在目標(biāo)方法整形前實(shí)施增強(qiáng)
  • 后置增強(qiáng):org.springframework.aop.AfterReturningAdvice代表后置增強(qiáng),表示在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng)
  • 環(huán)繞增強(qiáng):org.springframework.aop.MethodInterceptor代表環(huán)繞增強(qiáng)复濒,表示在目標(biāo)方法執(zhí)行前后實(shí)施增強(qiáng)
  • 異常拋出增強(qiáng) :org.springframework.aop.ThrowsAdvice代表拋出異常增強(qiáng)脖卖,表示在目標(biāo)方法拋出異常后實(shí)施增強(qiáng)
  • 引介增強(qiáng):org.springframework.aop.IntroductionInterceptor代表引介增強(qiáng),表示在目標(biāo)類中添加一些新的方法和屬性

18. Spring中支持的Bean作用域有哪些巧颈?

支持如下五種不同的作用域

  • Singleton(默認(rèn)):在Spring IOC容器中僅存在一個(gè)Bean實(shí)例畦木,Bean以單實(shí)例的方式存在。
  • Prototype:一個(gè)bean可以定義多個(gè)實(shí)例
  • Request:每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean砸泛。該作用域僅適用于WebApplicationContext環(huán)境十籍。
  • Session:一個(gè)HTTP Session定義一個(gè)Bean蛆封。該作用域僅適用于WebApplicationContext環(huán)境.
  • GolbalSession:同一個(gè)全局HTTP Session定義一個(gè)Bean。該作用域同樣僅適用于WebApplicationContext環(huán)境.

19.如何定義bean的作用域妓雾?

Spring中創(chuàng)建一個(gè)bean的時(shí)候娶吞,我們可以聲明它的作用域垒迂。只需要在bean定義的時(shí)候通過(guò)scope屬性定義即可械姻。例如,當(dāng)Spring需要產(chǎn)生每次一個(gè)新的bean實(shí)例時(shí)机断,應(yīng)該聲明beanscope屬性為prototype楷拳。如果每次你希望Spring返回一個(gè)實(shí)例,應(yīng)該聲明beanscope屬性為singleton吏奸。

20.說(shuō)一說(shuō)Spring框架中的bean的生命周期欢揖?

  • Spring容器讀取XML文件中bean的定義并實(shí)例化bean。
  • Spring根據(jù)bean的定義設(shè)置屬性值奋蔚。
  • 如果該Bean實(shí)現(xiàn)了BeanNameAware接口她混,Spring將bean的id傳遞給setBeanName()方法。
  • 如果該Bean實(shí)現(xiàn)了BeanFactoryAware接口泊碑,Spring將beanfactory傳遞給setBeanFactory()方法坤按。
  • 如果任何bean BeanPostProcessors 和該bean相關(guān),Spring調(diào)用postProcessBeforeInitialization()方法馒过。
  • 如果該Bean實(shí)現(xiàn)了InitializingBean接口臭脓,調(diào)用Bean中的afterPropertiesSet方法。如果bean有初始化函數(shù)聲明腹忽,調(diào)用相應(yīng)的初始化方法来累。
  • 如果任何bean BeanPostProcessors 和該bean相關(guān),調(diào)用postProcessAfterInitialization()方法窘奏。
  • 如果該bean實(shí)現(xiàn)了DisposableBean嘹锁,調(diào)用destroy()方法。

21.哪些是最重要的bean生命周期方法着裹,是否能重寫它們兼耀?

有兩個(gè)重要的bean生命周期方法。

  • 第一個(gè)是setup方法求冷,該方法在容器加載bean的時(shí)候被調(diào)用瘤运。
  • 第二個(gè)是teardown方法,該方法在bean從容器中移除的時(shí)候調(diào)用匠题。
    bean標(biāo)簽有兩個(gè)重要的屬性(init-method 和 destroy-method)拯坟,你可以通過(guò)這兩個(gè)屬性定義自己的初始化方法和析構(gòu)方法。
    Spring也有相應(yīng)的注解:@PostConstruct@PreDestroy韭山。

22.有幾種不同類型的自動(dòng)代理郁季?

BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying

23. 什么是Spring的內(nèi)部bean冷溃?

當(dāng)一個(gè)bean僅被用作另一個(gè)bean的屬性時(shí),它能被聲明為一個(gè)內(nèi)部bean梦裂,為了定義inner bean似枕,在Spring 的 基于XML的 配置元數(shù)據(jù)中,可以在 或 元素內(nèi)使用 元素年柠,內(nèi)部bean通常是匿名的凿歼,它們的Scope一般是prototype。

24. Spring中自動(dòng)裝配的方式有哪些冗恨?

  • no:不進(jìn)行自動(dòng)裝配答憔,手動(dòng)設(shè)置Bean的依賴關(guān)系。
  • byName:根據(jù)Bean的名字進(jìn)行自動(dòng)裝配掀抹。
  • byType:根據(jù)Bean的類型進(jìn)行自動(dòng)裝配虐拓。
  • constructor:類似于byType,不過(guò)是應(yīng)用于構(gòu)造器的參數(shù)傲武,如果正好有一個(gè)Bean與構(gòu)造器的參數(shù)類型相同則可以自動(dòng)裝配蓉驹,否則會(huì)導(dǎo)致錯(cuò)誤。
  • autodetect:如果有默認(rèn)的構(gòu)造器揪利,則通過(guò)constructor的方式進(jìn)行自動(dòng)裝配态兴,否則使用byType的方式進(jìn)行自動(dòng)裝配。

說(shuō)明:自動(dòng)裝配沒有自定義裝配方式那么精確土童,而且不能自動(dòng)裝配簡(jiǎn)單屬性(基本類型诗茎、字符串等),在使用時(shí)應(yīng)注意献汗。

25.你可以在Spring中注入null或空字符串嗎敢订?

完全可以。

26. 不同版本的 Spring Framework 有哪些主要功能罢吃?

Version Feature
Spring 2.5 發(fā)布于 2007 年楚午。這是第一個(gè)支持注解的版本。
Spring 3 發(fā)布于 2009 年尿招。它完全利用了 Java5 中的改進(jìn)矾柜,并為 JEE6 提供了支持。
Spring 4.0 發(fā)布于 2013 年就谜。這是第一個(gè)完全支持 JAVA8 的版本怪蔑。。

27.spring DAO 有什么用丧荐?

Spring DAO 使得 JDBC缆瓣,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問(wèn)技術(shù)更容易以一種統(tǒng)一的方式工作。這使得用戶容易在持久性技術(shù)之間切換虹统。它還允許您在編寫代碼時(shí)弓坞,無(wú)需考慮捕獲每種技術(shù)不同的異常隧甚。

28. 列舉 Spring DAO 拋出的異常。

spring-data-access-exception

29. spring JDBC API 中存在哪些類渡冻?

  • JdbcTemplate
  • SimpleJdbcTemplate
  • NamedParameterJdbcTemplate
  • SimpleJdbcInsert
  • SimpleJdbcCall

30.Spring AOP and AspectJ AOP 有什么區(qū)別戚扳?

Spring AOP 基于動(dòng)態(tài)代理方式實(shí)現(xiàn);AspectJ 基于靜態(tài)代理方式實(shí)現(xiàn)族吻。
Spring AOP 僅支持方法級(jí)別的 PointCut帽借;提供了完全的 AOP 支持,它還支持屬性級(jí)別的 PointCut呼奢。

推薦

大廠筆試內(nèi)容集合(內(nèi)有詳細(xì)解析) 持續(xù)更新中....

ProcessOn是一個(gè)在線作圖工具的聚合平臺(tái)~

文末

歡迎關(guān)注個(gè)人微信公眾號(hào):Coder編程
歡迎關(guān)注Coder編程公眾號(hào)宜雀,主要分享數(shù)據(jù)結(jié)構(gòu)與算法切平、Java相關(guān)知識(shí)體系握础、框架知識(shí)及原理、Spring全家桶悴品、微服務(wù)項(xiàng)目實(shí)戰(zhàn)禀综、DevOps實(shí)踐之路、每日一篇互聯(lián)網(wǎng)大廠面試或筆試題以及PMP項(xiàng)目管理知識(shí)等苔严。更多精彩內(nèi)容正在路上~
新建了一個(gè)qq群:315211365定枷,歡迎大家進(jìn)群交流一起學(xué)習(xí)。謝謝了届氢!也可以介紹給身邊有需要的朋友欠窒。

文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關(guān)注并star~

微信公眾號(hào)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市退子,隨后出現(xiàn)的幾起案子岖妄,更是在濱河造成了極大的恐慌,老刑警劉巖寂祥,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荐虐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡丸凭,警方通過(guò)查閱死者的電腦和手機(jī)福扬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惜犀,“玉大人铛碑,你說(shuō)我怎么就攤上這事∷浣纾” “怎么了汽烦?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)浓恳。 經(jīng)常有香客問(wèn)我刹缝,道長(zhǎng)碗暗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任梢夯,我火速辦了婚禮言疗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颂砸。我一直安慰自己噪奄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布人乓。 她就那樣靜靜地躺著勤篮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪色罚。 梳的紋絲不亂的頭發(fā)上碰缔,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音戳护,去河邊找鬼金抡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腌且,可吹牛的內(nèi)容都是我干的梗肝。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鼻百?” 一聲冷哼從身側(cè)響起涌萤,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡什黑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堪夭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愕把。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖森爽,靈堂內(nèi)的尸體忽然破棺而出恨豁,到底是詐尸還是另有隱情,我是刑警寧澤爬迟,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布橘蜜,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏计福。R本人自食惡果不足惜跌捆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望象颖。 院中可真熱鬧佩厚,春花似錦、人聲如沸说订。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)陶冷。三九已至钙姊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埂伦,已是汗流浹背煞额。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赤屋,地道東北人立镶。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓壁袄,卻偏偏與公主長(zhǎng)得像类早,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗜逻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容