Spring知識點提煉

原文地址:http://blog.csdn.net/u013256816/article/details/51386182  內容有必定修改


1. Spring框架的做用

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

2. Spring的組成

Spring由7個模塊組成:css

  • Spring Core: 核心容器提供 Spring 框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。
  • Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
  • Spring AOP:經過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。因此,能夠很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。經過使用 Spring AOP,不用依賴 EJB 組件,就能夠將聲明性事務管理集成到應用程序中。
  • Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不一樣數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,而且極大地下降了須要編寫的異常代碼數量(例如打開和關閉鏈接)。Spring DAO 的面向 JDBC 的異常聽從通用的 DAO 異常層次結構。
  • Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。全部這些都聽從 Spring 的通用事務和 DAO 異常層次結構。
  • Spring Web 模塊:Web 上下文模塊創建在應用程序上下文模塊之上,爲基於 Web 的應用程序提供了上下文。因此,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做。
  • Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。經過策略接口,MVC 框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

3. Spring容器

Sping的容器能夠分爲兩種類型前端

1. BeanFactory:(org.springframework.beans.factory.BeanFactory接口定義)是最簡答的容器,提供了基本的DI支持。最經常使用的BeanFactory實現就是XmlBeanFactory類,它根據XML文件中的定義加載beans,該容器從XML文件讀取配置元數據並用它去建立一個徹底配置的系統或應用。java

2. ApplicationContext應用上下文:(org.springframework.context.ApplicationContext)基於BeanFactory之上構建,並提供面向應用的服務。web

4. ApplicationContext一般的實現

  • ClassPathXmlApplicationContext:從類路徑下的XML配置文件中加載上下文定義,把應用上下文定義文件當作類資源。
  • FileSystemXmlApplicationContext:讀取文件系統下的XML配置文件並加載上下文定義。
  • XmlWebApplicationContext:讀取Web應用下的XML配置文件並裝載上下文定義。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

5. IOC & DI

Inversion of Control, 通常分爲兩種類型:依賴注入DI(Dependency Injection)和依賴查找(Dependency Lookup).依賴注入應用比較普遍。面試

Spring IOC扶着建立對象,管理對象(DI),裝配對象,配置對象,而且管理這些對象的整個生命週期。spring

優勢:把應用的代碼量降到最低。容器測試,最小的代價和最小的侵入性使鬆散耦合得以實現。IOC容器支持加載服務時的餓漢式初始化和懶加載。數據庫

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

IOC的注入方式:1. 構造器依賴注入;2. Setter方法注入。編程

6. 如何給spring容器提供配置元數據

  • XML配置文件
  • 基於註解的配置
  • 基於Java的配置@Configuration, @Bean

7. bean標籤中的屬性:

id設計模式

name

class

init-method:Bean實例化後會馬上調用的方法

destory-method:Bean從容器移除和銷燬前,會調用的方法

factory-method:運行咱們調用一個指定的靜態方法,從而代替構造方法來建立一個類的實例。

scope:Bean的做用域,包括singleton(默認),prototype(每次調用都建立一個實例), request,session, global-session(注意spring中的單例bean不是線程安全的)

autowired:自動裝配 byName, byType, constructor, autodetect(首先闡釋使用constructor自動裝配,若是沒有發現與構造器相匹配的Bean時,Spring將嘗試使用byType自動裝配)

8. beans標籤中相關屬性

default-init-method

default-destory-method

default-autowire:默認爲none,應用於Spring配置文件中的全部Bean,注意這裏不是指Spring應用上下文,由於你能夠定義多個配置文件

9. Bean的生命週期

  1. Bean的構造
  2. 調用setXXX()方法設置Bean的屬性
  3. 調用BeanNameAware的setBeanName()
  4. 調用BeanFactoryAware的setBeanFactory()方法
  5. 調用BeanPostProcessor的postProcessBeforeInitialization()方法
  6. 調用InitializingBean的afterPropertiesSet()方法
  7. 調用自定義的初始化方法
  8. 調用BeanPostProcessor類的postProcessAfterInitialization()方法
  9. 調用DisposableBean的destroy()方法
  10. 調用自定義的銷燬方法

10. Spring中注入集合

  1. 容許值相同
  2. 不容許值相同
  3. 鍵和值均可覺得任意類型,key, key-ref, value-ref, value能夠任意搭配

  4. XXX鍵和值都只能是String類型

11. 裝配空值

<property name="xxx"><null/></property>

12. 自動裝配(autowiring)

