iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0

Abstract

在Spring Framework尚未被開發出來時,Java EE是以 Sun公司(已經被Oracle 公司收購,但為了紀念其對Java發展未來有巨大的影響力,故依舊保持名稱,以表敬意)所制定的EJB(Enterprise Java Bean)作為標準的。在早期的EJB年代,開發一個EJB需要大量的街口和配置文件,直至EJB 2.0的年代。開發一個EJB需要大量的接口和配置文件。直至EJB 2.0的年代,開發一個EJB還需要兩個配置文檔,其結果就是配置工作量比開發工作量還大。Sun公司定義的JSP和Servlet卻是運行在Web容器中,因Servlet為一種SSR(Server-Side Render)架構框架,亦為當初盛行MVC(Model-View-Controller)架構,可以理解到需要用Web容器去EJB容器和服務。故存在了一項重大缺點,需要增加調用配置文件才能讓Web容器調用EJB容器。此時需同時開發兩項容器,非常多的配置內容與繁瑣的規範導致開發效率相當低。故開發人員須了解許多繁瑣的EJB細節,才能進行配置和測試,這樣測試也難以進行。
就在大家苦惱此種架構難以維運與開發同時,在2002年,位於澳大利亞工程師Rod Johnson(論學歷的話,他是位音樂家,因他是音樂博士)在其著名的著作Expert One-on-One J2EE Design and Development中提出了Spring架構,其開發目標為三個方向,如下:

  1. Spring框架應該使用起來很愉悅。
  2. 各種應用程序不應該依賴許多API。
  3. Spring框架不應該與現有好的解決方案競爭,但勢必與現有方案促進整合。

故在2004年由Rod Johnson主導的Spring框架推出 1.0 版本。

Principle Introduction

Spring 以強大的控制反轉(IoC)及面向切面式編程(AOP)來管理各類Java資源,在控制反轉(IoC)方面,從而降低許多資源的耦合:提供了極低的外部入侵性,也就是使用Spring框架來開發程式碼,即使脫離了Spring API也可以繼續使用。在面向切面式編程(AOP)通過動態代理技術(cglib),允許我們按照規範進行配置開發,進而增強每個Bean的功能。因為在前一章提到,早期的1.5版本前不支援註解,固接使用XML檔進行Bean配置連接,等到Spring 2.0出來之後,才出現新一版的註解方式(Annotation)進行配置,以減少許多XML配置檔的繁瑣步驟,固區分為兩派XML古老派及註解(Annotation)新生派。故可集成於20多種模組,區分為核心容器(Core Container)、數據訪問/集成(Data Access/ Integration)層、Web層、AOP(Aspect Oriented Programming,面向切面式編程)、植入模塊(Instrumentation)、消息傳輸(Messaging)和測試模組(Test),各類模組細節部分將在結構當中做敘述。

Structure

image

1. 核心容器

Spring的核心容器服務是所有模塊的運作基底,此容器由Spring-core、Spring-beans、Spring-context、Spring-context-suport和Spring-expression(Spring表達式語言)等模組組成。

1.1 Spring-core 模組:
提供了框架的基本組成部分,包括控制反轉(Inversion of Control,IoC)和依賴注入(Dependency Injection,DI)功能。

1.1.1
Spring IoC :
* XML配置的IoC容器:基於BeanFactory和ApplicationContext兩個接口,BeanFactory接口有多個實現類,最常用為org.springframework.beans.factory.xml.XmlBeanFactory。而ApplicationContext是BeanFactory的子類別,目前支援此種實例有三種方法,但本次分享章節部探討此方式。
1. 通過ClassPathXmlApplicationContext創建
2. 通過FileSystemXmlApplicationContext創建
3. 通過Web服務器實例化ApplicationContext
* 基於註解的IoC容器:就是透過AnnotationConfigApplicationContext取得對應的Bean,從名稱就可以看出它是一個基於註解的IoC容器。
1.1.2
Spring DI:
* XML配置的DI容器:作用是在使用Spring框架創建對象時動態地將其所依賴的對象注入Bean組件中,Spring框架的依賴注入通常有兩種實現方式。一種是使用構造方法注入,另一種是使用屬性的Setter方法注入。
* 基於註解的DI容器:透過IoC容器中的Bean之間的依賴,在註解方式進行依賴注入(DI)的方式,加入@Autowired是最常用的註解之一,它根據屬性的類型(by type)找到對應的Bean進行注入。

1.2 Spring-beans 模組:如上所述,提供BeanFactory,是一個工廠模式(Factory Pattern)的一個經典實現,所有代管對象皆為Bean。

1.3 Spring-context 模組:建立在Core和Beans模組的基礎上,為一種框架是的對象訪問方式,訪問定義和配置的任何對象的媒介。為第一點所述,無論採用何種方式取得Bean,都須透過BeanFactory的子接口ApplicationContext來實現。

