Spring面試題學習總結(一)
感謝https://blog.csdn.net/a745233700/article/details/80959716
1、什麼是Spring
1、Spring是一個高度靈活的輕量級框架,其目的是降低企業級應用開發的複雜度。
- 常見的配置方式有三種:基於XML的配置、基於註解的配置、基於Java的配置。
|
2、Spring框架優點
- Spring兩大核心:IOC、AOP;
- IOC:創建對象以及管理對象之間的調用關係,避免硬編碼造成程序的耦合;
- AOP:實現很多特定功能(安全、事務、日誌、權限等);
- Spring是輕量的,基本的版本大約2MB;
- Spring被設計爲侵入式設計,代碼的污染極低,基於Spring的開發不需要依賴Spring API;
- Spring本身就是個容器,管理應用對象的生命週期;
- Spring支持其他優秀的框架(整合這一方面,Spring做的相當到位);
- Spring本身也提供了展現層(Spring MVC)和持久層(Spring JDBC)。
|
3、Spring 的七大模塊
- Spring Core(核心容器)
生產和管理bean
- Spring Context(應用上下文)
提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等)
- Spring AOP(面向切面編程)
減少系統中的重複代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。可用於權限認證、日誌、事務處理。
- Spring DAO(JDBC和DAO模塊)對jdbc抽象,簡化數據訪問異常處理
- Spring ORM(對象關係映射)對現有ORM框架支持
- Spring Web(Web)提供了基本的面向Web的綜合特性,(文件上傳等)
- Spring Web MVC(MVC模塊)MVC框架是一個全功能的構建Web應用程序的MVC實現
|
4、Spring Bean生命週期
- Bean的生命週期和servlet生命週期相似(實例化,初始init,doGet/doPost/service,銷燬destroy)
- 個人理解(不扯源碼)
- 實例化bean:首先類加載器讀取*.java文件,生成*.class,讀取*.class的所有信息存儲到一個許多BeanDefinition的Map中,如果不手動干預,Spring就會將Map中的bean根據他的類型進行實例化,放到SpringIOC容器中,實例化完成。SpringIOC的存儲形式是 ConcurrentHashMap
- 使用bean
- 使用完後準備清理bean(DisposableBean)
- 清理bean(destroy-method)
|
5、IOC
- Inversion of control 控制反轉
- 將new對象的權利交給Spring容器,並讓容器根據配置文件去創建實例和管理實例間的依賴關係
- Spring IOC的三種注入方式:構造器、setter方法注入、註解注入
|
6、AOP
面向切面編程,可以說是面向對象編程(OOP)的補充和完善,AOP適合定義橫向的關係,例如日誌功能,AOP利用一種稱爲"橫切"的技術,剖解開封裝的對象內部,並將那些影響了多個類的公共行爲封裝到一個可重用模塊,並將其命名爲"Aspect",即切面,使用"橫切"技術,AOP把軟件系統分爲兩個部分:核心關注點和橫切關注點
AOP編程允許你把遍佈於應用各層的功能分離出來形成可重用的功能組件
|
7、SpringAOP動態代理
- JDK動態代理
JDK動態代理只提供接口的代理,不支持類的代理。核心InvocationHandler接口和Proxy類
InvocationHandler 通過invoke()方法反射來調用目標類中的代碼,動態地將橫切邏輯和業務編織在一起;接着,Proxy利用 InvocationHandler動態創建一個符合某一接口的的實例, 生成目標類的代理對象。
- CGLib動態代理
Code Generation Library是一個代碼生成的類庫,可以在運行時動態的生成指定類的一個子對象,並覆蓋其中的特定方法並添加增強代碼,從而實現AOP。CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記爲final,那麼它是無法使用CGLIB做動態代理的。
|
8、解釋一下Spring AOP裏面的幾個名詞
- 切面(aspect)
封裝通用業務邏輯的組件,可以作用到其他組件上。由 pointcut 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義
- 連接點(joinpoint)
程序運行中的一些時間點, 例如一個方法的執行, 或者是一個異常的處理
- 切點(pointcut)
就是提供一組規則(使用 AspectJ pointcut expression language 來描述) 來匹配joinpoint, 給滿足規則的 joinpoint 添加 Advice
- 通知(advice) - 增強
由 aspect 添加到特定的 join point(即滿足 point cut 規則的 join point) 的一段代碼。
- 目標對象(target)
織入 advice 的目標對象.
- 織入(weaving)
將 aspect 和其他對象連接起來, 並創建 adviced object 的過程.根據不同的實現技術
|
9、Spring支持的幾種bean的作用域
5種作用域
- 單例模式(singleton)Bean將只有一個實例,容器負責跟蹤Bean實例的狀態,負責維護Bean實例的生命週期行爲
- 原型模式(prototype)一旦創建成功,容器不在跟蹤實例,也不會維護Bean實例的狀態
- Request只有在Web應用中使用Spring時,對於每次HTTP請求,使用request定義的Bean都將產生一個新實例
- Session 只有在Web應用中使用Spring時,對於每次HTTP Session,使用session定義的Bean都將產生一個新實例
- Globalsession 只有在Web應用中使用Spring時,每個全局的HTTP Session,使用session定義的Bean都將產生一個新實例。典型情況下,僅在使用portlet context的時候有效。
|
10、Spring 框架中都用到了哪些設計模式?
- 工廠模式:beanfactory
- 單例模式:Bean默認爲單例模式
- 代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術
- 模板方法:用來解決代碼重複的問題,RestTemplate, JpaTemplate
- 觀察者模式:定義對象鍵一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都會得到通知被制動更新
|
11、Spring事務的實現方式和實現原理:
Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。真正的數據庫層的事務提交和回滾是通過binlog或者redo log實現的。
事務的種類
①編程式事務管理使用TransactionTemplate
②聲明式事務管理,其本質是通過AOP功能,對方法前後進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。
聲明式事務優點:不需要在業務邏輯代碼中摻雜事務管理的代碼
聲明式事務缺點:最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別
|
12、Spring的事務傳播行爲
- required:必須在事務中運行,如果沒有,就創建新事物。
- Supports:支持事務,有沒有事務都可以。
- Mandatory:當前沒有事務就會拋出異常
- Required_new:新建事務,如果當前存在事務,就把當前事務掛起。
- Not_supported:不需要事務,如果存在事務中,當前事務會掛起,方法完成,事務繼續
- Never:不能在事範圍內執行,否則拋出
- Nested:不管存不存在事務,都會開啓一個事務,當前存在就嵌套,不存在就搞一個新的
|
13、Spring中的隔離級別
- default:默認,使用後端數據庫默認的隔離級別
- Read_uncommitted:允許讀還未提交已變數據,導致髒、幻、不可重複讀
- Read_committed:允許併發事務提交之後讀,防止髒讀,不能防幻、不可重複讀
- Repeatable_read:對相同字段多次讀取數據一致,幻讀可能發生
- Serializable:完全服從ACID的隔離級別,性能是最差的
一般選擇第二個提交讀隔離級別,出現幻讀和不可重複讀,可以在特定場合使用悲觀鎖和樂觀鎖解決
|
14、Spring的自動裝配
- XML配置5種自動裝配
No:不進行自動注入
ByName:通過bean名稱進行自動裝配
ByType:參數類型
Constructor:構造方法
Autodetect:自動探測
- 基於註解方式
@Autowired註解
@Resource(不是Spring的,由J2EE提供,需要導入包javax.annotation.Resource)
|
15、BeanFactory和ApplicationContext有什麼區別?
BeanFactory和ApplicationContext是Spring的兩大核心接口,都可以當做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
- BeanFactory:是Spring裏面最底層的接口,包含了各種Bean的定義,讀取bean配置文檔,管理bean的加載、實例化,控制bean的生命週期,維護bean之間的依賴關係。
- ApplicationContext接口作爲BeanFactory的派生,除了提供BeanFactory所具有的功能外,還提供了更完整的框架功能:繼承MessageSource,因此支持國際化;統一的資源文件訪問方式;提供在監聽器中註冊bean的事件;同時加載多個配置文件;載入多個(有繼承關係)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層。
- BeanFactroy採用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),纔對該Bean進行加載實例化。
- ApplicationContext,它是在容器啓動時,一次性創建了所有的Bean
- 相對於基本的BeanFactory,ApplicationContext 唯一的不足是佔用內存空間。當應用程序配置Bean較多時,程序啓動較慢
- BeanFactory通常以編程的方式被創建,ApplicationContext還能以聲明的方式創建,如使用ContextLoader
- BeanFactory需要手動註冊,而ApplicationContext則是自動註冊
|