有助於減小甚至消除配置和元素,讓Spring自動識別如何裝配Bean的依賴關係。<context:annotation-config/>與之對應的是:自動檢測(autodiscovery),比自動裝配更近了一步,讓Spring可以自動識別哪些類須要被配置成SpringBean,從而減小對元素的使用。<context:component-scan>

13. 註解

Spring容器默認禁用註解裝配。最簡單的開啓方式<context:annotation-config/>。Spring支持的幾種不一樣的用於自動裝配的註解:

  • Spring自帶的@Autowired註解
  • JSR-330的@Inject註解
  • JSR-250的@Resource註解

14. @Autowired

@Autowired具備強契約特徵,其所標註的屬性或參數必須是可裝配的。若是沒有Bean能夠裝配到@Autowired所標註的屬性或參數中,自動裝配就會失敗,拋出NoSuchBeanDefinitionException.屬性不必定非要裝配,null值也是能夠接受的。在這種場景下能夠經過設置@Autowired的required屬性爲false來配置自動裝配是可選的,如:

@Autowired(required=false)
private Object obj;

注意required屬性能夠用於@Autowired註解所使用的任意地方。可是當使用構造器裝配時,只有一個構造器能夠將@Autowired的required屬性設置爲true。其餘使用@Autowired註解所標註的構造器只能將required屬性設置爲false。此外,當使用@Autowired標註多個構造器時,Spring就會從全部知足裝配條件的構造器中選擇入參最多的那個構造器。可使用@Qualifier明確指定要裝配的Bean.以下:

@Autowired@Qualifier("objName")
private Object obj;

15. 自定義的限定器

