Spring 面試 全面詳情(收藏)

01、Sping原理

02、Spring 特點

03、Spring 框架優缺點

04、Spring 框架中都用到了哪些設計模式

05、Spring核心元件

06、Spring 控制反轉(IOC)

07、控制反轉(IOC )概念

08、Spring 容器高層檢視

09、IOC 容器實現

10、BeanFactory-框架基礎設施

11、ApplicationContext 面向開發應用

12、BeanFactory 和 ApplicationContext有什麼區別?

13、ApplicationContext 通常的實現

14、Spring的依賴 注入

15、依賴注入的基本 原則

16、依賴注入優勢

17、依 賴注入實現方式

18、構造器依賴注入和 Setter方法注入的區別

19、WebApplication 體系架構

20、Spring B ean 定義

21、Spring元 資料配置方式

22、Spring Bean 作用域

23、Sprin g處理執行緒併發問題

24、Spring Bean 生命週期

25、bean生命週期方法

26、什麼是 Spring的內部bean?什麼是Spring inner beans?

27、Spring 依賴注入四種方式構造器注入

28、5 種不同方式的自動裝配

29、Spring 中注入一個 Java Collection

30、使用@Autowired註解自動裝配的過程

31、Spring AOP

32、AOP原理

33、AOP 主要應用場 景有

34、AOP 核 心概念

35、Spring 中的代理

36、AOP 實現方式

37、AOP 兩種代理方式

38、JDK 動態介面代理

39、CGLib 動態代理

40、Spring在執行時通知物件

41、Spring只支援方法級別的連線點

42、在Spring AOP 中,關注點和橫切關注的區別是什麼?在 spring aop 中 concern 和 cross-cutting concern 的不同之處

43、Spring通知型別

44、Spring MVC

45、Spring MVC 原理

46、Spring DATA

47、Spring ORM理解

48、解釋JDBC抽象和DAO模組

49、Spring DAO 的支援

50、Spring JDBC API

51、JdbcTemplate是什麼

52、使用Spring透過什麼方式訪問Hibernate?

53、Spring 支援的 ORM

54、如何透過 HibernateDaoSupport 將 Spring 和 Hibernate 結合起來?

55、Spring 支援的事務管理型別

56、Spring 框架的事務管理有哪些優點?

57、你更傾向用那種事務管理型別?

58、Spring常用註解

01、Sping原理

Spring是一個輕量級Java開發框架,最早有Rod Johnson建立,目的是為了解決企業級應用開發的業務邏輯層和其他各層的耦合問題。它是一個分層的JavaSE/JavaEE full-stack(一站式)輕量級開源框架,為開發Java應用程式提供全面的基礎架構支援。Spring負責基礎架構,因此Java開發者可以專注於應用程式的開發。

Spring是一個全面的、企業應用開發一站式的解決方案,貫穿表現層、業務層、持久層。但是它仍然可以和其他的框架無縫整合。

02、Spring 特點

輕量級:

元件大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1M多的JAR檔案中釋出,並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式,典型案例,Spring應用中的物件不依賴於Spring特定的類

控制反轉:

Spring透過控制反轉(IOC)技術實現解耦。一個物件依賴的其他物件會透過被動的方式傳遞進來,而不需要物件自己建立或者查詢依賴。

面向切面:

支援切面(AOP)程式設計,並且吧應用業務邏輯和系統服務區分開。

容器:

Spring包含並管理應用物件的配置和生命週期,在這個意義上它是一種容器。可以配置每個bean如何被建立、銷燬,bean的作用範圍是單例還是每次都生成一個新的例項,以及他們是如何相互關聯。

框架集合:

將簡單的元件配置,組合成為複雜的框架;

應用物件被申明式組合;

提供許多基礎功能(事務管理、持久化框架繼承),提供應用邏輯開發介面

03、Spring 框架優缺點

優點

方便解耦,簡化開發

:Spring就是一個大工廠,可以將所有物件的建立和依賴關係的維護,交給Spring管理。

AOP程式設計的支援

:Spring提供面向切面程式設計,可以方便的實現對程式進行許可權攔截、執行監控等功能。

宣告式事務的支援

:只需要透過配置就可以完成對事務的管理,而無需手動程式設計。

方便程式的測試

:Spring對Junit4支援,可以透過註解方便的測試Spring程式。

方便整合各種優秀框架

:Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架的直接支援(如:Struts、Hibernate、MyBatis等)。

降低JavaEE API的使用難度

:Spring對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠端呼叫等),都提供了封裝,使這些API應用難度大大降低。

缺點

Spring依賴反射,反射影響效能

使用門檻升高,入門Spring需要較長時間

04、Spring 框架中都用到了哪些設計模式

Spring 框架中使用到了大量的設計模式,下面列舉了比較有代表性的:

代理模式—在 AOP 和 remoting 中被用的比較多。

單例模式—在 spring 配置檔案中定義的 bean 預設為單例模式。

模板方法—用來解決程式碼重複的問題。比如。 RestTemplate, JmsTemplate, JpaTempl

ate。

前端控制器—Spring 提供了 DispatcherServlet 來對請求進行分發。

檢視幫助(View Helper )—Spring 提供了一系列的 JSP 標籤,高效宏來輔助將分散的程式碼

整合在視圖裡。

依賴注入—貫穿於 BeanFactory / ApplicationContext 介面的核心理念。

工廠模式—BeanFactory 用來建立物件的例項

05、Spring核心元件

Spring 總共大約有 20 個模組, 由 1300 多個不同的檔案構成。而這些元件被分別整合在核心容器(Core Container) 、 AOP(Aspect Oriented Programming)和裝置支援(Instrmentation) 、資料訪問與整合(Data Access/Integeration) 、 Web、 訊息(Messaging) 、 Test等 6 個模組中。以下是 Spring 5 的模組結構圖:

