Spring 核心概念

1.Spring IoC 容器

Spring 容器是 Spring 框架的核心。容器將創建對象,把它們連接在一起,配置它們,並管理他們的整個生命週期從創建到銷燬。Spring 容器使用依賴注入(DI)來管理組成一個應用程序的組件。這些對象被稱爲 Spring Beans。

                              

Spring容器設計核心是 Metadata(xml,java配置),POJOS。因此我們在使用Spring容器時,需要配置XML去定義Bean的元數據(元數據:定義了在Spring容器中Bean的名稱,作用域,class,依賴注入的屬性,自動裝配的方法byName  byType  constructor,是否啓用註解配置依賴注入;ps: XML 注入之前進行註解注入,因此後者的配置將通過兩種方式的屬性連線被前者重寫)。java配置可以代替XML配置Bean。

2.Bean 的初始化方法init-method,銷燬方法 destroy-method

這兩個方法使Spring實現了Bean的生命週期管理,init-method 屬性指定一個方法,在實例化 bean 時,立即調用該方法。同樣,destroy-method 指定一個方法,只有從容器中移除 bean 之後,才能調用該方法。

3.Spring Bean 後置處理器

Bean 後置處理器允許在調用初始化方法前後對 Bean 進行額外的處理。

BeanPostProcessor 接口定義回調方法,你可以實現該方法來提供自己的實例化邏輯,依賴解析邏輯等。你也可以在 Spring 容器通過插入一個或多個 BeanPostProcessor 的實現來完成實例化,配置和初始化一個bean之後實現一些自定義邏輯回調方法。你可以配置多個 BeanPostProcessor 接口,通過設置 BeanPostProcessor 實現的 Ordered 接口提供的 order 屬性來控制這些 BeanPostProcessor 接口的執行順序。BeanPostProcessor 可以對 bean(或對象)實例進行操作,這意味着 Spring IoC 容器實例化一個 bean 實例,然後 BeanPostProcessor 接口進行它們的工作。ApplicationContext 會自動檢測由 BeanPostProcessor 接口的實現定義的 bean,註冊這些 bean 爲後置處理器,然後通過在容器中創建 bean,在適當的時候調用它。

這是實現 BeanPostProcessor 的非常簡單的例子,它在任何 bean 的初始化的之前和之後輸入該 bean 的名稱。你可以在初始化 bean 的之前和之後實現更復雜的邏輯,因爲你有兩個訪問內置 bean 對象的後置處理程序的方法。

public class InitHelloWorld implements BeanPostProcessor {
   public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      System.out.println("BeforeInitialization : " + beanName);
      return bean;  // you can return any other object as well
   }
   public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      System.out.println("AfterInitialization : " + beanName);
      return bean;  // you can return any other object as well
   }
}

4.Spring 中的事件處理

Spring 的核心是 ApplicationContext,它負責管理 beans 的完整生命週期。當加載 beans 時,ApplicationContext 發佈某些類型的事件。例如,當上下文啓動時,ContextStartedEvent 發佈,當上下文停止時,ContextStoppedEvent 發佈。通過 ApplicationEvent 類和 ApplicationListener 接口來提供在 ApplicationContext 中處理事件。如果一個 bean 實現 ApplicationListener,那麼每次 ApplicationEvent 被髮布到 ApplicationContext 上,那個 bean 會被通知。

Spring 提供了以下的標準事件:

序號 Spring 內置事件 & 描述
1

ContextRefreshedEvent

ApplicationContext 被初始化或刷新時,該事件被髮布。這也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法來發生。

2

ContextStartedEvent

當使用 ConfigurableApplicationContext 接口中的 start() 方法啓動 ApplicationContext 時,該事件被髮布。你可以調查你的數據庫,或者你可以在接受到這個事件後重啓任何停止的應用程序。

3

ContextStoppedEvent

當使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 時,發佈這個事件。你可以在接受到這個事件後做必要的清理的工作。

4

ContextClosedEvent

當使用 ConfigurableApplicationContext 接口中的 close() 方法關閉 ApplicationContext 時,該事件被髮布。一個已關閉的上下文到達生命週期末端;它不能被刷新或重啓。

