1. 程式人生 > >spring_中常用的註解

spring_中常用的註解

Spring IoC 容器

IoC 容器

Spring 容器是 Spring 框架的核心。容器將建立物件,把它們連線在一起,配置它們,並管理他們的整個生命週期從建立到銷燬。Spring 容器使用依賴注入(DI)來管理組成一個應用程式的元件。這些物件被稱為 Spring Beans,我們將在下一章中進行討論。

通過閱讀配置元資料提供的指令,容器知道對哪些物件進行例項化,配置和組裝。配置元資料可以通過 XML,Java 註釋或 Java 程式碼來表示。下圖是 Spring 如何工作的高階檢視。 Spring IoC 容器利用 Java 的 POJO 類和配置元資料來生成完全配置和可執行的系統或應用程式。

IOC 容器具有依賴注入功能的容器,它可以建立物件,IOC 容器負責例項化、定位、配置應用程式中的物件及建立這些物件間的依賴。通常new一個例項,控制權由程式設計師控制,而"控制反轉"是指new例項工作不由程式設計師來做而是交給Spring容器來做。在Spring中BeanFactory是IOC容器的實際代表者。

Spring IoC 容器

Spring 提供了以下兩種不同型別的容器。

序號 容器 & 描述
1 Spring BeanFactory 容器

它是最簡單的容器,給 DI 提供了基本的支援,它用 org.springframework.beans.factory.BeanFactory 介面來定義。BeanFactory 或者相關的介面,如 BeanFactoryAware,InitializingBean,DisposableBean,在 Spring 中仍然存在具有大量的與 Spring 整合的第三方框架的反向相容性的目的。

2 Spring ApplicationContext 容器

該容器添加了更多的企業特定的功能,例如從一個屬性檔案中解析文字資訊的能力,釋出應用程式事件給感興趣的事件監聽器的能力。該容器是由 org.springframework.context.ApplicationContext 介面定義。

ApplicationContext 容器包括 BeanFactory 容器的所有功能,所以通常建議超過 BeanFactory。BeanFactory 仍然可以用於輕量級的應用程式,如移動裝置或基於 applet 的應用程式,其中它的資料量和速度是顯著。

Spring BeanFactory 容器

Sping 的 BeanFactory 容器

這是一個最簡單的容器,它主要的功能是為依賴注入 (DI) 提供支援,這個容器介面在 org.springframework.beans.factory.BeanFactor 中被定義。BeanFactory 和相關的介面,比如BeanFactoryAware、DisposableBean、InitializingBean,仍舊保留在 Spring 中,主要目的是向後相容已經存在的和那些 Spring 整合在一起的第三方框架。

在 Spring 中,有大量對 BeanFactory 介面的實現。其中,最常被使用的是 XmlBeanFactory 類。這個容器從一個 XML 檔案中讀取配置元資料,由這些元資料來生成一個被配置化的系統或者應用。

在資源寶貴的移動裝置或者基於 applet 的應用當中, BeanFactory 會被優先選擇。否則,一般使用的是 ApplicationContext,除非你有更好的理由選擇 BeanFactory。

 

Spring ApplicationContext 容器

Spring ApplicationContext 容器

Application Context 是 BeanFactory 的子介面,也被成為 Spring 上下文。

Application Context 是 spring 中較高階的容器。和 BeanFactory 類似,它可以載入配置檔案中定義的 bean,將所有的 bean 集中在一起,當有請求的時候分配 bean。 另外,它增加了企業所需要的功能,比如,從屬性檔案中解析文字資訊和將事件傳遞給所指定的監聽器。這個容器在 org.springframework.context.ApplicationContext interface 介面中定義。

ApplicationContext 包含 BeanFactory 所有的功能,一般情況下,相對於 BeanFactory,ApplicationContext 會更加優秀。當然,BeanFactory 仍可以在輕量級應用中使用,比如移動裝置或者基於 applet 的應用程式。

最常被使用的 ApplicationContext 介面實現:

  • FileSystemXmlApplicationContext:該容器從 XML 檔案中載入已被定義的 bean。在這裡,你需要提供給構造器 XML 檔案的完整路徑。

  • ClassPathXmlApplicationContext:該容器從 XML 檔案中載入已被定義的 bean。在這裡,你不需要提供 XML 檔案的完整路徑,只需正確配置 CLASSPATH 環境變數即可,因為,容器會從 CLASSPATH 中搜索 bean 配置檔案。

  • WebXmlApplicationContext:該容器會在一個 web 應用程式的範圍內載入在 XML 檔案中已被定義的 bean。

Spring Bean 定義

Bean定義

被稱作 bean 的物件是構成應用程式的支柱也是由 Spring IoC 容器管理的。bean 是一個被例項化,組裝,並通過 Spring IoC 容器所管理的物件。這些 bean 是由用容器提供的配置元資料建立的,例如,已經在先前章節看到的,在 XML 的表單中的 定義。