Spring 面試 全面詳情(收藏)

spring core:

提供了框架的基本組成部分,包括控制反轉(Inversion of Control,IOC)和依賴注入(Dependency Injection,DI)功能。

spring beans:

提供了BeanFactory,是工廠模式的一個經典實現,Spring將管理物件稱為Bean。

spring context:

構建於 core 封裝包基礎上的 context 封裝包,提供了一種框架式的物件訪問方法。

spring jdbc:

提供了一個JDBC的抽象層,消除了煩瑣的JDBC編碼和資料庫廠商特有的錯誤程式碼解析, 用於簡化JDBC。

spring aop:

提供了面向切面的程式設計實現,讓你可以自定義攔截器、切點等。

spring Web:

提供了針對 Web 開發的整合特性,例如檔案上傳,利用 servlet listeners 進行 ioc 容器初始化和針對 Web 的 ApplicationContext。

spring test:

主要為測試提供支援的,支援使用JUnit或TestNG對Spring元件進行單元測試和整合測試。

06、Spring 控制反轉(IOC)

07、控制反轉(IOC )概念

控制反轉即IOC (Inversion of Control),它把傳統上由程式程式碼直接操控的物件的呼叫權交給容器,透過容器來實現物件元件的裝配和管理。

Spring 透過一個配置檔案描述 Bean 及 Bean 之間的依賴關係,利用 Java 語言的反射功能(依賴注入DI)例項化 Bean 並建立 Bean 之間的依賴關係。Spring 的 IoC 容器在完成這些底層工作的基礎上,還提供 了 Bean 例項快取、生命週期管理、 Bean 例項代理、事件釋出、資源裝載等高階服務。

08、Spring 容器高層檢視

Spring 啟動時讀取應用程式提供的 Bean 配置資訊,並在 Spring 容器中生成一份相應的 Bean 配

置登錄檔,然後根據這張登錄檔例項化 Bean,裝配好 Bean 之間的依賴關係,為上層應用提供準

備就緒的執行環境。其中 Bean 快取池為 HashMap 實現

Spring 面試 全面詳情(收藏)

09、IOC 容器實現

10、BeanFactory-框架基礎設施

BeanFactory 是 Spring 框架的基礎設施,面向 Spring 本身;

ApplicationContext 面向使用Spring 框架的開發者,幾乎所有的應用場合我們都直接使用 ApplicationContext 而非底層的 BeanFactory。

Spring 面試 全面詳情(收藏)

BeanDefinitionRegistry 登錄檔

:Spring 配置檔案中每一個節點元素在 Spring 容器裡都透過一個 BeanDefinition 物件表示,它描述了 Bean 的配置資訊。而 BeanDefinitionRegistry 介面提供了向容器手工註冊BeanDefinition 物件的方法。

BeanFactory 頂層介面

:位於類結構樹的頂端 ,它最主要的方法就是 getBean(String beanName),該方法從容器中返回特定名稱的 Bean,BeanFactory 的功能透過其他的介面得到不斷擴充套件:

ListableBeanFactory

:該介面定義了訪問容器中 Bean 基本資訊的若干方法,如檢視 Bean 的個數、獲取某一型別Bean 的配置名、檢視容器中是否包括某一 Bean 等方法;

HierarchicalBeanFactory 父子級

:父子級聯 IoC 容器的介面,子容器可以透過介面方法訪問父容器;透過HierarchicalBeanFactory 介面, Spring 的 IoC 容器可以建立父子層級關聯的容器體系,子容器可以訪問父容器中的 Bean,但父容器不能訪問子容器的 Bean。Spring 使用父子容器實現了很多功能,比如在 Spring MVC 中,展現層 Bean 位於一個子容器中,而業務層和持久層的 Bean 位於父容器中。這樣,展現層 Bean 就可以引用業務層和持久層的 Bean,而業務層和持久層的 Bean 則看不到展現層的 Bean。

ConfigurableBeanFactory

:是一個重要的介面,增強了 IoC 容器的可定製性,它定義了設定類裝載器、屬性編輯器、容器初始化後置處理器等方法;

AutowireCapableBeanFactory 自動裝配

:定義了將容器中的 Bean 按某種規則(如按名字匹配、按型別匹配等)進行自動裝配的方法;

SingletonBeanRegistry 執行期間註冊單例 Bean

:定義了允許在執行期間向容器註冊單例項 Bean 的方法;對於單例項( singleton)的 Bean 來說,BeanFactory 會快取 Bean 例項,所以第二次使用 getBean() 獲取 Bean 時將直接從IoC 容器的快取中獲取 Bean 例項。Spring 在 DefaultSingletonBeanRegistry 類中提供了一個用於快取單例項 Bean 的快取器,它是一個用 HashMap 實現的快取器,單例項的 Bean 以beanName 為鍵儲存在這個 HashMap 中。

依賴日誌框架

:在初始化 BeanFactory 時,必須為其提供一種日誌框架,比如使用 Log4J, 即在類路徑下提供 Log4J 配置檔案,這樣啟動 Spring 容器才不會報錯。

11、ApplicationContext 面向開發應用

ApplicationContext 由 BeanFactory 派生而來,提供了更多面向實際應用的功能。

ApplicationContext 繼承了 HierarchicalBeanFactory 和 ListableBeanFactory 介面,在此基礎

上,還透過多個其他的介面擴充套件了 BeanFactory 的功能:

Spring 面試 全面詳情(收藏)

ClassPathXmlApplicationContext

:預設從類路徑載入配置檔案

FileSystemXmlApplicationContext

:預設從檔案系統中裝載配置檔案

ApplicationEventPublisher

:讓容器擁有釋出應用上下文事件的功能,包括容器啟動事

件、關閉事件等。