5

RequestHandledEvent

這是一個 web-specific 事件,告訴所有 bean HTTP 請求已經被服務。

由於 Spring 的事件處理是單線程的,所以如果一個事件被髮布,直至並且除非所有的接收者得到的該消息,該進程被阻塞並且流程將不會繼續。因此,如果事件處理被使用,在設計應用程序時應注意。

監聽上下文事件

爲了監聽上下文事件,一個 bean 應該實現只有一個方法 onApplicationEvent() 的 ApplicationListener 接口。

5.Spring 中的自定義事件

編寫和發佈自己的自定義事件有許多步驟。按照在這一章給出的說明來編寫,發佈和處理自定義 Spring 事件。

步驟 描述
1 創建一個名稱爲 Example 的項目,並且在創建項目的 src 文件夾中創建一個包 com.tutorialspoint。
2 使用 Add External JARs 選項,添加所需的 Spring 庫。
3 通過擴展 ApplicationEvent,創建一個事件類 CustomEvent。這個類必須定義一個默認的構造函數,它應該從 ApplicationEvent 類中繼承的構造函數。
4 一旦定義事件類,你可以從任何類中發佈它,假定 EventClassPublisher 實現了 ApplicationEventPublisherAware。你還需要在 XML 配置文件中聲明這個類作爲一個 bean,之所以容器可以識別 bean 作爲事件發佈者,是因爲它實現了 ApplicationEventPublisherAware 接口。
5 發佈的事件可以在一個類中被處理,假定 EventClassHandler 實現了 ApplicationListener 接口,而且實現了自定義事件的 onApplicationEvent 方法。
6 在 src 文件夾中創建 bean 的配置文件 Beans.xml 和 MainApp 類,它可以作爲一個 Spring 應用程序來運行。
7 最後一步是創建的所有 Java 文件和 Bean 配置文件的內容,並運行應用程序。

6.Spring 框架的 AOP

Spring 框架的一個關鍵組件是面向方面的編程(AOP)框架。面向方面的編程需要把程序邏輯分解成不同的部分稱爲所謂的關注點。跨一個應用程序的多個點的功能被稱爲橫切關注點,這些橫切關注點在概念上獨立於應用程序的業務邏輯。

AOP 術語

在我們開始使用 AOP 工作之前,讓我們熟悉一下 AOP 概念和術語。這些術語並不特定於 Spring,而是與 AOP 有關的。

描述
Aspect 一個模塊具有一組提供橫切需求的 APIs。例如,一個日誌模塊爲了記錄日誌將被 AOP 方面調用。應用程序可以擁有任意數量的方面,這取決於需求。
Join point 在你的應用程序中它代表一個點,你可以在插件 AOP 方面。你也能說,它是在實際的應用程序中,其中一個操作將使用 Spring AOP 框架。
Advice 這是實際行動之前或之後執行的方法。這是在程序執行期間通過 Spring AOP 框架實際被調用的代碼。
Pointcut 這是一組一個或多個連接點,通知應該被執行。你可以使用表達式或模式指定切入點正如我們將在 AOP 的例子中看到的。
Introduction 引用允許你添加新方法或屬性到現有的類中。
Target object 被一個或者多個方面所通知的對象,這個對象永遠是一個被代理對象。也稱爲被通知對象。
Weaving Weaving 把方面連接到其它的應用程序類型或者對象上,並創建一個被通知的對象。這些可以在編譯時,類加載時和運行時完成。

通知的類型

Spring 方面可以使用下面提到的五種通知工作:

通知 描述
前置通知 在一個方法執行之前,執行通知。
後置通知 在一個方法執行之後,不考慮其結果,執行通知。
返回後通知 在一個方法執行之後,只有在方法成功完成時,才能執行通知。
拋出異常後通知 在一個方法執行之後,只有在方法退出拋出異常時,才能執行通知。
環繞通知 在建議方法調用之前和之後,執行通知。

7.Spring 事務管理

編程式 vs. 聲明式

Spring 事務抽象

