Spring面試題總結

一、什麼是Spring?

Spring是一個輕量級IoCAOP容器框架。目的是解決企業應用開發的複雜性,使用基本的JavaBean來完成之前只可能由EJB完成的事情,並提供了更多的企業應用功能,Spring的用途不只限於服務器端的開發,從簡單性、可測試性和鬆耦合的角度而言,任何Java應用均可以從Spring中受益。Spring 框架目標是簡化Java企業級應用開發,並經過POJO爲基礎的編程模型促進良好的編程習慣。前端

二、使用Spring框架的好處是什麼?

  • 輕量:Spring 是輕量的,基本的版本大約2MB。
  • 控制反轉:Spring經過控制反轉實現了鬆耦合,對象們給出它們的依賴,而不是建立或查找依賴的對象們。
  • 面向切面的編程(AOP):Spring支持面向切面的編程,而且把應用業務邏輯和系統服務分開。
  • 容器:Spring 包含並管理應用中對象的生命週期和配置。
  • MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
  • 事務管理:Spring 提供一個持續的事務管理接口,能夠擴展到上至本地事務下至全局事務(JTA)。
  • 異常處理:Spring 提供方便的API把具體技術相關的異常(好比由JDBC,Hibernate or JDO拋出的)轉化爲一致的unchecked 異常。

三、Spring由哪些模塊組成?

簡單能夠分紅6大模塊:java

  • Core :spring的核心功能: IOC容器, 解決對象建立及依賴關係
  • Web :Spring對web模塊的支持。web

    • 能夠與struts整合,讓struts的action建立交給spring
    • spring mvc模式
  • DAO :Spring 對jdbc操做的支持 【JdbcTemplate模板工具類】
  • ORM :spring對orm的支持:面試

    • 既能夠與hibernate整合,【session】
    • 也可使用spring的對hibernate操做的封裝
  • AOP :切面編程
  • SpringEE :spring 對javaEE其餘模塊的支持

clipboard.png

clipboard.png

  • core container(核心容器)spring

    • beans:全部應用都要用到的,它包含訪問配置文件,建立和管理bean以及進行控制反轉、依賴注入操做相關的全部類。
    • core核心模塊:提供基本組成部分,包括ioc和Di包含Spring框架基本的核心工具類,Spring的其餘組件都須要使用這個包裏的類。
    • context上下文模塊:訪問定義和配置的任何對象的媒介Context模塊構建於Core和Beans基礎之上,提供了一種相似JNDI註冊器的框架式的對象訪問方法,Context繼承了Beans的特性,爲Spring核心提供了大量擴展,追加了對國際化、事件傳播、資源加載和對Context的透明建立支持。
  • aop模塊:提供面向切面編程實現,定義方法攔截器和切入點。
  • aspects模塊:與aspectJ集成,AspectJ是面向切面框架。
  • spring應用上下文,說的簡單點就是容器的對象,是對spring容器抽象的實現

四、核心容器(應用上下文) 模塊。

這是基本的Spring模塊,提供spring 框架的基礎功能,BeanFactory 是 任何以spring爲基礎的應用的核心。Spring 框架創建在此模塊之上,它使Spring成爲一個容器。數據庫

五、BeanFactory實現舉例。

Bean 工廠是工廠模式的一個實現,提供了控制反轉功能,用來把應用的配置和依賴從正真的應用代碼中分離。
最經常使用的BeanFactory 實現是XmlBeanFactory 類。編程

六、XMLBeanFactory

最經常使用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根據XML文件中的定義加載beans。該容器從XML 文件讀取配置元數據並用它去建立一個徹底配置的系統或應用。segmentfault

七、解釋AOP模塊

AOP模塊用於發給咱們的Spring應用作面向切面的開發, 不少支持由AOP聯盟提供,這樣就確保了Spring和其餘AOP框架的共通性。這個模塊將元數據編程引入Spring。設計模式

八、解釋對象/關係映射集成模塊。

Spring 經過提供ORM模塊,支持咱們在直接JDBC之上使用一個對象/關係映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS SQL Maps。Spring的事務管理一樣支持以上全部ORM框架及JDBC。數組

九、解釋WEB模塊

Spring的WEB模塊是構建在application context模塊基礎之上,提供一個適合web應用的上下文。這個模塊也包括支持多種面向web的任務,如透明地處理多個文件上傳請求和程序級請求參數的綁定到你的業務對象。它也有對Jakarta Struts的支持。

十、Spring配置文件