MessageSource

:為應用提供 i18n 國際化訊息訪問的功能;

ResourcePatternResolver

:所有 ApplicationContext 實現類都實現了類似於

PathMatchingResourcePatternResolver

:透過帶字首的 Ant 風格的資原始檔路徑裝載 Spring 的配置檔案。

LifeCycle

:該介面是 Spring 2。0 加入的,該介面提供了 start()和 stop()兩個方法,主要用於控制非同步處理過程。在具體使用時,該介面同時被 ApplicationContext 實現及具體Bean 實現, ApplicationContext 會將 start/stop 的資訊傳遞給容器中所有實現了該介面的 Bean,以達到管理和控制 JMX、任務排程等目的。

ConfigurableApplicationContext

:擴充套件於 ApplicationContext,它新增加了兩個主要的方法:refresh()和 close(),讓 ApplicationContext 具有啟動、重新整理和關閉應用上下文的能力。在應用上下文關閉的情況下呼叫 refresh()即可啟動應用上下文,在已經啟動的狀態下,呼叫 refresh()則清除快取並重新裝載配置資訊,而呼叫 close()則可關閉應用上下文。

12、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進行載入例項化。這樣,我們就不能發現一些存在的Spring的配置問題。如果Bean的某一個屬性沒有注入,BeanFacotry載入後,直至第一次使用呼叫getBean方法才會丟擲異常。

ApplicationContext:它是在容器啟動時,一次性建立了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的配置錯誤,這樣有利於檢查所依賴屬性是否注入。ApplicationContext啟動後預載入所有的單例項Bean,透過預載入單例項bean ,確保當你需要的時候,你就不用等待,因為它們已經建立好了。

相對於基本的BeanFactory,ApplicationContext 唯一的不足是佔用記憶體空間。當應用程式配置Bean較多時,程式啟動較慢。

建立方式

BeanFactory通常以程式設計的方式被建立,ApplicationContext還能以宣告的方式建立,如使用ContextLoader。

註冊方式

BeanFactory和ApplicationContext都支援BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區別是:BeanFactory需要手動註冊,而ApplicationContext則是自動註冊。

13、ApplicationContext 通常的實現

FileSystemXmlApplicationContext :此容器從一個XML檔案中載入beans的定義,XML Bean 配置檔案的全路徑名必須提供給它的建構函式。

ClassPathXmlApplicationContext:此容器也從一個XML檔案中載入beans的定義,這裡,你需要正確設定classpath因為這個容器將在classpath裡找bean配置。

WebXmlApplicationContext:此容器載入一個XML檔案,此檔案定義了一個WEB應用的所有bean。

14、Spring的依賴 注入

其主要實現方式有兩種:依賴注入和依賴查詢。

依賴注入:相對於IoC而言,依賴注入(DI)更加準確地描述了IoC的設計理念。所謂依賴注入(Dependency Injection),即元件之間的依賴關係由容器在應用系統執行期來決定,也就是由容器動態地將某種依賴關係的目標物件例項注入到應用系統中的各個關聯的元件之中。元件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關係。

15、依賴注入的基本 原則

應用元件不應該負責查詢資源或者其他依賴的協作物件。配置物件的工作應該由IoC容器負責,“查詢資源”的邏輯應該從應用元件的程式碼中抽取出來,交給IoC容器負責。容器全權負責元件的裝配,它會把符合依賴關係的物件透過屬性(JavaBean中的setter)或者是構造器傳遞給需要的物件。

16、依賴注入優勢

依賴注入之所以更流行是因為它是一種更可取的方式:讓容器全權負責依賴查詢,受管元件只需要暴露JavaBean的setter方法或者帶引數的構造器或者介面,使容器可以在初始化時組裝物件的依賴關係。其與依賴查詢方式相比,主要優勢為:

查詢定位操作與應用程式碼完全無關

不依賴於容器的API,可以很容易地在任何容器以外使用應用物件

不需要特殊的介面,絕大多數物件可以做到完全不必依賴容器

17、依 賴注入實現方式

依賴注入是時下最流行的IoC實現方式,依賴注入分為介面注入(Interface Injection),Setter方法注入(Setter Injection)和構造器注入(Constructor Injection)三種方式。其中介面注入由於在靈活性和易用性比較差,現在從Spring4開始已被廢棄。

構造器依賴注入

:構造器依賴注入透過容器觸發一個類的構造器來實現的,該類有一系列引數,每個引數代表一個對其他類的依賴

Setter方法注入

:Setter方法注入是容器透過呼叫無參構造器或無參static工廠 方法例項化bean之後,呼叫該bean的setter方法,即實現了基於setter的依賴注入

18、構造器依賴注入和 Setter方法注入的區別

建構函式注入setter 注入

沒有部分注入有部分注入

不會覆蓋 setter 屬性會覆蓋 setter 屬性

任意修改都會建立一個新例項任意修改不會建立一個新例項

適用於設定很多屬性適用於設定少量屬性

兩種依賴方式都可以使用,構造器注入和Setter方法注入。最好的解決方案是用構造器引數實現強制依賴,setter方法實現可選依賴。

19、WebApplication 體系架構

WebApplicationContext 是專門為 Web 應用準備的,它允許從相對於 Web 根目錄的路徑中裝載配置檔案完成初始化工作。從 WebApplicationContext 中可以獲得ServletContext 的引用,整個 Web 應用上下文物件將作為屬性放置到 ServletContext 中,以便 Web 應用環境可以訪問 Spring 應用上下文。

Spring 面試 全面詳情(收藏)

20、Spring B ean 定義

一個Spring Bean 的定義包含容器必知的所有配置元資料,包括如何建立一個bean,它的生命週期詳情及它的依賴。

21、Spring元資料配置方式

XML配置檔案 基於註解的配置 基於java的配置