bean 定義包含稱為配置元資料的資訊,下述容器也需要知道配置元資料:

  • 如何建立一個 bean

  • bean 的生命週期的詳細資訊

  • bean 的依賴關係

上述所有的配置元資料轉換成一組構成每個 bean 定義的下列屬性。

屬性 描述
class 這個屬性是強制性的,並且指定用來建立 bean 的 bean 類。
name 這個屬性指定唯一的 bean 識別符號。在基於 XML 的配置元資料中,你可以使用 ID 和/或 name 屬性來指定 bean 識別符號。
scope 這個屬性指定由特定的 bean 定義建立的物件的作用域,它將會在 bean 作用域的章節中進行討論。
constructor-arg 它是用來注入依賴關係的,並會在接下來的章節中進行討論。
properties 它是用來注入依賴關係的,並會在接下來的章節中進行討論。
autowiring mode 它是用來注入依賴關係的,並會在接下來的章節中進行討論。
lazy-initialization mode 延遲初始化的 bean 告訴 IoC 容器在它第一次被請求時,而不是在啟動時去建立一個 bean 例項。
initialization 方法 在 bean 的所有必需的屬性被容器設定之後,呼叫回撥方法。它將會在 bean 的生命週期章節中進行討論。
destruction 方法 當包含該 bean 的容器被銷燬時,使用回撥方法。它將會在 bean 的生命週期章節中進行討論。

Bean 與 Spring 容器的關係

下圖表達了Bean 與 Spring 容器之間的關係:

Spring Bean 定義

Spring 配置元資料

Spring IoC 容器完全由實際編寫的配置元資料的格式解耦。有下面三個重要的方法把配置元資料提供給 Spring 容器:

  • 基於 XML 的配置檔案

  • 基於註解的配置

  • 基於 Java 的配置

提示:對於基於 XML 的配置,Spring 2.0 以後使用 Schema 的格式,使得不同型別的配置擁有了自己的名稱空間,是配置檔案更具擴充套件性。

你已經看到了如何把基於 XML 的配置元資料提供給容器,但是讓我們看看另一個基於 XML 配置檔案的例子,這個配置檔案中有不同的 bean 定義,包括延遲初始化,初始化方法和銷燬方法的:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- A simple bean definition -->
   <bean id="..." class="...">
       <!-- collaborators and configuration for this bean go here -->
   </bean>

   <!-- A bean definition with lazy init set on -->
   <bean id="..." class="..." lazy-init="true">
       <!-- collaborators and configuration for this bean go here -->
   </bean>

   <!-- A bean definition with initialization method -->
   <bean id="..." class="..." init-method="...">
       <!-- collaborators and configuration for this bean go here -->
   </bean>

   <!-- A bean definition with destruction method -->
   <bean id="..." class="..." destroy-method="...">
       <!-- collaborators and configuration for this bean go here -->
   </bean>

   <!-- more bean definitions go here -->
</beans>

 

Spring Bean 作用域

 

Bean 的作用域

當在 Spring 中定義一個 bean 時,你必須宣告該 bean 的作用域的選項。例如,為了強制 Spring 在每次需要時都產生一個新的 bean 例項,你應該宣告 bean 的作用域的屬性為 prototype。同理,如果你想讓 Spring 在每次需要時都返回同一個bean例項,你應該宣告 bean 的作用域的屬性為 singleton

Spring 框架支援以下五個作用域,分別為singleton、prototype、request、session和global session,5種作用域說明如下所示,

注意,如果你使用 web-aware ApplicationContext 時,其中三個是可用的。    

作用域 描述
singleton

在spring IoC容器僅存在一個Bean例項,Bean以單例方式存在,預設值

prototype 每次從容器中呼叫Bean時,都返回一個新的例項,即每次呼叫getBean()時,相當於執行newXxxBean()
request 每次HTTP請求都會建立一個新的Bean,該作用域僅適用於WebApplicationContext環境
session 同一個HTTP Session共享一個Bean,不同Session使用不同的Bean,僅適用於WebApplicationContext環境
global-session 一般用於Portlet應用環境,該運用域僅適用於WebApplicationContext環境

本章將討論前兩個範圍,當我們將討論有關 web-aware Spring ApplicationContext 時,其餘三個將被討論。

singleton 作用域:

singleton 是預設的作用域,也就是說,當定義 Bean 時,如果沒有指定作用域配置項,則 Bean 的作用域被預設為 singleton。

當一個bean的作用域為Singleton,那麼Spring IoC容器中只會存在一個共享的bean例項,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一例項。

也就是說,當將一個bean定義設定為singleton作用域的時候,Spring IoC容器只會建立該bean定義的唯一例項。

Singleton是單例型別,就是在建立起容器時就同時自動建立了一個bean的物件,不管你是否使用,他都存在了,每次獲取到的物件都是同一個物件。注意,Singleton作用域是Spring中的預設作用域。你可以在 bean 的配置檔案中設定作用域的屬性為 singleton,如下所示:

<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="singleton">
    <!-- collaborators and configuration for this bean go here -->
</bean>