spring面試連環(huán)炮,最后一問才是經(jīng)典
1.什么是Spring
spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架
從大小與開銷而言是輕量級的
通過控制反轉(zhuǎn)的技術(shù)達到松耦合的目的
通過面向切面,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)即服務(wù)進行內(nèi)聚性開發(fā)
包含并管理應(yīng)用對象Bean的配置和生命周期,這個意義上是一個容器
將簡單的組建配置,組合成復(fù)雜的應(yīng)用,這個意義上是一個框架
2.談?wù)勀銓OP的理解
AOP--面向切面編程:能夠?qū)⒛切┡c業(yè)務(wù)無關(guān)的,但為業(yè)務(wù)模塊所共用的一些邏輯,如(事務(wù)管理,日志管理)封裝起來,減少重復(fù)代碼,降低耦合,并有利于未來的可擴展性和可維護性。
Spring AOP是基于動態(tài)代理的,如果要代理的對象實現(xiàn)了某個接口,Spring AOP就會使用JDK動態(tài)代理去創(chuàng)建代理對象;對于沒有實現(xiàn)接口的對象,無法使用JDK動態(tài)代理,而去使用CGlib動態(tài)代理生成一個被代理對象的子類來作為代理。使用AOP可以將一些通用功能抽象出來,如日志管理、事務(wù)管理和權(quán)限管理等,使用時直接調(diào)用即可,避免代碼重復(fù)。
3.談?wù)勀銓oC(控制反轉(zhuǎn))的理解
1.容器概念:ioc容器,里面存放著各種對象,在項目啟動時,讀取配置文件里的bean節(jié)點,根據(jù)全限定類名使用反射放到容器中,此時容器里就有各種對象了,接下來在需要時,進行依賴注入。
2.控制反轉(zhuǎn):在沒有引入ioc容器之前,對象A依賴于對象B,其中對象B的創(chuàng)建與使用的控制權(quán)掌握在A手中,在引入ioc容器之后,對象A與B之間失去了直接聯(lián)系,當(dāng)對象A運行到需要的對象B時,由IOC榮日主動創(chuàng)建對象B注入到A需要的地方。對象A獲取依賴對象B的過程,從主動變?yōu)榱吮粍樱刂茩?quán)顛倒,因此稱為依賴反轉(zhuǎn)。
3.依賴注入:控制反轉(zhuǎn)之后,獲取依賴對象的過程由自身管理變?yōu)榱擞蒊OC容器主動注入。依賴注入是實現(xiàn)IOC的方法,在容器運行期間,動態(tài)的將依賴關(guān)系注入到對象之中。
4.BeanFactory與ApplicationContext的區(qū)別
ApplicationContext是BeanFactory的子接口,ApplicationContext提供了更完整的功能
1.統(tǒng)一的資源文件訪問方式
2.繼承MessageSource,支持國際化
3.同時加載多個配置文件
區(qū)別
BeanFactory采用延時加載來注入Bean,只有在用到某個Bean時,才對其實例化。這樣就不能發(fā)現(xiàn)一些存在的Spring配置問題。
ApplicationContext在容器啟動時,一次性創(chuàng)建所有的Bean。在啟動時就可以發(fā)現(xiàn)Spring中存在的配置問題,有利于檢查依賴屬性是否注入。
相比于BeanFactory,ApplicationContext唯一不足是占用內(nèi)存空間,當(dāng)應(yīng)用程序配置Bean較多時,程序啟動較慢。
5.簡述Spring中Bean的生命周期
1.解析類獲取BeanDefinition
2.如果有多個構(gòu)造方法,推斷構(gòu)造方法
3.確定好構(gòu)造方法后,進行實例化獲取對象
4.對對象中加了@Autowired注解的屬性進行填充
5.回調(diào)Aware方法,如BeanNameAware
6.調(diào)用BeanPostProcessor初始化前的方法
7.調(diào)用初始化方法
8.調(diào)用BeanPostProcessor初始化后的方法,在這里進行AOP
9.如果創(chuàng)建的bean是單例會將bean放入單例池
10.使用Bean
11.spring關(guān)閉時,調(diào)用destroy()方法
6.解釋一下Spring支持的幾種Bean的作用域
1.singleton:Spring中默認的bean都是單例的,每個容器只有一個bean實例,該對象的生命周期與Spring IOC容器一致
2.prototype:為每一個bean請求創(chuàng)建一個實例
3.request:在每個http請求中創(chuàng)建一個單例對象,在單個請求中都會復(fù)用該對象,該 bean 僅在當(dāng)前 HTTP request 內(nèi)有效
4.session:在每個http請求中創(chuàng)建一個單例對象,該 bean 僅在當(dāng)前 HTTP session 內(nèi)有效
5.global-session:全局作用域,基于portlet 的 web 應(yīng)?中才有意義,Spring5 已經(jīng)沒有了。
7.Spring框架中單例Bean是線程安全的嗎?
不是線程安全的,框架并沒有對bean進行多線程的封裝處理。
主要是因為:當(dāng)多個線程操作同一個對象時,對這個對象的非靜態(tài)變量成員的寫會存在線程安全問題。
解決方法:
1.在類中定義一個ThreadLocal成員變量,將需要的可變成員變量保存在ThreadLocal中
2.如果是多線程之間共享,需要使用lock、synchronized、CAS等實現(xiàn)線程同步的方法。
8.Spring框架中使用到了哪些設(shè)計模式
1.單例設(shè)計模式:Spring中的bean默認都是單例的
2.代理設(shè)計模式:Spring中AOP功能的實現(xiàn)
3.工廠設(shè)計模式:Spring使用工廠模式通過BeanFactory、ApplicationContext創(chuàng)建Bean對象
4.模板方法模式:Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 結(jié)尾的對數(shù)據(jù)庫操作的類,它們就使?到了模板模式;
5.包裝器設(shè)計模式:項目需要鏈接不同的數(shù)據(jù)庫,不同的客戶在每次訪問中去訪問不同的數(shù)據(jù)庫。
6.適配器模式:Spring中AOP的通知(Advice)使用了適配器模式。
9.Spring事務(wù)的實現(xiàn)方式和原理以及隔離級別
實現(xiàn)方式
事務(wù)的實現(xiàn)方式有兩種:一種是編程式,一種是聲明式,如使用@Transactional注解
原理
在一個方法上加了@Transactional注解之后,Spring基于這個類生成一個代理對象,將這個代理對象作為bean放入IOC容器,在調(diào)用代理對象方法時,如果方法存在@Transactional注解,那么代理兌獎事務(wù)的自動提交設(shè)置為false,再去執(zhí)行原本的業(yè)務(wù)邏輯,如果沒有異常,那么代理就會將事務(wù)提交,否則將事務(wù)回滾。
10.談?wù)勀銓pring中事務(wù)的理解以及Spring中的事務(wù)隔離級別
事務(wù):是一個完整的業(yè)務(wù)邏輯,最小的工作單元,不可再分。要么同時執(zhí)行成功,要么同時失敗
事物的四個特性(ACID):
原子性:事務(wù)是最小的工作單元,不可分割
一致性:在同一個事務(wù)中,所有要求必須同時成功,或者同時失敗,保證數(shù)據(jù)一致性
隔離性:當(dāng)并發(fā)訪問數(shù)據(jù)庫時,一個是用戶的事務(wù)不受其他事務(wù)的干擾,各并發(fā)事務(wù)之間的數(shù)據(jù)庫是獨立的
持久性:事務(wù)提交之后,它對數(shù)據(jù)庫中數(shù)據(jù)的改變是持久的。
Spring中事物的隔離級別(四個)
1.讀未提交--read uncommited(最低隔離級別) 問題:存在臟讀現(xiàn)象
2.讀已提交--read commited(Oracle數(shù)據(jù)庫默認級別) 問題:不可重復(fù)讀
3.可重復(fù)讀--repeatable read(MySQL數(shù)據(jù)庫默認級別) 問題:存在幻讀現(xiàn)象
4.序列化--serializable(最高隔離級別) 問題:不能并發(fā),效率最低
11.Spring中的事務(wù)傳播行為
事務(wù)傳播?為是為了解決業(yè)務(wù)層?法之間互相調(diào)?的事務(wù)問題。當(dāng)事務(wù)?法被另?個事務(wù)?法調(diào)?時,必須指定事務(wù)應(yīng)該如何傳播。
支持當(dāng)前事務(wù)的情況:
REQUIRED(默認):如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建?個新的事務(wù);
SUPPORTS:如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則以?事務(wù)的?式繼續(xù)運?;
MANDATORY:如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。
不支持當(dāng)前事務(wù)的情況:
REQUIRES_NEW:創(chuàng)建?個新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起;
NOT_SUPPORTED::以?事務(wù)?式運?,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
NEVER:以?事務(wù)?式運?,如果當(dāng)前存在事務(wù),則拋出異常
其他情況
NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建?個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運?;如果當(dāng)前沒有事務(wù),則該取值等價于REQUIRED
12.spring事務(wù)什么時候會失效
1.發(fā)生自調(diào)用,類里面使用this調(diào)用本類的方法,此時這個this對象不是代理類。
2.方法不是public的,@Transactional只能用在public的方法上,否則方法不會生效,如果非要用在不是public的方法上,開啟AspectJ代理模式
3.數(shù)據(jù)庫不支持事務(wù)
4.沒有被spring管理
5.異常被吃掉,事務(wù)不會回滾
13.bean的自動裝配有哪些方式?
五種
1.no-手動配置,通過'ref'手動設(shè)定
2.byName,通過bean的屬性名稱自動裝配
3.byType,通過bean的類型進行自動裝配
4.constructor,通過bean的類型與構(gòu)造器參數(shù)相同進行裝配
5.autodetect,如果有默認構(gòu)造器,則通過constructor進行自動裝配,否則使用byType自動裝配
-END-
最近是面試的高峰期,有一些小伙伴,讓我?guī)兔φ乙恍┟嬖囶}資料,于是我翻遍了收藏的6T資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,需要的小伙伴轉(zhuǎn)發(fā)+關(guān)注后私信我回復(fù)【666】即可獲取,歡迎下載~~~~

