以下來(lái)自網(wǎng)絡(luò)收集挠说,找不到原文出處澡谭。此次主要為了面試收集,希望對(duì)大家有所幫助~~~~
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,ApplicationContext
和BeanFacotry
相比,提供了更多的擴(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ò)誤。
BeanFactory
和ApplicationContext
都支持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ù)操作)。
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)該聲明bean
的scope
屬性為prototype
楷拳。如果每次你希望Spring
返回一個(gè)實(shí)例,應(yīng)該聲明bean
的scope
屬性為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~