Spring配置文件是個XML 文件,這個文件包含了類信息,描述瞭如何配置它們,以及如何相互調用。

十一、ApplicationContext一般的實現是什麼?

  • FileSystemXmlApplicationContext :此容器從一個XML文件中加載beans的定義,XML Bean 配置文件的全路徑名必須提供給它的構造函數。
  • ClassPathXmlApplicationContext:此容器也從一個XML文件中加載beans的定義,這裏,你須要正確設置classpath由於這個容器將在classpath裏找bean配置。
  • WebXmlApplicationContext:此容器加載一個XML文件,此文件定義了一個WEB應用的全部bean。

十二、BeanFactory和ApplicationContexts有什麼區別?

Application contexts提供一種方法處理文本消息,一個一般的作法是加載文件資源(好比鏡像),它們能夠向註冊爲監聽器的bean發佈事件。另外,在容器或容器內的對象上執行的那些不得不禁bean工廠以程序化方式處理的操做,能夠在Application contexts中以聲明的方式處理。Application contexts實現了MessageSource接口,該接口的實現以可插拔的方式提供獲取本地化消息的方法。

1三、一個Spring的應用看起來象什麼?

  • 一個定義了一些功能的接口。
  • 這實現包括屬性,它的Setter , getter 方法和函數等。
  • Spring AOP。
  • Spring 的XML 配置文件。
  • 使用以上功能的客戶端程序。

1四、FileSystemResource和ClassPathResource有何區別?

在FileSystemResource中須要給出spring-config.xml文件在你項目中的相對路徑或者絕對路徑。
在ClassPathResource中spring會在ClassPath中自動搜尋配置文件,因此要把ClassPathResource文件放在ClassPath下。
若是將spring-config.xml保存在了src文件夾下的話,只需給出配置文件的名稱便可,由於src 文件夾是默認。
簡而言之,ClassPathResource在環境變量中讀取配置文件,FileSystemResource在配置文件中讀取配置文件。

1五、怎麼回答面試官:你對Spring的理解?

來源:
https://www.zhihu.com/questio...
下面我就截幾個答案:
1、

2、

1六、Spring的核心類有哪些,各有什麼做用?

  • BeanFactory:產生一個新的實例,能夠實現單例模式
  • BeanWrapper:提供統一的get及set方法
  • ApplicationContext:提供框架的實現,包括BeanFactory的全部功能

1七、Spring 框架中都用到了哪些設計模式?

  • (1)代理模式—在AOP和remoting中被用的比較多。
  • (2)單例模式—在spring配置文件中定義的bean默認爲單例模式。
  • (3)工廠模式—BeanFactory用來建立對象的實例。
  • (4)模板方法—用來解決代碼重複的問題。好比RestTemplate, JmsTemplate, JpaTemplate。
  • (5)前端控制器—Spring提供了DispatcherServlet來對請求進行分發。
  • (6)視圖幫助(View Helper )—Spring提供了一系列的JSP標籤,高效宏來輔助將分散的代碼整合在視圖裏。
  • (7)依賴注入—貫穿於BeanFactory / ApplicationContext接口的核心理念。

1、依賴注入

一、什麼是Spring IOC 容器?