1.4 Spring-context-support 模組:支持整合第三方套件到Spring的應用程序上,如:高速緩存(EhCache、JCache)、任務調度(CommonJ、Quartz)及事務調度(Spring-JPA、Spring-data-mongodb及Spring-boot-starter-redis)。

1.5 Spring-expression 模組:提供強大的表達式語言去支持運作時查詢和操作對象。該語言支持設置和獲取屬性值、屬性配置、方法調用、訪問數據、集合和索引氣的內容、邏輯和算數邏輯、變量命名及Spring的IoC容器中以名稱檢索對象。

2. AOP和Instrumentation

Spring AOP亦包含了XML配置方式及註解配置方式,在dynamic.jdk包中創建代理類JDKDynamicProxy。在JDK動態代理中代理類必須實現java.lang.reflect.InvocationHandler接口。並覆蓋(@Override)其代理方法,而Spring Core框架採用CGLIB(Code Generation Libaray)是一個高性能開源的程式碼套件包,採用非常底層的字節碼技術。對指定的目標類生成一個子類,並加強對子類別的方法邏輯。

2.1 Spring-aop模組:提供一個符合AOP要求的面向式切面的編譯實例,允許定義方法攔截器的切入點。將代碼按照功能進行分離,已變乾淨的分開各類程式邏輯區段,降低耦合性。

2.2 Spring-aspects模組:提供了雨AspectJ的整合功能,AspectJ是一個基於Java語言的AOP框架,從Spring 2.0後引入一個AspectJ的支持框架,分為:Before、After Returning、Around、After Throwing、After及Declare parents六類行為。

2.3 Spring-instrument模組:提供類植入(Instrumentation)支持和類別加載器的實現,可在特定的應用服務器中使用。

4. 消息

提供對消息傳遞體系和協議的支持,其使用JmsTemplate簡化JMS API的使用到異步接收消息的完整基礎架構,目前支援多種訊息傳輸套件(MQ,Message Queue),如:ActiveMQ、RabbitMQ及Apache Kafka等。

5. 數據訪問與整合

數據訪問/整合層由JDBC、ORM、OXM、JMS和事務模組套件組成。

5.1 Spring-jdbc 模組:提供一個JDBC串接底層的抽象層,減少許多物件關聯對映(ORM)的JDBC的編譯過程及數據庫的錯誤解析流程,雖為是一項好處,但相當不建議直接使用,畢竟在對外安全性管理邏輯議題甚多,處理不慎,有不當後果。

5.2 Spring-orm 模組:物件關聯對映(Object-Relational Mapping) API提供整合層,包括JPA、Hibernate及Mybatis,使用Spring-orm模組可以將這些O/R應設框架與Spring提供的所有其他功能結合使用。

5.3 Spring-oxm 模組:一種支持對象/XML映射的抽象曾實現。如:JAXB、Caster、JiBX和XStream。

5.4 Spring-jms(Java Messageing Service)模組:Java消息傳遞服務,包含於用生產和使用消息模式(Producer/Comsumer)、推廣與訂閱模式(Publish/Subscribe)兩種,提供雨Spring-messaging模組的整合。

5.5 Spring-tx模組(事務模組):用於實現特殊接口和所有POJO(Basic Java Transactional Model)類別的編譯類別和聲明式事務管理。

6. Web

Web 層由Spring-web、Spring-webmvc、Spring-websocket和Portlet模組組成。

6.1 Spring-web模組:基本的Web開發整合功能,如:多文件上傳功能、使用Servlet監視器初始化一個IoC容器以及Web應用,因有一套既有的規範配置,透過後端傳輸出超連結代碼轉成Web前端介面(GUI),並透過XML組態檔方式進行各類關聯配置,故維運起來相當不便。

6.2 Spring-webmvc模組:亦稱Web-Servlet模組,包含Web應用程序的Spring MVC和REST Web Services實現。Spring MVC框架提供一套規範,將程式碼領域模型區塊及Web 前端代碼之間清晰分離,亦可與其他類型框架進行整合,如:Thymeleaf。

6.3 Spring-websocket模組:提供WebSocket和SockJS整合。

6.4 Portlet模組:與Servlet模組的功能,提供Portlet環境下的MVC實現。

7. 測試

支持使用JUnit或Mockito對Spring套件進行單元測試或整合測試。

後續摘要

由於目前Spring開發學派以區分為兩種派系,一種為XML組態學派,另一派為新式註解學派,我們後續範例分享大部分將以新式註解學派為主,少部分再提供XML範例做分享,並從核心技術進行介紹至周邊依賴性是套件應用做原理分析、架構應用及範例分享,各類讀者可依照你們的情境做應用。

Reference Url:

Spring從入門到放棄(一)Spring的誕生

Spring框架學習——Spring的體系結構詳解

Spring系列學習之Spring Messaging消息支持


上一篇
[Day-02] - Annotation Modulize Introduction
下一篇
[Day-04] - Spring Boot Starter 環境配置馬上就上手
系列文
Wow ! There is no doubt about Learn Spring framework in a month.30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言