Spring 事務抽象的關鍵是由 org.springframework.transaction.PlatformTransactionManager 接口定義

public interface PlatformTransactionManager {
   TransactionStatus getTransaction(TransactionDefinition definition);
   throws TransactionException;
   void commit(TransactionStatus status) throws TransactionException;
   void rollback(TransactionStatus status) throws TransactionException;
}
序號 方法 & 描述
1

TransactionStatus getTransaction(TransactionDefinition definition)

根據指定的傳播行爲,該方法返回當前活動事務或創建一個新的事務。

2

void commit(TransactionStatus status)

該方法提交給定的事務和關於它的狀態。

3

void rollback(TransactionStatus status)

該方法執行一個給定事務的回滾。

TransactionDefinition 是在 Spring 中事務支持的核心接口

public interface TransactionDefinition {
   int getPropagationBehavior();
   int getIsolationLevel();
   String getName();
   int getTimeout();
   boolean isReadOnly();
}
序號 方法 & 描述
1

int getPropagationBehavior()

該方法返回傳播行爲。Spring 提供了與 EJB CMT 類似的所有的事務傳播選項。

2

int getIsolationLevel()

該方法返回該事務獨立於其他事務的工作的程度。

3

String getName()

該方法返回該事務的名稱。

4

int getTimeout()

該方法返回以秒爲單位的時間間隔,事務必須在該時間間隔內完成。

5

boolean isReadOnly()

該方法返回該事務是否是隻讀的。

下面是隔離級別的可能值:

序號 隔離 & 描述
1

TransactionDefinition.ISOLATION_DEFAULT

這是默認的隔離級別。

2

TransactionDefinition.ISOLATION_READ_COMMITTED

表明能夠阻止誤讀;可以發生不可重複讀和虛讀。

3

TransactionDefinition.ISOLATION_READ_UNCOMMITTED

表明可以發生誤讀、不可重複讀和虛讀。

4

TransactionDefinition.ISOLATION_REPEATABLE_READ

表明能夠阻止誤讀和不可重複讀;可以發生虛讀。

5

TransactionDefinition.ISOLATION_SERIALIZABLE

表明能夠阻止誤讀、不可重複讀和虛讀。

下面是傳播類型的可能值:

序號 傳播 & 描述
1

TransactionDefinition.PROPAGATION_MANDATORY

支持當前事務;如果不存在當前事務,則拋出一個異常。

2

TransactionDefinition.PROPAGATION_NESTED

如果存在當前事務,則在一個嵌套的事務中執行。

3

TransactionDefinition.PROPAGATION_NEVER

不支持當前事務;如果存在當前事務,則拋出一個異常。

4

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

不支持當前事務;而總是執行非事務性。

5

TransactionDefinition.PROPAGATION_REQUIRED

支持當前事務;如果不存在事務,則創建一個新的事務。

6

TransactionDefinition.PROPAGATION_REQUIRES_NEW

創建一個新事務,如果存在一個事務,則把當前事務掛起。

7

TransactionDefinition.PROPAGATION_SUPPORTS

支持當前事務;如果不存在,則執行非事務性。

8

TransactionDefinition.TIMEOUT_DEFAULT

使用默認超時的底層事務系統,或者如果不支持超時則沒有。

TransactionStatus 接口爲事務代碼提供了一個簡單的方法來控制事務的執行和查詢事務狀態。

 

public interface TransactionStatus extends SavepointManager {
   boolean isNewTransaction();
   boolean hasSavepoint();
   void setRollbackOnly();
   boolean isRollbackOnly();
   boolean isCompleted();
}
序號 方法 & 描述
1

boolean hasSavepoint()

該方法返回該事務內部是否有一個保存點,也就是說,基於一個保存點已經創建了嵌套事務。

2

boolean isCompleted()

該方法返回該事務是否完成,也就是說,它是否已經提交或回滾。

3

boolean isNewTransaction()

在當前事務時新的情況下,該方法返回 true。

4

boolean isRollbackOnly()

該方法返回該事務是否已標記爲 rollback-only。

5

void setRollbackOnly()

該方法設置該事務爲 rollback-only 標記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章