22、Spring Bean 作用域

Spring 3 中為 Bean 定義了 5 中作用域,分別為 singleton(單例)、prototype(原型)、request、session 和 global session,5 種作用域說明如下:

singleton

:單例模式(多執行緒下不安全)。Spring IoC 容器中只會存在一個共享的 Bean 例項,無論有多少個Bean 引用它,始終指向同一物件。該模式在多執行緒下是不安全的。Singleton 作用域是Spring 中的預設作用域,也可以顯示的將 Bean 定義為 singleton 模式,配置為:

prototype

:原型模式每次使用時建立。每次透過 Spring 容器獲取 prototype 定義的 bean 時,容器都將建立一個新的 Bean 例項,每個 Bean 例項都有自己的屬性和狀態,而 singleton 全域性只有一個物件。根據經驗,對有狀態的bean使用prototype作用域,而對無狀態的bean使用singleton

作用域。

Request

:一次 request 一個例項。在一次 Http 請求中,容器會返回該 Bean 的同一例項。而對不同的 Http 請求則會產生新的 Bean,而且該 bean 僅在當前 Http Request 內有效,當前 Http 請求結束,該 bean例項也將會被銷燬。

session

:在一次 Http Session 中,容器會返回該 Bean 的同一例項。而對不同的 Session 請求則會建立新的例項,該 bean 例項僅在當前 Session 內有效。同 Http 請求相同,每一次session 請求建立新的例項,而不同的例項之間不共享屬性,且例項僅在自己的 session 請求內有效,請求結束,則例項將被銷燬。

global Session

:在一個全域性的 Http Session 中,容器會返回該 Bean 的同一個例項,僅在使用 portlet context 時有效。

23、Sprin g處理執行緒併發問題

在一般情況下,只有無狀態的Bean才可以在多執行緒環境下共享,在Spring中,絕大部分Bean都可以宣告為singleton作用域,因為Spring對一些Bean中非執行緒安全狀態採用ThreadLocal進行處理,解決執行緒安全問題。

ThreadLocal和執行緒同步機制都是為了解決多執行緒中相同變數的訪問衝突問題。同步機制採用了“時間換空間”的方式,僅提供一份變數,不同的執行緒在訪問前需要獲取鎖,沒獲得鎖的執行緒則需要排隊。而ThreadLocal採用了“空間換時間”的方式。

ThreadLocal會為每一個執行緒提供一個獨立的變數副本,從而隔離了多個執行緒對資料的訪問衝突。因為每一個執行緒都擁有自己的變數副本,從而也就沒有必要對該變數進行同步了。ThreadLocal提供了執行緒安全的共享物件,在編寫多執行緒程式碼時,可以把不安全的變數封裝進ThreadLocal。

24、Spring Bean 生命週期

Spring 面試 全面詳情(收藏)

例項化

\1。 例項化一個 Bean,也就是我們常說的 new。

IOC 依賴注入

\2。 按照 Spring 上下文對例項化的 Bean 進行配置,也就是 IOC 注入。

setBeanName 實現

\3。 如果這個 Bean 已經實現了 BeanNameAware 介面,會呼叫它實現的 setBeanName(String)

方法,此處傳遞的就是 Spring 配置檔案中 Bean 的 id 值

BeanFactoryAware 實現

\4。 如果這個 Bean 已經實現了 BeanFactoryAware 介面,會呼叫它實現的 setBeanFactory,

setBeanFactory(BeanFactory)傳遞的是 Spring 工廠自身(可以用這個方式來獲取其它 Bean,

只需在 Spring 配置檔案中配置一個普通的 Bean 就可以)。

ApplicationContextAware 實現

\5。 如果這個 Bean 已經實現了 ApplicationContextAware 介面,會呼叫

setApplicationContext(ApplicationContext)方法,傳入 Spring 上下文(同樣這個方式也

可以實現步驟 4 的內容,但比 4 更好,因為 ApplicationContext 是 BeanFactory 的子接

口,有更多的實現方法)

postProcessBeforeInitialization 介面實現-初始化預處理

\6。 如果這個 Bean 關聯了 BeanPostProcessor 介面,將會呼叫

postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 經常被用

作是 Bean 內容的更改,並且由於這個是在 Bean 初始化結束時呼叫那個的方法,也可以被應

用於記憶體或快取技術。

init-method

\7。 如果 Bean 在 Spring 配置檔案中配置了 init-method 屬性會自動呼叫其配置的初始化方法。

postProcessAfterInitialization

\8。 如果這個 Bean 關聯了 BeanPostProcessor 介面,將會呼叫

postProcessAfterInitialization(Object obj, String s)方法。

注:以上工作完成以後就可以應用這個 Bean 了,那這個 Bean 是一個 Singleton 的,所以一

般情況下我們呼叫同一個 id 的 Bean 會是在內容地址相同的例項,當然在 Spring 配置檔案中

也可以配置非 Singleton。

Destroy 過期自動清理階段

\9。 當 Bean 不再需要時,會經過清理階段,如果 Bean 實現了 DisposableBean 這個介面,會調

用那個其實現的 destroy()方法;

destroy-method 自配置清理

\10。 最後,如果這個 Bean 的 Spring 配置中配置了 destroy-method 屬性,會自動呼叫其配置的

銷燬方法。

25、bean生命週期方法

bean 標籤有兩個重要的屬性(init-method 和 destroy-method)。用它們你可以自己定製

初始化和登出方法。它們也有相應的註解(@PostConstruct 和@PreDestroy)。

26、什麼是Spring的內部bean?什麼是Spring inner beans?

在Spring框架中,當一個bean僅被用作另一個bean的屬性時,它能被宣告為一個內部bean。

