spring 常見面試題(附答案)

1、什么是spring、為什么要用spring及其優(yōu)點、spring有哪些模塊組成 ?
什么是spring
Spring 是個Java企業(yè)級應用的開源開發(fā)框架。Spring主要用來開發(fā)Java應用,但是有些擴展是針對構建J2EE平臺的web應用。Spring 框架目標是簡化Java企業(yè)級應用開發(fā),它使得開發(fā)者只需要關心業(yè)務需求。
spring優(yōu)點
- spring屬于低侵入式設計,代碼的污染極低;
- spring的DI機制將對象之間的依賴關系交由框架處理,減低組件的耦合性;
- Spring提供了AOP技術,支持將一些通用任務,如安全、事務、日志、權限等進行集中式管理,從而提供更好的復用。
- spring對于主流的應用框架提供了集成支持。
spring有哪些模塊組成
- Spring Core:核心類庫,提供IOC服務;
- Spring Context:提供框架式的Bean訪問方式,以及企業(yè)級功能(JNDI、定時任務等);
- Spring AOP:AOP服務;
- Spring DAO:對JDBC的抽象,簡化了數據訪問異常的處理;
- Spring ORM:對現有的ORM框架的支持;
- Spring Web:提供了基本的面向Web的綜合特性,例如多方文件上傳;
- Spring MVC:提供面向Web應用的Model-View-Controller實現。
2、什么是IOC、DI 及其兩者的優(yōu)點 、 有哪幾種注入方式
IOC:控制反轉,把創(chuàng)建對象的控制權利由代碼轉移到spring的配置文件中。
最直觀的表達就是,IOC讓對象的創(chuàng)建不用去new了,可以由spring自動生產,使用java的反射機制,根據配置文件在運行時動態(tài)的去創(chuàng)建對象以及管理對象,并調用對象的方法的。
DI:依賴注入,在程序運行期間,由外部容器動態(tài)地將依賴對象注入到組件中。簡單定義就是當一個對象需要另一個對象時,可以把另一個對象注入到對象中去。
優(yōu)點就是把應用的代碼量降到最低,達到松散耦合度。
注入的方式:
- 構造注入
- Set注入
- 接口注入
Spring提供以下幾種集合的配置元素:
<list>類型用于注入一列值,允許有相同的值。
<set> 類型用于注入一組值,不允許有相同的值。
<map> 類型用于注入一組鍵值對,鍵和值都可以為任意類型。
<props>類型用于注入一組鍵值對,鍵和值都只能為String類型。
3、談談對AOP理解?
aop面向切面編程,關鍵在于代理模式,Spring AOP使用的動態(tài)代理,所謂的動態(tài)代理就是說AOP框架不會去修改字節(jié)碼,而是每次運行時在內存中臨時為方法生成一個AOP對象,這個AOP對象包含了目標對象的全部方法,并且在特定的切點做了增強處理,并回調原對象的方法。動態(tài)代理可以減少系統(tǒng)中的重復代碼,降低了模塊間的耦合度,同時提高了系統(tǒng)的可維護性??捎糜跈嘞拚J證、日志、事務處理。
Spring AOP中的動態(tài)代理主要有兩種方式,JDK動態(tài)代理和CGLIB動態(tài)代理:
JDK代理:基于接口的代理,不支持類的代理。核心InvocationHandler接口和Proxy類,InvocationHandler 通過invoke()方法反射來調用目標類中的代碼,動態(tài)地將橫切邏輯和業(yè)務編織在一起;接著,Proxy利用 InvocationHandler動態(tài)創(chuàng)建一個符合某一接口的的實例, 生成目標類的代理對象。
Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHandler);
CGLIB動態(tài)代理:如果代理類沒有實現 InvocationHandler 接口(或者說是基于父子類的),那么Spring AOP會選擇使用CGLIB來動態(tài)代理目標類。CGLIB(Code Generation Library),是一個代碼生成的類庫,可以在運行時動態(tài)的生成指定類的一個子類對象,并覆蓋其中特定方法并添加增強代碼,從而實現AOP。CGLIB是通過繼承的方式做的動態(tài)代理,因此如果某個類被標記為final,那么它是無法使用CGLIB做動態(tài)代理的
Enhancer是一個非常重要的類,它允許為非接口類型創(chuàng)建一個JAVA代理,Enhancer動態(tài)的創(chuàng)建給定類的子類并且攔截代理類的所有的方法,和JDK動態(tài)代理不一樣的是不管是接口還是類它都能正常工作
sping的動態(tài)代理通過代理類為目標對象增加額外功能。
代理本質 = 目標對象+額外功能+代理對象的接口
開發(fā)步驟:
1,創(chuàng)建原始對象
2,提供額外功能(實現下面的接口)
- MethodBeforeAdvice 額外功能需要運行在原始方法之前執(zhí)行.
- AfterReturningAdvice 額外功能需要運行在原始方法之后執(zhí)行
- MethodInterceptor 額外功能需要運行在原始方法之前 后執(zhí)行
- ThrowsAdvice 額外功能運行在原始方法拋出異常的執(zhí)行
3,配置切入點
<aop:pointcut expression="execution(* *(..))"/>
4,組裝切入點和代理功能
<aop:advisor pointcut-ref="pc" advice-ref="代理功能的bean"/>
4、spring事務的實現及其原理
Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。
(1)Spring事務的種類:
spring支持編程式事務管理和聲明式事務管理兩種方式:
①編程式事務管理使用TransactionTemplate。
②聲明式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執(zhí)行完目標方法之后根據執(zhí)行情況提交或者回滾事務。
聲明式事務最大的優(yōu)點就是不需要在業(yè)務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規(guī)則聲明或通過@Transactional注解的方式,便可以將事務規(guī)則應用到業(yè)務邏輯中。
聲明式事務管理要優(yōu)于編程式事務管理,這正是spring倡導的非侵入式的開發(fā)方式,使業(yè)務代碼不受污染,只要加上注解就可以獲得完全的事務支持。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。
(2)spring的事務傳播行為:
spring事務的傳播行為說的是,當多個事務同時存在的時候,spring如何處理這些事務的行為。
① PROPAGATION_REQUIRED:如果當前沒有事務,就創(chuàng)建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。
② PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執(zhí)行。‘
③ PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。
④ PROPAGATION_REQUIRES_NEW:創(chuàng)建新事務,無論當前存不存在事務,都創(chuàng)建新事務。
⑤ PROPAGATION_NOT_SUPPORTED:以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。
⑥ PROPAGATION_NEVER:以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。
⑦ PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執(zhí)行。如果當前沒有事務,則按REQUIRED屬性執(zhí)行。
(3)Spring中的隔離級別:
① ISOLATION_DEFAULT:這是個 PlatfromTransactionManager 默認的隔離級別,使用數據庫默認的事務隔離級別。
② ISOLATION_READ_UNCOMMITTED:讀未提交,允許另外一個事務可以看到這個事務未提交的數據。
③ ISOLATION_READ_COMMITTED:讀已提交,保證一個事務修改的數據提交后才能被另一事務讀取,而且能看到該事務對已有記錄的更新。解決臟讀問題
④ ISOLATION_REPEATABLE_READ:可重復讀,保證一個事務修改的數據提交后才能被另一事務讀取,但是不能看到該事務對已有記錄的更新。行鎖
⑤ ISOLATION_SERIALIZABLE:一個事務在執(zhí)行的過程中完全看不到其他事務對數據庫所做的更新。表鎖
(3)只讀屬性(readOnly)
false應用在查詢操作時,提高查詢效率, true用于查詢,false用于增刪改,默認是false
(4)超時屬性(timeout) 秒 -1 由數據庫決定
如果當前事務操作的數據,被別的事務鎖住,那么通過超時數據指定最多等待多少秒.
(5)異常屬性(+-Exception)
默認Spring會對RuntimeException及其子類進行回滾操作
默認Spring會對Exception及其子類進行提交操作
rollback-for=”異常的權限定名” 回滾操作
no-rollback-for=”java.lang.RuntimeException” 提交操作
簡單展示
5、Spring有幾種配置方式?
將Spring配置到應用開發(fā)中有以下三種方式:
基于XML的配置
基于注解的配置(主流)
基于Java的配置
6、Spring 框架中都用到了哪些設計模式?
- 工廠模式:BeanFactory就是簡單工廠模式的體現,用來創(chuàng)建對象的實例;
- 單例模式:Bean默認為單例模式。
- 代理模式:Spring的AOP功能用到了JDK的動態(tài)代理和CGLIB字節(jié)碼生成技術;
- 模板方法:用來解決代碼重復的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 觀察者模式:定義對象鍵一種一對多的依賴關系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都會得到通知被制動更新,如Spring中l(wèi)istener的實現--ApplicationListener。
7、Spring的自動裝配:
在spring中,對象無需自己查找或創(chuàng)建與其關聯(lián)的其他對象,由容器負責把需要相互協(xié)作的對象引用賦予各個對象,使用autowire來配置自動裝載模式。
在Spring框架xml配置中共有5種自動裝配:
(1)no:默認的方式是不進行自動裝配的,通過手工設置ref屬性來進行裝配bean。
(2)byName:通過bean的名稱進行自動裝配,如果一個bean的 property 與另一bean 的name 相同,就進行自動裝配。
(3)byType:通過參數的數據類型進行自動裝配。
(4)constructor:利用構造函數進行裝配,并且構造函數的參數通過byType進行裝配。
(5)autodetect:自動探測,如果有構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。
基于注解的方式:
使用@Autowired注解來自動裝配指定的bean。在使用@Autowired注解之前需要在Spring配置文件進行配置,<context:annotation-config />。在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor后置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查找需要的bean,并裝配給該對象的屬性。在使用@Autowired時,首先在容器中查詢對應類型的bean:
如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的數據;
如果查詢的結果不止一個,那么@Autowired會根據名稱來查找;
如果上述查找的結果為空,那么會拋出異常。解決方法時,使用required=false。
@Autowired可用于:構造函數、成員變量、Setter方法
注:@Autowired和@Resource之間的區(qū)別
(1) @Autowired默認是按照類型裝配注入的,默認情況下它要求依賴對象必須存在(可以設置它required屬性為false)。
(2) @Resource默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照類型來裝配注入。
8、Spring如何處理線程并發(fā)問題?
在一般情況下,只有無狀態(tài)的Bean才可以在多線程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因為Spring對一些Bean中非線程安全狀態(tài)采用ThreadLocal進行處理,解決線程安全問題。
ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。同步機制采用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。而ThreadLocal采用了“空間換時間”的方式。
ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。
9、解釋Spring支持的幾種bean的作用域。
Spring容器中的bean可以分為5個范圍:
(1)singleton:默認,每個容器中只有一個bean的實例,單例的模式由BeanFactory自身來維護。
(2)prototype:為每一個bean請求提供一個實例。
(3)request:為每一個網絡請求創(chuàng)建一個實例,在請求完成以后,bean會失效并被垃圾回收器回收。
(4)session:與request范圍類似,確保每個session中有一個bean的實例,在session過期后,bean會隨之失效。
(5)global-session:全局作用域,global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那么這全局變量需要存儲在global-session中。全局作用域與Servlet中的session作用域效果相同。
10、怎樣開啟注解裝配?
注解裝配在默認情況下是不開啟的,為了使用注解裝配,我們必須在Spring配置文件中配置 <context:annotation-config/>元素。
11、spring核心類有哪些?各有什么作用?
BeanFactory:產生一個新的實例,可以實現單例模式
BeanWrapper:提供統(tǒng)一的get及set方法
ApplicationContext:提供框架的實現,包括BeanFactory的所有功能
12、Spring框架中的單例bean是線程安全的嗎?
不,Spring框架中的單例bean不是線程安全的。
到此這篇關于spring 常見面試題(附答案)的文章就介紹到這了,更多相關spring面試題內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!
相關文章
- 這篇文章主要介紹了Spring面試題50道,應該至少答對30個(附答案),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編2020-06-16
- 這篇文章主要介紹了SpringMVC常見面試題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-05-27
- 這篇文章主要介紹了一文帶你輕松應對Springboot面試小結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-05-12
- 這篇文章主要介紹了2020最新版Spring Cloud面試題,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-03-17
- 這篇文章主要介紹了2020最新版Spring面試題 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-03-17
- 這篇文章主要介紹了2019 最新「Spring 全家桶」高頻面試題(小結),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-08-26
- 這篇文章主要介紹了27道高頻Spring面試題,你能答對幾個?小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-08-08
Java研發(fā)面試99題(含答案):JVM+Spring+MySQL+線程池+鎖
這篇文章主要介紹了Java研發(fā)面試99題,主要包括了JVM,Spring,MySQL,線程池,鎖等,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-07-16- 這篇文章主要介紹了35道SpringBoot面試題及答案(小結)的相關資料,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-21
- 這篇文章主要介紹了49個Spring經典面試題總結(附帶答案)的相關資料,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-29