本文總結一些關於Spring框架的理解,注意點及基礎操作。如果有不對的地方,歡迎批評和建議。大家一起努力吧!
Spring 框架簡介
Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。Spring 致力於 Java EE 應用的各種解決方案,而不是僅僅專注於某一層的方案,可以說, Spring 是企業應用開發的“一站式”選擇,Spring 貫穿表現層、業務層、持久層。然而,Spring 並不想取代那些已有的框架,而是以高度的開發性與它們無縫整合。
Spring框架結構
Spring框架由大約20個功能模塊組成。這些模塊被分成六個部分,分別是 Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation 及 Test。
- Spring Core:是框架的最基礎部分。核心容器的主要組件是
BeanFactory
,它是工廠模式的實現。BeanFactory
使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。 - Spring Context:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
- Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基於 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
- Spring JDBC:提供了 JDBC 的抽象層,簡化了 JDBC 編碼,同時使代碼更健壯。
- 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。
Spring IoC
控制反轉(Inversion of Control,IoC),也稱為依賴注入(Dependency Injection,DI),是面向對象編程中的一種設計理念,用來降低程序代碼之間的耦合度。控制反轉模式(也稱作依賴注入)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器 (在 Spring 框架中是 IOC 容器) 負責將這些聯系在一起。
IoC 實現思路
思路1 | 通過 JavaBean 的屬性(例如 setter 方法)分配依賴性 |
思路2 | 依賴性以構造函數的形式提供,不以 JavaBean 屬性的形式公開 |
IoC 實現步驟
1.下載Spring並添加到項目中。
Spring 的運行依賴於 commons-logging 組件,需要將相關的 jar 文件隨 Spring 的 jar 文件一並導入。
2.創建持久化類、數據訪問層接口及實現類和業務邏輯層接口及實現類。
這里的持久化類必須提供公有的 setter 方法,以便 Spring 調用。
3.編寫 Spring 配置文件。
在項目的 classpath 根路徑下創建 applicationContext.xml 文件。
在 Spring 配置文件中,使用<bean>元素來定義 Bean(也可稱為組件)的實例。這個元素有兩個常用屬性:
id:表示定義的 Bean 實例的名稱。
class:表示定義的 Bean 實例的類型。
在其作用域中使用子元素 <property> 為屬性賦值。這個元素有兩個常用屬性:
name:表示該 Bean 實例屬性的名稱。
value:為該屬性賦值。
4.編寫代碼通過Spring獲取目標類的實例。
1)使用 BeanFactory 接口獲取目標類實例
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml")); MyBean mybean = (MyBean) factory.getBean("mybean");
因為 org.springframework.beans.factory.BeanFactory
是一個簡單接口,所以可以針對各種底層存儲方法實現。最常用的 BeanFactory
定義是 XmlBeanFactory
,它根據 XML 文件中的定義裝入 bean。
在 XML 文件中定義的 Bean 是被消極加載的,這意味在需要 bean 之前,bean 本身不會被初始化。要從 BeanFactory
檢索 bean,只需調用 getBean()
方法,傳入將要檢索的 bean 的名稱即可。
每個 bean 的定義都可以是 POJO (用類名和 JavaBean 初始化屬性定義) 或 FactoryBean
。FactoryBean
接口為使用 Spring 框架構建的應用程序添加了一個間接的級別。
2)使用 ApplicationContext 接口獲取目標類實例
ApplicationContext 接口負責讀取 Spring 配置文件,管理對象的加載,生成,維護 Bean 對象與 Bean 對象之間的依賴關系,負責 Bean 的生命周期等。ClassPathXmlApplicationContext 是 ApplicationContext 接口的實現類,用於從 classpath 路徑中讀取 Spring 配置文件。
Spring AOP
面向切面編程(Aspect Oriented Programming,AOP)是軟件編程思想發展到一定階段的產物,是對面向對象編程(Object Oriented Programming,OOP)的有益補充。AOP 的功能完全集成到了 Spring 事務管理、日志和其他各種特性的上下文中。面向切面編程,簡單地來說就是在不改變原程序的基礎上為代碼段增加新的功能,對代碼段進行增強處理。它的設計思想來源於代理設計模式。
基本概念
切面(Aspect):一個模塊化的橫切邏輯(或稱橫切關注點),可能會橫切多個對象。
連接點(Join Point):程序執行中的某個具體的執行點。
增強處理(Advice):切面在某個特定連接點上執行的代碼邏輯。
切入點(Pointcut):對連接點的特征進行描述,可以使用正則表達式。增強處理和一個切入點表達式相關聯,並在與這個切入點匹配的某個連接點上運行。
目標對象(Target object):被一個或多個切面增強的對象。
AOP代理(AOP proxy):由AOP框架所創建的對象,實現執行增強處理方法等功能。
織入(Weaving):將增強處理連接到應用程序中的類型或對象上的過程。
AOP實現思路(這里使用簡單的日志記錄增強操作進行演示)
1.在項目中添加 Spring AOP 相關的 jar 文件。
2)創建增強類,編寫前置增強和后置增強實現日志功能。
把需要增強的代碼提取到增強類中。這里使用日志記錄方法進行演示。
3)編寫 Spring 配置文件,對業務方法進行增強處理。
在 <Bean> 元素中需要添加 aop 的名稱空間,以導入與AOP相關的標簽。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 8 http://www.springframework.org/schema/tx 9 http://www.springframework.org/schema/tx/spring-tx.xsd 10 http://www.springframework.org/schema/aop 11 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 12 http://www.springframework.org/schema/context 13 http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 14 </beans>
下面是對增強的配置代碼
與 AOP 相關的配置都放在 <aop:config> 元素中,如配置切入點的標簽 <aop:pointcut>。
如圖中配置所示,在 <aop:config> 中使用 <aop:aspect> 引用包含增強方法的Bean。分別通過 <aop:before> 和 <aop:after-returning> 將方法聲明為前置增強和后置增強。
<aop:pointcut> 的 expression 屬性可以配置切入點表達式。
上述配置為AOP配置代碼片段,其中expression部分為定義切點的表達式部分,如下:
execution(* cn.zdpz.service..*.*(..))
表達式結構表示如下
標識符 | 含義 |
---|---|
execution() | 表達式的主體 |
第一個“*”符號 | 表示返回值的類型任意 |
cn.zdpz.service | AOP 所切的服務的包名,即,需要進行橫切的業務類 |
包名后面的“..” | 表示當前包及子包 |
第二個“*” | 表示類名,*即所有類 |
.*(..) | 表示任何方法名,括號表示參數,兩個點表示任何參數類型 |
官方文檔關於表達式結構介紹
execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數模式>)<異常模式>?)
4)編寫代碼,獲取帶有增強處理的業務對象。
下文講解其它 Spring IoC 和 Spring AOP 的實現方法。