@Target({ElementType.FIELF, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifierpublic @Interface SpecialQualifier{}

此時,能夠經過自定義的@SpecialQualifier註解來代替@Qualifier來標註,也能夠和@Autowired一塊兒使用:

@Autowired@SpecialQualifierprivate Object obj;

此時,Spring會把自動裝配的範圍縮小到被@SpecialQualifier標註的Bean中。若是被@SpecialQualifier標註的Bean有多個,咱們還能夠經過自定義的另外一個限定器@SpecialQualifier2來進一步縮小範圍。

16. @Autowired優缺點

Spring的@Autowired註解是減小Spring XML配置的一種方式。可是它的類會映入對Spring的特定依賴(即便依賴只是一個註解)。

17. @Inject

和@Autowired註解同樣,@Inject能夠用來自動裝配屬性、方法和構造器;與@Autowired不一樣的是,@Inject沒有required屬性。所以@Inject註解所標註的依賴關係必須存在,若是不存在,則會拋出異常。

18. @Named

相對於@Autowired對應的Qualifier,@Inject所對應的是@Named註解。

@Inject@Named("objName")
private Object obj;

19. SpEL表達式

語法形式在#{}中使用表達式,如:

<property name="count" value="#{5}"/>

20. @Value

@Value是一個新的裝配註解,可讓咱們使用註解裝配String類型的值和基本類型的值,如int, boolean。咱們能夠經過@Value直接標註某個屬性,方法或者方法參數,並傳入一個String類型的表達式來裝配屬性,如:

@Value("Eruption")
private String song;

@Value能夠配合SpEL表達式一塊兒使用,譬若有些狀況下須要讀取properties文件中的內容,可使用:

@Value("#{configProperties['ora_driver']}")

詳細能夠參考 Spring+Mybatis多數據源配置(三)——Spring如何獲取Properties文件的信息

21. 自動檢測Bean

<context:component-scan>元素除了完成與<context:annotation-config>同樣的工做,還容許Spring自動檢測Bean和定義Bean.<context:component-scan>元素會掃描指定的包和其全部子包,以下:

<context:component-scan base-package="com.zzh.dao" />

22. 爲自動檢測標註Bean

默認狀況下,查找使用構造型(stereotype)註解所標註的類,這些特殊的註解以下:

- @Component:通用的構造型註解,標誌此類爲Spring組件

- @Controller:標識將該類定義爲SpringMVC controller

- @Repository:標識將該類定義爲數據倉庫

- @Service:標識將該類定義爲服務

以@Component爲例:

@Componentpublic class Guitar implements Intrument{}

這裏@Component會自動註冊Guitar 爲Spring Bean,並設置默認的Bean的Id爲guitar,首字母大寫變小寫。注意若是第一個和第二個字母都是大寫,默認的Bean的id會有特殊處理。也能夠指定Bean的Id如:

@Component("guitarOne")
public class Guitar implements Intrument{}

23. AOP

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

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

關注點是應用中的一個模塊的行爲,一個關注點可能會被定義成一個咱們想實現的一個功能。

橫切關注點一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,好比日誌,安全和數據傳輸,幾乎應用的每一個模塊都須要的功能。所以這些都屬於橫切關注點。

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

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

引入運行咱們在已存在的類中添加新的方法和屬性。

24. AOP通知

通知是個在方法執行先後要作的動做,其實是程序執行時要經過SpringAOP框架觸發的代碼

Spring切面能夠應用五種類型的通知:

before:前置通知,在一個方法執行前被調用。@Before

after: 在方法執行以後調用的通知,不管方法執行是否成功。@After

after-returning: 僅當方法成功完成後執行的通知。@AfterReturning

after-throwing: 在方法拋出異常退出時執行的通知。@AfterThrowing

around: 在方法執行以前和以後調用的通知。@Around

25. Spring的事務類型

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

26. ACID

  1. Atomic原子性:事務是由一個或多個活動所組成的一個工做單元。原子性確保事務中的全部操做所有發生或者所有不發生。
  2. Consistent一致性:一旦事務完成,系統必須確保它所建模的業務處於一致的狀態
  3. Isolated隔離線:事務容許多個用戶對象頭的數據進行操做,每一個用戶的操做不會與其餘用戶糾纏在一塊兒。
  4. Durable持久性:一旦事務完成,事務的結果應該持久化,這樣就能從任何的系統崩潰中恢復過來。

27. JDBC事務

若是在應用程序中直接使用JDBC來進行持久化,譬如博主採用的是Mybatis,DataSourceTransactionManager會爲你處理事務邊界。譬如:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="zzh" />
<property name="password" value="zzh" />
<property name="validationQuery" value="SELECT 1"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

28. JTA事務

若是你的事務須要跨多個事務資源(例如:兩個或多個數據庫;或者如Sping+ActiveMQ整合 須要將ActiveMQ和數據庫的事務整合起來),就須要使用JtaTransactionManager:

<bean id="jtaTransactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"/>

JtaTransactionManager將事務管理的職責委託給了一個JTA的實現。JTA規定了應用程序與一個或多個數據源之間協調事務的標準API。transactionManagerName屬性指明瞭要在JNDI上查找的JTA事務管理器。JtaTransactionManager將事務管理的職責委託給javax.transaction.UserTransaction和javax.transaction.TransactionManager對象。經過UserTransaction.commit()方法來提交事務。相似地,若是事務失敗,UserTransaction的rollback()方法將會被調用。

29. 聲明式事務

儘管Spring提供了多種聲明式事務的機制,可是全部的方式都依賴這五個參數來控制如何管理事務策略。所以,若是要在Spring中聲明事務策略,就要理解這些參數。(@Transactional)

1. 傳播行爲(propagation)

  • ISOLATION_DEFAULT: 使用底層數據庫預設的隔離層級
  • ISOLATION_READ_COMMITTED: 容許事務讀取其餘並行的事務已經送出(Commit)的數據字段,能夠防止Dirty read問題
  • ISOLATION_READ_UNCOMMITTED: 容許事務讀取其餘並行的事務還沒送出的數據,會發生Dirty、Nonrepeatable、Phantom read等問題
  • ISOLATION_REPEATABLE_READ: 要求屢次讀取的數據必須相同,除非事務自己更新數據,可防止Dirty、Nonrepeatable read問題
  • ISOLATION_SERIALIZABLE: 完整的隔離層級,可防止Dirty、Nonrepeatable、Phantom read等問題,會鎖定對應的數據表格,於是有效率問題

2. 隔離級別(isolation)

  • PROPAGATION_REQUIRED–支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。
  • PROPAGATION_SUPPORTS–支持當前事務,若是當前沒有事務,就以非事務方式執行。
  • PROPAGATION_MANDATORY–支持當前事務,若是當前沒有事務,就拋出異常。
  • PROPAGATION_REQUIRES_NEW–新建事務,若是當前存在事務,把當前事務掛起。
  • PROPAGATION_NOT_SUPPORTED–以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
  • PROPAGATION_NEVER–以非事務方式執行,若是當前存在事務,則拋出異常。
  • PROPAGATION_NESTED–若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則進行與PROPAGATION_REQUIRED相似的操做。

3. 只讀(read-only)

若是事務只進行讀取的動做,則能夠利用底層數據庫在只讀操做時發生的一些最佳化動做,因爲這個動做利用到數據庫在只讀的事務操做最佳化,於是必須在事務中才有效,也就是說要搭配傳播行爲PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED來設置。

4. 事務超時(timeout)

有的事務操做可能延續很長一段的時間,事務自己可能關聯到數據表的鎖定,於是長時間的事務操做會有效率上的問題,對於過長的事務操做,考慮Roll back事務並要求從新操做,而不是無限時的等待事務完成。 能夠設置事務超時期間,計時是從事務開始時,因此這個設置必須搭配傳播行爲PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED來設置。

5. 回滾規則(rollback-for, no-rollback-for):rollback-for指事務對於那些檢查型異常應當回滾而不提交;no-rollback-for指事務對於那些異常應當繼續運行而不回滾。默認狀況下,Spring聲明事務對全部的運行時異常都進行回滾。

<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" /></tx:attributes></tx:advice>

30. SpringMVC

核心架構的具體流程:

  1. 首先用戶發送請求——>DispatcherServlet,前端控制器收到請求後本身不進行處理,而是委託給其餘的解析器進行處理,做爲統一訪問點,進行全局的流程控制;
  2. DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射爲HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,經過這種策略模式,很容易添加新的映射策略;
  3. DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器 設計模式 的應用,從而很容易支持不少類型的處理器;
  4. HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;並返回一個ModelAndView對象(包含模型數據、邏輯視圖名);
  5. ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析爲具體的View,經過這種策略模式,很容易更換其餘視圖技術;
  6. View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,所以很容易支持其餘視圖技術;
  7. 返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。

31. DispatcherServlet

SpringMVC的核心是DispatcherServlet,這個Servlet充當SpringMVC的前端控制器。與其餘Servlet同樣,DispatcherServlet必須在Web應用程序的web.xml文件中進行配置。

<servlet>
<servlet-name>viewspace</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

默認狀況下,DispatcherServlet在加載時會從一個基於這個Servlet名字的XML文件中加載Spring應用上下文。由於servlet的名字是viewspace,因此配置文件的名稱爲viewspace-servlet.xml接下來,必須申明DispatcherServlet處理那些URL:

<servlet-mapping>
<servlet-name>viewspace</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

經過將DispatcherServlet映射到/,聲明瞭它會做爲默認的servlet而且會處理全部的請求,包括對靜態資源的請求。能夠配置:

<mvc:resources mapping="/images/**" location="/images/"cache-period="31556926" />
<mvc:resources mapping="/js/**" location="/js/"cache-period="31556926" />
<mvc:resources mapping="/css/**" location="/css/"cache-period="31556926" />

處理靜態資源。

32. 配置HandlerMapping

Spring自帶了多個處理器映射實現:

  • BeanNameUrlHandlerMapping:根據控制器Bean的名字將控制器映射到URL。
  • ControllerBeanNameHandlerMapping:與BeanNameUrlHandlerMapping相似,根據控制器Bean的名字將控制器映射到URL。使用該處理器映射實現,Bean的名字不須要遵循URL的約定。
  • ControllerClassNameHandlerMapping:經過使用控制器的類名做爲URL基礎將控制器映射到URL。
  • DefaultAnnotationHandlerMapping:將請求映射給使用@RequestingMapping註解的控制器和控制器方法。
  • SimpleUrlHandlerMapping:使用定義在Spring應用上下文的熟悉集合將控制器映射到URL。 
    使用如上這些處理器映射一般只需在Spring中配置一個Bean。若是沒有找處處理器映射Bean,DisapatchServlet將建立並使用BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping。咱們通常使用基於註解的控制器類。
<mvc:annotation-driven />
<bean id="defaultAnnotationHandlerMapping"class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>

在構建控制器的時候,咱們還須要使用註解將請求參數綁定到控制器的方法參數上進行校驗以及信息轉換。提供註解驅動的特性。

33. 配置HandlerAdapter

<bean id="annotationMethodHandlerAdapter"class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

34. 配置視圖

在SpringMVC中大齡使用了約定優於配置的開發模式。InternalResourceViewResolver就是一個面向約定的元素。它將邏輯視圖名稱解析爲View對象,而該對象將渲染的任務委託給Web應用程序上下文中的一個模板

<!-- 配置視圖解析器,將ModelAndView及字符串解析爲具體的頁面 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

當DispatcherServlet要求InternalResourceViewResolver解析視圖的時候,它將獲取一個邏輯視圖名稱,添加」/WEB-INF/jsp/」前綴和」.jsp」後綴。等待的結果就是渲染輸出的JSP路徑。在內部,InternalResourceViewResolver接下來會將這個路徑傳遞給View對象,View對象將請求傳遞給JSP.

持續更新~~~請保留轉載鏈接~

參考文獻

1. 《Sping In Action》 Craig Walls.

2.  69道Spring面試題和答案

3.  Sping+ActiveMQ整合




相關文章
相關標籤/搜索