Spring IOC 負責建立對象,管理對象(經過依賴注入(DI),裝配對象,配置對象,而且管理這些對象的整個生命週期。
Spring的IoC理解
(1)IOC就是控制反轉。就是對象的建立權反轉交給Spring,由容器控制程序之間的依賴關係,做用是實現了程序的解耦合,而非傳統實現中,由程序代碼直接操控。(依賴)控制權由應用代碼自己轉到了外部容器,由容器根據配置文件去建立實例並管理各個實例之間的依賴關係,控制權的轉移,是所謂反轉,而且由容器動態的將某種依賴關係注入到組件之中。BeanFactory 是Spring IoC容器的具體實現與核心接口,提供了一個先進的配置機制,使得任何類型的對象的配置成爲可能,用來包裝和管理各類bean。
(2)最直觀的表達就是,IOC讓對象的建立不用去new了,能夠由spring自動生產,這裏用的就是Java的反射機制,經過反射在運行時動態的去建立、調用對象。spring就是根據配置文件在運行時動態的去建立對象,並調用對象的方法的。
(3)Spring的IOC有三種注入方式 :

  • set方法注入;
  • 構造方法進行注入;
  • 註解進行注入。

詳細的說:
(4)IoC,控制反轉:將對象交給容器管理,你只須要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器生成類的實例對象以及管理對象。在spring容器啓動的時候,spring會把你在配置文件中配置的bean都初始化以及裝配好,而後在你須要調用的時候,就把它已經初始化好的那些bean分配給你須要調用這些bean的類。就是將對象的控制權反轉給spring容器管理。
(5)DI機制(Dependency Injection,依賴注入):能夠說是IoC的其中一個內容,在容器實例化對象的時候主動的將被調用者(或者說它的依賴對象)注入給調用對象。好比對象A須要操做數據庫,之前咱們老是要在A中本身編寫代碼來得到一個Connection對象,有了 spring咱們就只須要告訴spring,A中須要一個Connection,至於這個Connection怎麼構造,什麼時候構造,A不須要知道。在系統運行時,spring會在適當的時候製造一個Connection,而後像打針同樣,注射到A當中,這樣就完成了對各個對象之間關係的控制。

二、IOC的優勢是什麼?

IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試,單元測試再也不須要單例和JNDI查找機制。最小的代價和最小的侵入性使鬆散耦合得以實現。IOC容器支持加載服務時的餓漢式初始化和懶加載。

三、請問什麼是IoC和DI?而且簡要說明一下DI是如何實現的?

IoC叫控制反轉,是Inversion of Control的縮寫,DI(Dependency Injection)叫依賴注入,是對IoC更簡單的詮釋。控制反轉是把傳統上由程序代碼直接操控的對象的調用權交給容器,經過容器來實現對象組件的裝配和管理。所謂的"控制反轉"就是對組件對象控制權的轉移,從程序代碼自己轉移到了外部容器,由容器來建立對象並管理對象之間的依賴關係。IoC體現了好萊塢原則 - "Don’t call me, we will call you"。依賴注入的基本原則是應用組件不該該負責查找資源或者其餘依賴的協做對象。配置對象的工做應該由容器負責,查找資源的邏輯應該從應用組件的代碼中抽取出來,交給容器來完成。DI是對IoC更準確的描述,即組件之間的依賴關係由容器在運行期決定,形象的來講,即由容器動態的將某種依賴關係注入到組件之中。
一個類A須要用到接口B中的方法,那麼就須要爲類A和接口B創建關聯或依賴關係,最原始的方法是在類A中建立一個接口B的實現類C的實例,但這種方法須要開發人員自行維護兩者的依賴關係,也就是說當依賴關係發生變更的時候須要修改代碼並從新構建整個系統。若是經過一個容器來管理這些對象以及對象的依賴關係,則只須要在類A中定義好用於關聯接口B的方法(構造器或setter方法),將類A和接口B的實現類C放入容器中,經過對容器的配置來實現兩者的關聯。
依賴注入能夠經過setter方法注入(設值注入)、構造器注入和接口注入三種方式來實現,Spring支持setter注入和構造器注入,一般使用構造器注入來注入必須的依賴關係,對於可選的依賴關係,則setter注入是更好的選擇,setter注入須要類提供無參構造器或者無參的靜態工廠方法來建立對象。

四、請說明一下springIOC原理是什麼?若是你要實現IOC須要怎麼作?請簡單描述一下實現步驟?

IoC(Inversion of Control,控制倒轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來講,就是由spring來負責控制對象的生命週期和對象間的關係。
IoC的一個重點是在系統運行中,動態的向某個對象提供它所須要的其餘對象。這一點是經過DI(Dependency Injection,依賴注入)來實現的。好比對象A須要操做數據庫,之前咱們老是要在A中本身編寫代碼來得到一個Connection對象,有了spring咱們就只須要告訴spring,A中須要一個Connection,至於這個Connection怎麼構造,什麼時候構造,A不須要知道。在系統運行時,spring會在適當的時候製造一個Connection,而後像打針同樣,注射到A當中,這樣就完成了對各個對象之間關係的控制。A須要依賴Connection才能正常運行,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實現的呢? Java 1.3以後一個重要特徵是反射(reflection),它容許程序在運行的時候動態的生成對象、執行對象的方法、改變對象的屬性,spring就是經過反射來實現注入的。
舉個簡單的例子,咱們找女友常見的狀況是,咱們處處去看哪裏有長得漂亮身材又好的女孩子,而後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,這個過程是複雜深奧的,咱們必須本身設計和麪對每一個環節。傳統的程序開發也是如此,在一個對象中,若是要使用另外的對象,就必須獲得它(本身new一個,或者從JNDI中查詢一個),使用完以後還要將對象銷燬(好比Connection等),對象始終會和其餘的接口或類藕合起來。
②實現IOC的步驟
定義用來描述bean的配置的Java類
解析bean的配置,將bean的配置信息轉換爲上面的BeanDefinition對象保存在內存中,spring中採用HashMap進行對象存儲,其中會用到一些xml解析技術
遍歷存放BeanDefinition的HashMap對象,逐條取出BeanDefinition對象,獲取bean的配置信息,利用Java的反射機制實例化對象,將實例化後的對象保存在另一個Map中便可。

五、什麼是Spring的依賴注入?

依賴注入,是IOC的一個方面,是個一般的概念,它有多種解釋。這概念是說你不用建立對象,而只須要描述它如何被建立。你不在代碼裏直接組裝你的組件和服務,可是要在配置文件裏描述哪些組件須要哪些服務,以後一個容器(IOC容器)負責把他們組裝起來。

六、有哪些不一樣類型的IOC(依賴注入)方式?

  • 構造器依賴注入:構造器依賴注入經過容器觸發一個類的構造器來實現的,該類有一系列參數,每一個參數表明一個對其餘類的依賴。
  • Setter方法注入:Setter方法注入是容器經過調用無參構造器或無參static工廠 方法實例化bean以後,調用該bean的setter方法,即實現了基於setter的依賴注入。
  • 工廠注入:這個是遺留下來的,不多用的了!

七、構造方法注入和設值注入有什麼區別?

請注意如下明顯的區別:
在設值注入方法支持大部分的依賴注入,若是咱們僅須要注入int、string和long型的變量,咱們不要用設值的方法注入。對於基本類型,若是咱們沒有注入的話,能夠爲基本類型設置默認值。在構造方法注入不支持大部分的依賴注入,由於在調用構造方法中必須傳入正確的構造參數,不然的話爲報錯。
設值注入不會重寫構造方法的值。若是咱們對同一個變量同時使用了構造方法注入又使用了設置方法注入的話,那麼構造方法將不能覆蓋由設值方法注入的值。很明顯,由於構造方法盡在對象被建立時調用。
在使用設值注入時有可能還不能保證某種依賴是否已經被注入,也就是說這時對象的依賴關係有多是不完整的。而在另外一種狀況下,構造器注入則不容許生成依賴關係不完整的對象。
在設值注入時若是對象A和對象B互相依賴,在建立對象A時Spring會拋出sObjectCurrentlyInCreationException異常,由於在B對象被建立以前A對象是不能被建立的,反之亦然。因此Spring用設值注入的方法解決了循環依賴的問題,因對象的設值方法是在對象被建立以前被調用的。

八、哪一種依賴注入方式你建議使用,構造器注入,仍是Setter方法注入?

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

九、請舉例說明如何在Spring中注入一個Java Collection?

Spring提供瞭如下四種集合類的配置元素:

  • <list> : 該標籤用來裝配可重複的list值。
  • <set> : 該標籤用來裝配沒有重複的set值。
  • <map>: 該標籤可用來注入鍵和值能夠爲任何類型的鍵值對。
  • <props> : 該標籤支持注入鍵和值都是字符串類型的鍵值對。

2、Spring Beans

一、什麼是Spring beans?

Spring beans是那些造成Spring應用的主幹的Java對象。它們被Spring IOC容器初始化,裝配,和管理。這些beans經過容器中配置的元數據建立。好比,以XML文件中<bean/>的形式定義。
這裏有四種重要的方法給Spring容器提供配置元數據。
• XML配置文件。
• 基於註解的配置。
• 基於java的配置。
• Groovy DSL配置

Spring框架定義的beans都是單件beans。在bean tag中有個屬性」singleton」,若是它被賦爲TRUE,bean 就是單件,不然就是一個 prototype bean。默認是TRUE,因此全部在Spring框架中的beans 缺省都是單件。

二、一個Spring Bean定義包含什麼?

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

三、如何給Spring容器提供配置元數據?

這裏有三種重要的方法給Spring 容器提供配置元數據。
• XML配置文件。
• 基於註解的配置。
• 基於Java的配置。

四、你怎樣定義類的做用域?

當定義一個<bean> 在Spring裏,咱們還能給這個bean聲明一個做用域。它能夠經過bean 定義中的scope屬性來定義。如,當Spring要在須要的時候每次生產一個新的bean實例,bean的scope屬性被指定爲prototype。另外一方面,一個bean每次使用的時候必須返回同一個實例,這個bean的scope 屬性 必須設爲 singleton。

五、解釋Spring支持的幾種bean的做用域。

Spring框架支持如下五種bean的做用域:
• singleton : bean在每一個Spring ioc 容器中只有一個實例。
• prototype:一個bean的定義能夠有多個實例(每次從容器中調用Bean時,都會返回一個新的實例,prototype一般翻譯爲原型)。
• request:每次http請求都會建立一個bean,該做用域僅在基於web的Spring ApplicationContext情形下有效。
• session:在一個HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
• global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的做用域是Singleton.

六、Spring框架中的單例bean是線程安全的嗎?

不,Spring框架中的單例bean不是線程安全的。

七、解釋Spring框架中bean的生命週期。

(1)實例化一個Bean--也就是咱們常說的new;
(2)按照Spring上下文對實例化的Bean進行配置--也就是IOC注入;
(3)若是這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(String)方法,此處傳遞的就是Spring配置文件中Bean的id值;
(4)若是這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(能夠用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就能夠);
(5)若是這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(一樣這個方式也能夠實現步驟4的內容,但比4更好,由於ApplicationContext是BeanFactory的子接口,有更多的實現方法);
(6)若是這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor常常被用做是Bean內容的更改,而且因爲這個是在Bean初始化結束時調用那個的方法,也能夠被應用於內存或緩存技術;
(7)若是Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法。
(8)若是這個Bean關聯了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法、;
注:以上工做完成之後就能夠應用這個Bean了,那這個Bean是一個Singleton的,因此通常狀況下咱們調用同一個id的Bean會是在內容地址相同的實例,固然在Spring配置文件中也能夠配置非Singleton。
(9)當Bean再也不須要時,會通過清理階段,若是Bean實現了DisposableBean這個接口,會調用那個其實現的destroy()方法;
(10)最後,若是這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法。

八、 哪些是重要的bean生命週期方法?你能重載它們嗎?

有兩個重要的bean 生命週期方法,第一個是setup , 它是在容器加載bean的時候被調用。第二個方法是 teardown 它是在容器卸載類的時候被調用。
The bean 標籤有兩個重要的屬性(init-method和destroy-method)。用它們你能夠本身定製初始化和註銷方法。它們也有相應的註解(@PostConstruct和@PreDestroy)。

九、什麼是Spring的內部bean?

當一個bean僅被用做另外一個bean的屬性時,它能被聲明爲一個內部bean,爲了定義inner bean,在Spring 的 基於XML的 配置元數據中,能夠在 <property/>或 <constructor-arg/> 元素內使用<bean/> 元素,內部bean一般是匿名的,它們的Scope通常是prototype。

十、在 Spring中如何注入一個java集合?

Spring提供如下幾種集合的配置元素:

  • <list>類型用於注入一列值,容許有相同的值。
  • <set> 類型用於注入一組值,不容許有相同的值。
  • <map> 類型用於注入一組鍵值對,鍵和值均可覺得任意類型。
  • <props>類型用於注入一組鍵值對,鍵和值都只能爲String類型。

十一、什麼是bean裝配?

裝配,或bean 裝配是指在Spring 容器中把bean組裝到一塊兒,前提是容器須要知道bean的依賴關係,如何經過依賴注入來把它們裝配到一塊兒。

十二、什麼是bean的自動裝配?

Spring 容器可以自動裝配相互合做的bean,這意味着容器不須要<constructor-arg>和<property>配置,能經過Bean工廠自動處理bean之間的協做。

1三、解釋不一樣方式的自動裝配

有五種自動裝配的方式,能夠用來指導Spring容器用自動裝配方式來進行依賴注入。

  • no:默認的方式是不進行自動裝配,經過顯式設置ref 屬性來進行裝配。
  • byName:經過參數(bean)名 自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byname,以後容器試圖匹配、裝配和該bean的屬性具備相同名字的bean。
  • byType::經過參數(bean)類型自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byType,以後容器試圖匹配、裝配和該bean的屬性具備相同類型的bean。若是有多個bean符合條件,則拋出錯誤。
  • constructor:這個方式相似於byType, 可是要提供給構造器參數,若是沒有肯定的帶參數的構造器參數類型,將會拋出異常。
  • autodetect:首先嚐試使用constructor來自動裝配,若是沒法工做,則使用byType方式。

自動裝配沒有自定義裝配方式那麼精確,並且不能自動裝配簡單屬性(基本類型、字符串等),在使用時應注意。

1四、自動裝配有哪些侷限性 ?

自動裝配的侷限性是:

  • 重寫: 你仍需用 <constructor-arg>和 <property> 配置來定義依賴,意味着總要重寫自動裝配。
  • 基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String字符串,和類。
  • 模糊特性:自動裝配不如顯式裝配精確,若是有可能,建議使用顯式裝配。

1五、你能夠在Spring中注入一個null 和一個空字符串嗎?

能夠。

1六、Spring框架中的單例Beans是線程安全的麼?

Spring框架並無對單例bean進行任何多線程的封裝處理。關於單例bean的線程安全和併發問題須要開發者自行去搞定。但實際上,大部分的Spring bean並無可變的狀態(好比Serview類和DAO類),因此在某種程度上說Spring的單例bean是線程安全的。若是你的bean有多種狀態的話(好比 View Model 對象),就須要自行保證線程安全。
最淺顯的解決辦法就是將多態bean的做用域由「singleton」變動爲「prototype」

3、Spring註解

一、什麼是基於Java的Spring註解配置? 給一些註解的例子.

基於Java的配置,容許你在少許的Java註解的幫助下,進行你的大部分Spring配置而非經過XML文件。
以@Configuration 註解爲例,它用來標記類能夠當作一個bean的定義,被Spring IOC容器使用。另外一個例子是@Bean註解,它表示此方法將要返回一個對象,做爲一個bean註冊進Spring應用上下文。

二、 什麼是基於註解的容器配置?

相對於XML文件,註解型的配置依賴於經過字節碼元數據裝配組件,而非尖括號的聲明。
開發者經過在相應的類,方法或屬性上使用註解的方式,直接組件類中進行配置,而不是使用xml表述bean的裝配關係。

三、怎樣開啓註解裝配?

註解裝配在默認狀況下是不開啓的,爲了使用註解裝配,咱們必須在Spring配置文件中配置 <context:annotation-config/>元素。

四、@Required註解

這個註解代表bean的屬性必須在配置的時候設置,經過一個bean定義的顯式的屬性值或經過自動裝配,若@Required註解的bean屬性未被設置,容器將拋出BeanInitializationException。

五、@Autowired註解

@Autowired 註解提供了更細粒度的控制,包括在何處以及如何完成自動裝配。它的用法和@Required同樣,修飾setter方法、構造器、屬性或者具備任意名稱和/或多個參數的PN方法。

六、@Qualifier註解

當有多個相同類型的bean卻只有一個須要自動裝配時,將@Qualifier 註解和@Autowire 註解結合使用以消除這種混淆,指定須要裝配的確切的bean。

七、若是有請談一下autowired 和resource區別是什麼?

一、共同點
二者均可以寫在字段和setter方法上。二者若是都寫在字段上,那麼就不須要再寫setter方法。
二、不一樣點
(1)@Autowired
@Autowired爲Spring提供的註解,須要導入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired註解是按照類型(byType)裝配依賴對象,默認狀況下它要求依賴對象必須存在,若是容許null值,能夠設置它的required屬性爲false。若是咱們想使用按照名稱(byName)來裝配,能夠結合@Qualifier註解一塊兒使用。
(2)@Resource
@Resource默認按照ByName自動注入,由J2EE提供,須要導入包javax.annotation.Resource。@Resource有兩個重要的屬性:name和type,而Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。因此,若是使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。若是既不制定name也不制定type屬性,這時將經過反射機制使用byName自動注入策略。

八、請說明一下@Controller和@RestController的區別是什麼?

@RestController註解至關於@ResponseBody + @Controller合在一塊兒的做用

九、Resource 是如何被查找、加載的?

Resource 接口是 Spring 資源訪問策略的抽象,它自己並不提供任何資源訪問實現,具體的資源訪問由該接口的實現類完成——每一個實現類表明一種資源訪問策略。 Spring 爲 Resource 接口提供了以下實現類:

  • UrlResource:訪問網絡資源的實現類。
  • ClassPathResource:訪問類加載路徑裏資源的實現類。
  • FileSystemResource:訪問文件系統裏資源的實現類。
  • ServletContextResource:訪問相對於 ServletContext 路徑裏的資源的實現類:
  • InputStreamResource:訪問輸入流資源的實現類。
  • ByteArrayResource:訪問字節數組資源的實現類。 這些 Resource 實現類,針對不一樣的的底層資源,提供了相應的資源訪問邏輯,並提供便捷的包裝,以利於客戶端程序的資源訪問。

4、Spring數據訪問

一、解釋JDBC抽象和DAO模塊。

經過使用JDBC抽象和DAO模塊,保證數據庫代碼的簡潔,並能避免數據庫資源錯誤關閉致使的問題,它在各類不一樣的數據庫的錯誤信息之上,提供了一個統一的異常訪問層。它還利用Spring的AOP 模塊給Spring應用中的對象提供事務管理服務。

二、在Spring框架中如何更有效地使用JDBC?

使用Spring JDBC框架,資源管理和錯誤處理的代價都會被減輕。因此開發者只需寫statements 和 queries從數據存取數據,JDBC也能夠在Spring框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate (例子見這裏here)

三、JdbcTemplate

JdbcTemplate類提供了不少便利的方法解決諸如把數據庫數據轉變成基本數據類型或對象,執行寫好的或可調用的數據庫操做語句,提供自定義的數據錯誤處理。

四、Spring對DAO的支持

Spring對數據訪問對象(DAO)的支持旨在簡化它和數據訪問技術如JDBC,Hibernate or JDO 結合使用。這使咱們能夠方便切換持久層。編碼時也不用擔憂會捕獲每種技術特有的異常。

五、使用Spring經過什麼方式訪問Hibernate?

在Spring中有兩種方式訪問Hibernate:

  • 控制反轉 Hibernate Template和 Callback。
  • 繼承 HibernateDAOSupport提供一個AOP 攔截器。

六、Spring支持的ORM

Spring支持如下ORM:

  • Hibernate
  • iBatis
  • JPA (Java Persistence API)
  • TopLink
  • JDO (Java Data Objects)
  • OJB

七、如何經過HibernateDaoSupport將Spring和Hibernate結合起來?

用Spring的 SessionFactory 調用 LocalSessionFactory。集成過程分三步:
• 配置the Hibernate SessionFactory。
• 繼承HibernateDaoSupport實現一個DAO。
• 在AOP支持的事務中裝配。

八、Spring支持的事務管理類型

Spring支持兩種類型的事務管理:

  • 編程式事務管理:這意味你經過編程的方式管理事務,給你帶來極大的靈活性,可是難維護。
  • 聲明式事務管理:這意味着你能夠將業務代碼和事務管理分離,你只需用註解和XML配置來管理事務。

九、Spring框架的事務管理有哪些優勢?

  • 它爲不一樣的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。
  • 它爲編程式事務管理提供了一套簡單的API而不是一些複雜的事務API如
  • 它支持聲明式事務管理。
  • 它和Spring各類數據訪問抽象層很好得集成。

十、你更傾向用那種事務管理類型?

大多數Spring框架的用戶選擇聲明式事務管理,由於它對應用代碼的影響最小,所以更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優於編程式事務管理,雖然比編程式事務管理(這種方式容許你經過代碼控制事務)少了一點靈活性。

5、Spring面向切面編程(AOP)

一、解釋AOP

面向切面的編程,或AOP, 是一種編程技術,容許程序模塊化橫向切割關注點,或橫切典型的責任劃分,如日誌和事務管理。

二、pring的AOP理解:

AOP,通常稱爲面向方面(切面)編程,做爲面向對象的一種補充,用於解剖封裝好的對象內部,找出其中對多個對象產生影響的公共行爲,並將其封裝爲一個可重用的模塊,這個模塊被命名爲「切面」(Aspect),切面將那些與業務無關,卻被業務模塊共同調用的邏輯提取並封裝起來,減小了系統中的重複代碼,下降了模塊間的耦合度,同時提升了系統的可維護性。可用於權限認證、日誌、事務處理。
AOP實現的關鍵在於AOP框架自動建立的AOP代理,AOP代理主要分爲靜態代理和動態代理。靜態代理的表明爲AspectJ;動態代理則以Spring AOP爲表明。
(1)AspectJ是靜態代理的加強,所謂靜態代理,就是AOP框架會在編譯階段生成AOP代理類,所以也稱爲編譯時加強,他會在編譯階段將AspectJ織入到Java字節碼中,運行的時候就是加強以後的AOP對象。
(2)Spring AOP使用的動態代理,所謂的動態代理就是說AOP框架不會去修改字節碼,而是每次運行時在內存中臨時爲方法生成一個AOP對象,這個AOP對象包含了目標對象的所有方法,而且在特定的切點作了加強處理,並回調原對象的方法。
Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理。JDK動態代理經過反射來接收被代理的類,而且要求被代理的類必須實現一個接口。JDK動態代理的核心是InvocationHandler接口和Proxy類。
若是目標類沒有實現接口,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB(Code Generation Library),是一個代碼生成的類庫,能夠在運行時動態的生成某個類的子類,注意,CGLIB是經過繼承的方式作的動態代理,所以若是某個類被標記爲final,那麼它是沒法使用CGLIB作動態代理的。

三、 AOP操做術語

鏈接點(Joinpoint):程序執行的某個特定位置(如:某個方法調用前、調用後,方法拋出異常後)。一個類或一段程序代碼擁有一些具備邊界性質的特定點,這些代碼中的特定點就是鏈接點。Spring僅支持方法的鏈接點。

切點(Pointcut):若是鏈接點至關於數據中的記錄,那麼切點至關於查詢條件,一個切點能夠匹配多個鏈接點。Spring AOP的規則解析引擎負責解析切點所設定的查詢條件,找到對應的鏈接點。
加強(Advice):加強是織入到目標類鏈接點上的一段程序代碼。Spring提供的加強接口都是帶方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。
引介(Introduction):引介是一種特殊的加強,它爲類添加一些屬性和方法。這樣,即便一個業務類本來沒有實現某個接口,經過引介功能,能夠動態的未該業務類添加接口的實現邏輯,讓業務類成爲這個接口的實現類。
織入(Weaving):織入是將加強添加到目標類具體鏈接點上的過程,AOP有三種織入方式:①編譯期織入:須要特殊的Java編譯期(例如AspectJ的ajc);②裝載期織入:要求使用特殊的類加載器,在裝載類的時候對類進行加強;③運行時織入:在運行時爲目標類生成代理實現加強。Spring採用了動態代理的方式實現了運行時織入,而AspectJ採用了編譯期織入和裝載期織入的方式。
切面(Aspect):切面是由切點和加強(引介)組成的,它包括了對橫切關注功能的定義,也包括了對鏈接點的定義。

四、Aspect切面

AOP核心就是切面,它將多個類的通用行爲封裝成可重用的模塊,該模塊含有一組API提供橫切功能。好比,一個日誌模塊能夠被稱做日誌的AOP切面。根據需求的不一樣,一個應用程序能夠有若干切面。在Spring AOP中,切面經過帶有@Aspect註解的類實現。

五、在Spring AOP中,關注點和橫切關注的區別是什麼?

關注點是應用中一個模塊的行爲,一個關注點可能會被定義成一個咱們想實現的一個功能。橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,好比日誌,安全和數據傳輸,幾乎應用的每一個模塊都須要的功能。所以這些都屬於橫切關注點。

六、鏈接點

鏈接點表明一個應用程序的某個位置,在這個位置咱們能夠插入一個AOP切面,它其實是個應用程序執行Spring AOP的位置。

七、通知

通知是個在方法執行前或執行後要作的動做,其實是程序執行時要經過SpringAOP框架觸發的代碼段。
Spring切面能夠應用五種類型的通知:

  • before:前置通知,在一個方法執行前被調用。
  • after: 在方法執行以後調用的通知,不管方法執行是否成功。
  • after-returning: 僅當方法成功完成後執行的通知。
  • after-throwing: 在方法拋出異常退出時執行的通知。
  • around: 在方法執行以前和以後調用的通知。

八、切點

切入點是一個或一組鏈接點,通知將在這些位置執行。能夠經過表達式或匹配的方式指明切入點。

九、什麼是引入?

引入容許咱們在已存在的類中增長新的方法和屬性。

十、什麼是目標對象?

被一個或者多個切面所通知的對象。它一般是一個代理對象。也指被通知(advised)對象。

十一、什麼是代理?

代理是通知目標對象後建立的對象。從客戶端的角度看,代理對象和目標對象是同樣的。

十二、有幾種不一樣類型的自動代理?

  • BeanNameAutoProxyCreator
  • DefaultAdvisorAutoProxyCreator
  • Metadata autoproxying

1三、什麼是織入。什麼是織入應用的不一樣點?

織入是將切面和到其餘應用類型或對象鏈接或建立一個被通知對象的過程。
織入能夠在編譯時,加載時,或運行時完成。

1四、解釋基於XML Schema方式的切面實現。

在這種狀況下,切面由常規類以及基於XML的配置實現。

1五、解釋基於註解的切面實現

在這種狀況下(基於@AspectJ的實現),涉及到的切面聲明的風格與帶有java5標註的普通java類一致。

參考資料:
https://segmentfault.com/a/11...
http://ifeve.com/spring-inter...

相關文章
相關標籤/搜索