第一章:向Spring Framework 5.0進化
- 1.1 Spring Framework
-
- 1.1.1 spring的定義:
- 1.1.2 spring的特點:
- 1.1.3 Spring網站對于Spring Framework的定義:
- 1.1.4 EJB(Enterprise Java Beans)存在的問題:
- 1.2 Spring Framework為什麼流行
-
- 1.2.1 簡化了單元測試
- 1.2.2 減少了銜接代碼
- 1.2.3 架構靈活性
- 1.2.4 與時俱進,新的技術
- 1.3 Spring子產品
-
- 1.3.1 Spring核心容器
1.1 Spring Framework
1.1.1 spring的定義:
一個輕量級的J2EE開發架構
1.1.2 spring的特點:
友善解耦,簡化開發;
支援AOP程式設計;友善進行測試;
友善和其他架構進行整合;
友善進行事務操作;
降低API開發難度
1.1.3 Spring網站對于Spring Framework的定義:
**Spring Framework為基于Java的現代企業級應用程式提供了全面的程式設計和配置模型。**
其主要作用為連接配接應用程式的不同元件提供技術銜接。
1.1.4 EJB(Enterprise Java Beans)存在的問題:
開發和部署EJB是個繁瑣的過程,雖然使用EJB可以輕松地分發元件,但開發和部署元件後進行難以進行單元測試。應用程式接口API複雜,複雜性遠大于好處。
- 難以進行單元測試。
- 需要通過很多不必要的方法實作多個接口。
- 異常處理冗長且繁瑣。
- 部署描述極其不便。
1.2 Spring Framework為什麼流行
主要原因:
- 簡化了單元測試-采用了依賴注入
- 減少了銜接代碼
- 架構靈活性
- 與時俱進
1.2.1 簡化了單元測試
早期的EJB難以進行單元測試,唯一方法是将其部署到容器中。
Spring Framework采用了依賴注入(DI),可以輕松的用Mock對象取代依賴關系,進而完成單元測試,無需部署整個程式。
簡化單元測試有諸多好處:
- 提高程式員的工作效率
- 能更早發現缺陷,降低修複缺陷的成本
- 應用程式将自動進行單元測試(可在持續內建模式下運作),防止将來出現缺陷
1.2.2 減少了銜接代碼
在Spring Framework推出之前,典型的JavaEE應用程式會包含大量的銜接代碼,例如,擷取資料庫連接配接的代碼,異常處理代碼,事物管理代碼,日志記錄代碼等。
預編譯語句(Prepared Statement)示例:
PreparedStatement st=null;
try{
st=conn.prepareStatement(INSERT_TODO_QUERY);
st.setString(1,bean.getDescription());
st.setBoolean(2,bean.isDone());
st.execute();
}
catch(SQLException e){
logger.error("Failed:"+INSERT_TODO_QUERY,e);
}finally{
if(st!=null){
try{
st.close();
}catch(SQLException e){
//忽略--沒有操作
}
}
}
這裡一共4行業務邏輯和超過10行的銜接代碼。
SpringFramework可以通過以下代碼實作相同邏輯:
jdbcTemplate.update(INSERT_TODO_QUERY,bean.getDescription(),
bean.isDone());
如何實作的這種簡化:
上例中Spring JDBC将大多數受檢異常轉化成了未受檢異常。查詢失敗時,除了結束語句和承認事物失敗之外,我們能做的事不多。而且不必在每個方法中多執行異常處理,可以進行集中處理,然後使用Spring面向切面程式設計AOP完成注入。
Spring JDBC不需要建立擷取連接配接(getConnection())、建立預編譯語句等銜接代碼。而是直接在Spring上下文中建立jdbcTemplate類,然後在需要調用時将其注入資料通路對象(DAO)類中。
類似的Spring JMS、Spring AOP和其他的Spring子產品也可以減少銜接代碼。
好處:減少重複代碼,代碼維護更加便捷(集中處理事務和異常(橫切關注點)@ControllAdvice),程式員可以更加專注于編寫業務邏輯。
1.2.3 架構靈活性
Spring Framework采用子產品化設計,包含一組建立在核心Spring子產品之上的獨立子產品。大多數是獨立的,即可以被單獨使用。
具體示例:
- WEB層,spring提供了SpringMVC架構,也支援Struts,Vaadin,JSF等任意WEB架構。
- Spring Beans可以使用較少代碼實作業務邏輯,還可以內建EJB。
- Spring在資料層用Spring JDBC簡化了JDBC。同時全面支援任何資料層架構,如JPA、Hibernate或iBatis。
-
可以選擇使用Spring AOP實作橫切關注點(日志記錄,事物處理,安全性),也可以用成熟的AOP實作,如AspectJ。
Spring并不會滿足所有需求。
它的核心工作是降低應用程式不同元件之間的耦合度并且使他們可以進行測試。
架構靈活性的具體實作:
全面內建我們選擇的架構,不想使用特定架構,可以使用其他架構來替代。
1.2.4 與時俱進,新的技術
Spring為了實作它的子產品化和靈活性,不斷的在提前實作新技術。
例如:
Spring Framework先于JavaEE實作了基于注解的控制器。
還先于JavaEE引入了很多的抽象概念,以将應用程式和具體實作分割開來。例如緩存API等等。
另一個重要特性是提供了一系列Spring項目。
例如:
Spring Batch定義了一種新方法來建構Java Batch應用程式。而Java EE7釋出才制定了相關的批處理應用規範。
架構逐漸向雲和微服務進化。SpringCloud可以幫助簡化微服務開發和部署,Spring Cloud Data Flow為微服務應用程式提供了業務流程。
1.3 Spring子產品
Spring Framework高度子產品化,提供了20多個子產品,而且這些子產品都有明确定義的邊界。
1.3.1 Spring核心容器
子產品/artifact | 用途 |
---|---|
spring-core | 其他Spring子產品使用的應用程式 |
spring-beans | 支援Spring bean;與spring-core一起提供Spring Framework的核心功能–依賴注入;幫助實作BeanFactory |
spring-context | 實作ApplicationContext,擴充BeanFactory并支援資源加載、國際化 |
spring-expression | 擴充EL(JSP中的表達式語言)并為通路和操縱bean屬性(包括數組和集合)提供了語言 |
一般在普通的java項目中,如果需要使用spring來實作對象的調用,需要将以上四個包的依賴都進行導入和部署(即放在lib中,然後在檔案架構中導入為artifact)。然後在xml檔案中寫bean,來調用需要對象的類。最後在測試的地方使用上下文調取xml檔案,最後再使用getbean函數調用對應類型的對象。