內部bean可以用setter注入“屬性”和構造方法注入“構造引數”的方式來實現,內部bean通常是匿名的,它們的Scope一般是prototype。

27、Spring 依賴注入四種方式構造器注入

/*帶引數,方便利用構造器進行注入*/ public CatDaoImpl(String message){ this。 message = message; }

setter 方法注入

public class Id { private int id; public int getId() { return id; } public void setId(int id) { this。id = id; }}

靜態工廠注入

靜態工廠顧名思義,就是透過呼叫靜態工廠的方法來獲取自己需要的物件,為了讓 spring 管理所有物件,我們不能直接透過“工程類。靜態方法()”來獲取物件,而是依然透過 spring 注入的形式獲取:

public class DaoFactory { //靜態工廠 public static final FactoryDao getStaticFactoryDaoImpl(){ return new StaticFacotryDaoImpl(); }}public class SpringAction { private FactoryDao staticFactoryDao; //注入物件 //注入物件的 set 方法 public void setStaticFactoryDao(FactoryDao staticFactoryDao) { this。staticFactoryDao = staticFactoryDao; }}//factory-method=“getStaticFactoryDaoImpl”指定呼叫哪個工廠方法 <!——使用靜態工廠的方法注入物件,對應下面的配置檔案——> <!——此處獲取物件的方式是從工廠類中獲取靜態方法——>

例項工廠

例項工廠的意思是獲取物件例項的方法不是靜態的,所以你需要首先 new 工廠類,再呼叫普通的例項方法:

public class DaoFactory { //例項工廠 public FactoryDao getFactoryDaoImpl(){ return new FactoryDaoImpl();13/04/2018 Page 128 of 283 }}public class SpringAction { private FactoryDao factoryDao; //注入物件 public void setFactoryDao(FactoryDao factoryDao) { this。factoryDao = factoryDao; }} <!——使用例項工廠的方法注入物件,對應下面的配置檔案——> <!——此處獲取物件的方式是從工廠類中獲取例項方法——>

28、5 種不同方式的自動裝配

Spring 裝配包括手動裝配和自動裝配,手動裝配是有基於 xml 裝配、構造方法、setter 方法等自動裝配有五種自動裝配的方式,可以用來指導 Spring 容器用自動裝配方式來進行依賴注入。

no

:預設的方式是不進行自動裝配,透過顯式設定 ref 屬性來進行裝配。

byName

:透過引數名 自動裝配,Spring 容器在配置檔案中發現 bean 的 autowire 屬性被設定成 byName,之後容器試圖匹配、裝配和該 bean 的屬性具有相同名字的 bean。

byType

:透過引數型別自動裝配,Spring 容器在配置檔案中發現 bean 的 autowire 屬性被設定成 byType,之後容器試圖匹配、裝配和該 bean 的屬性具有相同型別的 bean。如果有多個 bean 符合條件,則丟擲錯誤。

constructor

:這個方式類似於 byType, 但是要提供給構造器引數,如果沒有確定的帶引數的構造器引數型別,將會丟擲異常。

autodetect

:首先嚐試使用 constructor 來自動裝配,如果無法工作,則使用 byType 方式。

29、Spring 中注入一個 Java Collection

Spring 提供了以下四種集合類的配置元素:

: 該標籤用來裝配可重複的 list 值。

: 該標籤用來裝配沒有重複的 set 值。

: 該標籤支援注入鍵和值都是字串型別的鍵值對。

<!—— Definition for javaCollection ——> <!—— java。util。List ——> INDIA Pakistan USA UK <!—— java。util。Set ——> INDIA Pakistan USA UK <!—— java。util。Map ——> <!—— java。util。Properties ——> admin@nospam。com support@nospam。com

30、使用@Autowired註解自動裝配的過程

在使用@Autowired註解之前需要在Spring配置檔案進行配置,

在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查詢需要的bean,並裝配給該物件的屬性。在使用@Autowired時,首先在容器中查詢對應型別的bean:

如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的資料;

如果查詢的結果不止一個,那麼@Autowired會根據名稱來查詢;

如果上述查詢的結果為空,那麼會丟擲異常。解決方法時,使用required=false。

31、Spring AOP

32、AOP原理

OOP(Object-Oriented Programming)面向物件程式設計,允許開發者定義縱向的關係,但並適用於定義橫向的關係,導致了大量程式碼的重複,而不利於各個模組的重用。

AOP(Aspect-Oriented Programming),一般稱為面向切面程式設計,作為面向物件的一種補充,用於將那些與業務無關,但卻對多個物件產生影響的公共行為和邏輯,抽取並封裝為一個可重用的模組,這個模組被命名為“切面”(Aspect),減少系統中的重複程式碼,降低了模組間的耦合度,同時提高了系統的可維護性。

33、AOP 主要應用場 景有

Authentication 許可權

Caching 快取

Context passing 內容傳遞

Error handling 錯誤處理

Lazy loading 懶載入

Debugging 除錯

logging, tracing, profiling and monitoring 記錄跟蹤 最佳化 校準

Performance optimization 效能最佳化

Persistence 持久化

Resource pooling 資源池

Synchronization 同步

Transactions 事務

34、AOP 核 心概念

切面(aspect):類是對物體特徵的抽象,切面就是對橫切關注點的抽象

橫切關注點:對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之為橫切關注點

連線點(joinpoint):被攔截到的點,因為 Spring 只支援方法型別的連線點,所以在 Spring中連線點指的就是被攔截到的方法,實際上連線點還可以是欄位或者構造器

切入點(pointcut):對連線點進行攔截的定義

通知(advice):所謂通知指的就是指攔截到連線點之後要執行的程式碼,通知分為前置、後置、異常、最終、環繞通知五類

目標物件:代理的目標物件

織入(weave):將切面應用到目標物件並導致代理物件建立的過程

編譯期:切面在目標類編譯時被織入。AspectJ的織入編譯器是以這種方式織入切面的;

類載入期:切面在目標類載入到JVM時被織入。需要特殊的類載入器,它可以在目標類被引入應用之前增強該目標類的位元組碼。AspectJ5的載入時織入就支援以這種方式織入切面;

執行期:切面在應用執行的某個時刻被織入。一般情況下,在織入切面時,AOP容器會為目標物件動態地建立一個代理物件。SpringAOP就是以這種方式織入切面。

引入(introduction):在不修改程式碼的前提下,引入可以在執行期為類動態地新增一些方法

或欄位

35、Spring 中的代理

將 Advice 應用於目標物件後建立的物件稱為代理。在客戶端物件的情況下,目標物件和代理物件是相同的。

Advice + Target Object = Proxy

36、AOP 實現方式

AOP實現的關鍵在於代理模式,AOP代理主要分為靜態代理和動態代理。

AspectJ

靜態代理的增強,所謂靜態代理,就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強,他會在編譯階段將AspectJ(切面)織入到Java位元組碼中,執行的時候就是增強之後的AOP物件。

Spring AOP

使用的動態代理,所謂的動態代理就是說AOP框架不會去修改位元組碼,而是每次執行時在記憶體中臨時為方法生成一個AOP物件,這個AOP物件包含了目標物件的全部方法,並且在特定的切點做了增強處理,並回調原物件的方法。

37、AOP 兩種代理方式

Spring 提供了兩種方式來生成代理物件: JDK Proxy 和 Cglib,具體使用哪種方式生成由AopProxyFactory 根據 AdvisedSupport 物件的配置來決定。預設的策略是如果目標類是介面,則使用 JDK 動態代理技術,否則使用 Cglib 來生成代理。

38、JDK 動態介面代理

JDK 動態代理主要涉及到 java。lang。reflect 包中的兩個類:Proxy 和 InvocationHandler。

InvocationHandler是一個介面,透過實現該介面定義橫切邏輯,並透過反射機制呼叫目標類

的程式碼,動態將橫切邏輯和業務邏輯編制在一起。

Proxy 利用 InvocationHandler 動態建立一個符合某一介面的例項,生成目標類的代理物件。

39、CGLib 動態代理

CGLib 全稱為 Code Generation Library,是一個強大的高效能,高質量的程式碼生成類庫,可以在執行期擴充套件 Java 類與實現 Java 介面,CGLib 封裝了 asm,可以再執行期動態生成新的 class。和 JDK 動態代理相比較:JDK 建立代理有一個限制,就是隻能為介面建立代理例項,而對於沒有透過介面定義業務方法的類,則可以透過 CGLib 建立動態代理。

實現原理

@Aspectpublic class TransactionDemo { @Pointcut(value=“execution(* com。yangxin。core。service。*。*。*(。。))”) public void point(){ } @Before(value=“point()”) public void before(){ System。out。println(“transaction begin”); } @AfterReturning(value = “point()”) public void after(){ System。out。println(“transaction commit”); } @Around(“point()”) public void around(ProceedingJoinPoint joinPoint) throws Throwable{ System。out。println(“transaction begin”); joinPoint。proceed(); System。out。println(“transaction commit”); } }

40、Spring在執行時通知物件

透過在代理類中包裹切面,Spring在執行期把切面織入到Spring管理的bean中。代理封裝了目標類,並攔截被通知方法的呼叫,再把呼叫轉發給真正的目標bean。當代理攔截到方法呼叫時,在呼叫目標bean方法之前,會執行切面邏輯。

直到應用需要被代理的bean時,Spring才建立代理物件。如果使用的是ApplicationContext的話,在ApplicationContext從BeanFactory中載入所有bean的時候,Spring才會建立被代理的物件。因為Spring執行時才建立代理物件,所以我們不需要特殊的編譯器來織入SpringAOP的切面。

41、Spring只支援方法級別的連線點

因為Spring基於動態代理,所以Spring只支援方法連線點。Spring缺少對欄位連線點的支援,而且它不支援構造器連線點。方法之外的連線點攔截功能,我們可以利用Aspect來補充。

42、在Spring AOP 中,關注點和橫切關注的區別是什麼?在 spring aop 中 concern 和 cross-cutting concern 的不同之處

關注點(concern)是應用中一個模組的行為,一個關注點可能會被定義成一個我們想實現的一個功能。

橫切關注點(cross-cutting concern)是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,比如日誌,安全和資料傳輸,幾乎應用的每個模組都需要的功能。因此這些都屬於橫切關注點。

43、Spring通知型別

在AOP術語中,切面的工作被稱為通知,實際上是程式執行時要透過SpringAOP框架觸發的程式碼段。Spring切面可以應用5種類型的通知:

前置通知(Before):在目標方法被呼叫之前呼叫通知功能;

後置通知(After):在目標方法完成之後呼叫通知,此時不會關心方法的輸出是什麼;

返回通知(After-returning ):在目標方法成功執行之後呼叫通知;

異常通知(After-throwing):在目標方法丟擲異常後呼叫通知;

環繞通知(Around):通知包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之後執行自定義的行為。

同一個aspect,不同advice的執行順序:

沒有異常情況下的執行順序:

around before advice before advice target method 執行 around after advice after advice afterReturning

有異常情況下的執行順序:

around before advice before advice target method 執行 around after advice after advice afterThrowing:異常發生 java。lang。RuntimeException: 異常發生

44、Spring MVC

45、Spring MVC 原理

Spring 的模型-檢視-控制器(MVC)框架是圍繞一個 DispatcherServlet 來設計的,這個 Servlet

會把請求分發給各個處理器,並支援可配置的處理器對映、檢視渲染、本地化、時區與主題渲染

等,甚至還能支援檔案上傳。

Spring 面試 全面詳情(收藏)

Http 請求到 DispatcherServlet

(1) 客戶端請求提交到 DispatcherServlet。

HandlerMapping 尋找處理器

(2) 由 DispatcherServlet 控制器查詢一個或多個 HandlerMapping,找到處理請求的Controller。

呼叫處理器 Controller

(3) DispatcherServlet 將請求提交到 Controller。

Controller 呼叫業務邏輯處理後,返回 ModelAndView

(4)(5)呼叫業務處理和返回結果:Controller 呼叫業務邏輯處理後,返回 ModelAndView。

DispatcherServlet 查詢 ModelAndView

(6)(7)處理檢視對映並返回模型:DispatcherServlet 查詢一個或多個 ViewResoler 檢視解析器,

找到 ModelAndView 指定的檢視。

ModelAndView 反饋瀏覽器 HTTP

(8) Http 響應:檢視負責將結果顯示到客戶端。

46、Spring DATA

47、Spring ORM理解

Spring 透過提供ORM模組,支援我們在直接JDBC之上使用一個物件/關係對映對映(ORM)工具,Spring 支援整合主流的ORM框架,如Hiberate,JDO和 iBATIS,JPA,TopLink,JDO,OJB 。Spring的事務管理同樣支援以上所有ORM框架及JDBC。

48、解釋JDBC抽象和DAO模組

透過使用JDBC抽象和DAO模組,保證資料庫程式碼的簡潔,並能避免資料庫資源錯誤關閉導致的問題,它在各種不同的資料庫的錯誤資訊之上,提供了一個統一的異常訪問層。它還利用Spring的AOP 模組給Spring應用中的物件提供事務管理服務。

49、Spring DAO 的支援

Spring DAO(資料訪問物件) 使得 JDBC,Hibernate 或 JDO 這樣的資料訪問技術更容易以一種統一的方式工作。這使得使用者容易在永續性技術之間切換。它還允許您在編寫程式碼時,無需考慮捕獲每種技術不同的異常。

50、Spring JDBC API

JdbcTemplate SimpleJdbcTemplate NamedParameterJdbcTemplate SimpleJdbcInsert SimpleJdbcCall

51、JdbcTemplate是什麼

JdbcTemplate 類提供了很多便利的方法解決諸如把資料庫資料轉變成基本資料型別或物件,執行寫好的或可呼叫的資料庫操作語句,提供自定義的資料錯誤處理。

52、使用Spring透過什麼方式訪問Hibernate?

有兩種方式訪問Hibernate:

使用 Hibernate 模板和回撥進行控制反轉

擴充套件 HibernateDAOSupport 並應用 AOP 攔截器節點

53、Spring 支援的 ORM

Spring 支援以下 ORM:

Hibernate

iBatis

JPA (Java Persistence API)

TopLink

JDO (Java Data Objects)

OJB

54、如何透過 HibernateDaoSupport 將 Spring 和 Hibernate 結合起來?

用 Spring 的 SessionFactory 呼叫 LocalSessionFactory。整合過程分三步:

配置 the Hibernate SessionFactory

繼承 HibernateDaoSupport

實現一個 DAO 在 AOP 支援的事務中裝配

55、Spring 支援的事務管理型別

Spring 支援兩種型別的事務管理:

程式設計式事務管理

:這意味你透過程式設計的方式管理事務,給你帶來極大的靈活性,但是 難維護。

宣告式事務管理

:這意味著你可以將業務程式碼和事務管理分離,你只需用註解和 XML 配置來管理事務。

56、Spring 框架的事務管理有哪些優點?

它為不同的事務 API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供一個不變 的程式設計模式。

它為程式設計式事務管理提供了一套簡單的 API 而不是一些複雜的事務 API 如 它支援宣告式事務管理。它和 Spring 各種資料訪問抽象層很好得整合。

57、你更傾向用那種事務管理型別?

大多數 Spring 框架的使用者選擇宣告式事務管理,因為它對應用程式碼的影響最小,因 此更符合一個無侵入的輕量級容器的思想。宣告式事務管理要優於程式設計式事務管理, 雖然比程式設計式事務管理(這種方式允許你透過程式碼控制事務)少了一點靈活性。

58、Spring常用註解

宣告bean的註解

@Component :元件,沒有明確的角色

@Service :在業務邏輯層使用

@Repository :在資料訪問層使用

@Controller :在展現層使用,控制層的宣告

@RestController :@Controller和@ResponseBody組合,,控制層的宣告

注入bean的註解

@Autowired:

Spring自帶的註解,透過AutowiredAnnotationBeanPostProcessor 類實現的依賴注入

作用在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE

預設是根據型別(byType )進行自動裝配的

如果有多個型別一樣的Bean候選者,需要指定按照名稱(byName )進行裝配,則需要配合@Qualifier

指定名稱後,如果Spring IOC容器中沒有對應的元件bean丟擲NoSuchBeanDefinitionException。也可以將@Autowired中required配置為false,如果配置為false之後,當沒有找到相應bean的時候,系統不會拋異常

@Inject:

JSR330 (Dependency Injection for Java)中的規範,需要匯入javax。inject。Inject jar包 ,才能實現注入

作用CONSTRUCTOR、METHOD、FIELD上

根據型別進行自動裝配的,如果需要按名稱進行裝配,則需要配合@Named

@Resource:

JSR250規範的實現,在javax。annotation包下

作用TYPE、FIELD、METHOD上

預設根據屬性名稱進行自動裝配的,如果有多個型別一樣的Bean候選者,則可以透過name進行指定進行注入

java配置類相關注解

@Configuration :聲明當前類為配置類,相當於xml形式的Spring配置(類上),聲明當前類為配置類,其中內部組合了@Component註解,表明這個類是一個bean(類上)

@Bean :註解在方法上,聲明當前方法的返回值為一個bean,替代xml中的方式(方法上)

@ComponentScan :用於對Component進行掃描,相當於xml中的(類上)

@WishlyConfiguration :為@Configuration與@ComponentScan的組合註解,可以替代這兩個註解

切面(AOP)相關注解

Spring支援AspectJ的註解式切面程式設計(懶人必讀,AspectJ切入點語法_vincent-CSDN部落格) @Aspect:宣告一個切面(類上),使用@After、@Before、@Around定義建言(advice),可直接將攔截規則(切點)作為引數。

@After :在方法執行之後執行(方法上)

@Before :在方法執行之前執行(方法上)

@Around :在方法執行之前與之後執行(方法上)

@PointCut :宣告切點在java配置類中使用@EnableAspectJAutoProxy註解開啟Spring對AspectJ代理的支援(類上)

@Bean的屬性支援

@Scope 設定Spring容器如何新建Bean例項(方法上,得有@Bean),其設定型別包括:

Singleton:單例,一個Spring容器中只有一個bean例項,預設模式

Protetype:每次呼叫新建一個bean

Request:web專案中,給每個http request新建一個bean

Session :web專案中,給每個http session新建一個bean

Global:Session給每一個 global http session新建一個Bean例項

@StepScope:在Spring Batch中還有涉及(Spring Batch 之 背景框架簡介_vincent-CSDN部落格)

@PostConstruct :由JSR-250提供,在建構函式執行完之後執行,等價於xml配置檔案中bean的initMethod

@PreDestory :由JSR-250提供,在Bean銷燬之前執行,等價於xml配置檔案中bean的destroyMethod

@Value註解

為屬性注入值,支援如下方式的注入:注入普通字元

Spring 面試 全面詳情(收藏)

注入作業系統屬性

Spring 面試 全面詳情(收藏)

注入表示式結果

Spring 面試 全面詳情(收藏)

注入其它bean屬性

Spring 面試 全面詳情(收藏)

注入檔案資源

Spring 面試 全面詳情(收藏)

注入網站資源

Spring 面試 全面詳情(收藏)

注入配置檔案

Spring 面試 全面詳情(收藏)

@PropertySource 載入配置檔案(類上),還需配置一個PropertySourcesPlaceholderConfigurer的bean。

環境切換

@Profile :透過設定Environment的ActiveProfiles來設定當前context需要使用的配置環境。(類或方法上)

@Conditional:Spring4中可以使用此註解定義條件話的bean,透過實現Condition介面,並重寫matches方法,從而決定該bean是否被例項化。(方法上)

非同步相關

@EnableAsync:配置類中,透過此註解開啟對非同步任務的支援,敘事性AsyncConfigurer介面(類上)

@Async:在實際執行的bean方法使用該註解來申明其是一個非同步任務(方法上或類上所有的方法都將非同步,需要@EnableAsync開啟非同步任務)

定時任務相關

@EnableScheduling :在配置類上使用,開啟計劃任務的支援(類上)

@Scheduled :來申明這是一個任務,包括cron,fixDelay,fixRate等型別(方法上,需先開啟計劃任務的支援)

@Enable 註解說明

這些註解主要用來開啟對xxx的支援。@EnableAspectJAutoProxy :開啟對AspectJ自動代理的支援

@EnableAsync :開啟非同步方法的支援

@EnableScheduling :開啟計劃任務的支援

@EnableWebMvc :開啟Web MVC的配置支援

@EnableConfigurationProperties :開啟對@ConfigurationProperties註解配置Bean的支援

@EnableJpaRepositories :開啟對SpringData JPA Repository的支援

@EnableTransactionManagement :開啟註解式事務的支援

@EnableCaching :開啟註解式的快取支援

測試相關注解

@RunWith :執行器,Spring中通常用於對JUnit的支援

@ContextConfiguration:用來載入配置ApplicationContext,其中classes屬性用來載入配置類

*SpringMVC部分*

@EnableWebMvc :在配置類中開啟Web MVC的配置支援,如一些ViewResolver或者MessageConverter等,若無此句,重寫WebMvcConfigurerAdapter方法(用於對SpringMVC的配置)。

@Controller :宣告該類為SpringMVC中的Controller

@RequestMapping :用於對映Web請求,包括訪問路徑和引數(類或方法上)

@ResponseBody :支援將返回值放在response內,而不是一個頁面,通常使用者返回json資料(返回值旁或方法上)

@RequestBody :允許request的引數在request體中,而不是在直接連線在地址後面。(放在引數前)

@PathVariable :用於接收路徑引數,比如@RequestMapping(“/hello/{name}”)申明的路徑,將註解放在引數中前,即可獲取該值,通常作為Restful的介面實現方法。

@RestController :該註解為一個組合註解,相當於@Controller和@ResponseBody的組合,註解在類上,意味著,該Controller的所有方法都預設加上了@ResponseBody。

@ControllerAdvice :透過該註解,我們可以將對於控制器的全域性配置放置在同一個位置,註解了@Controller的類的方法可使用@ExceptionHandler、@InitBinder、@ModelAttribute註解到方法上,這對所有註解了 @RequestMapping的控制器內的方法有效。

@ExceptionHandler :用於全域性處理控制器裡的異常

@InitBinder :用來設定WebDataBinder,WebDataBinder用來自動繫結前臺請求引數到Model中。

@ModelAttribute :本來的作用是繫結鍵值對到Model裡,在@ControllerAdvice中是讓全域性的@RequestMapping:都能獲得在此處設定的鍵值對。

如果本文對你有幫助,別忘記給我個3連 ,點贊,轉發,評論,

,咱們下期見。

收藏 等於白嫖,點贊才是真情。

Spring 面試 全面詳情(收藏)