1. 程式人生 > >Spring 框架學習(1)--Spring、Spring MVC掃盲

Spring 框架學習(1)--Spring、Spring MVC掃盲

紙上得來終覺淺,絕知此事要躬行

文章大綱

  • 什麼是spring
    1. 傳統Java web應用架構
    2. 更強的Java Web應用架構——MVC框架
    3. Spring——粘合式框架
  • spring的內涵
    1. spring核心
      • JavaBean
      • 應用上下文
      • IoC/DI
    2. spring框架組成
    3. spring還可以做什麼

什麼是Spring

Spring框架是Java平臺的開源的全棧應用程式框架和控制反轉容器實現。

傳統的Java Web應用架構

傳統的Java web框架一般分為兩層:Contrller-Model。

控制器主要通過Servlet接收與處理請求,根據不同的Web請求生成動態內容。模型層主要處理與資料庫的互動,接收控制器的請求,打包獲得的資料返回給控制器。

主要流程如下:

  1. Web瀏覽器傳送HTTP請求到伺服器,被Controller(主要是Servlet)獲取並進行處理
  2. Controller呼叫核心業務邏輯——Model
  3. Model進行資料庫存取操作,並將結果返回給Controller
  4. Controller將業務邏輯處理結果交給View(通常是JSP),動態輸出HTML內容
  5. 動態生成的HTML內容返回到瀏覽器顯示

更強的Java Web架構——MVC框架(Spring MVC框架為例)

Spring MVC基於模型-檢視-控制器(Model-VIew-Controller, MVC)模式實現,可以構建一個靈活和鬆耦合的Web應用程式,基於spring mvc架構的請求流程如下:

  1. 客戶端產生請求,將資料提交給伺服器。
  2. 經過前端控制器進行分發,通過查詢處理器對映,將請求委託給應用程式的其他元件(控制器)來執行實際的請求。
  3. 控制器完成邏輯處理,產生響應資訊(model),打包該模型資料,並標示邏輯檢視名(用來確定用哪個檢視渲染輸出),將模型與檢視名返回給前端控制器。
  4. 前端控制器使用檢視解析器來將邏輯檢視名匹配為一個特定的檢視實現。
  5. 檢視使用模型資料渲染輸出,輸出會通過響應物件傳遞給客戶端。

Spring——粘合式框架

一站式的粘合框架,它像神奇的膠水一樣,可以以鬆耦合的方式使各元件有機的粘合在一起。

Spring MVC完成使用者請求並返回響應的過程中呼叫了大量的元件,而每個元件都有一個或多個JavaBean通過互相協調組合。為了降低耦合度,更方便、靈活的建立Bean以及Bean之間的聯絡,Spring採用了控制反轉(Inverse of Controller,IoC)的思想,把強耦合的程式碼依賴從程式碼中移出去,放到統一的XML配置檔案中,將程式對元件的主要控制權交給IOC容器,由IOC容器統一載入和管理,把Bean的建立、聯絡、屬性分給Bean的過程,叫依賴注入(Dependency Injection, DI),由此可見,依賴注入與控制反轉息息相關。

由此可見,Spring框架的核心技術思想是:控制反轉/依賴注入。核心內容是:Bean。

Spring的內涵

Spring核心

JavaBean

Spring官方文件對於Bean的解釋:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

翻譯:

組成應用程式主幹部分並由Spring IoC容器管理的物件叫做beans。Bean是由Spring IoC容器例項化、組裝、管理的物件。

總結概括:

  1. Bean是物件
  2. Bean是Spring應用程式的主幹部分
  3. Bean由Spring IoC容器統一管理

Spring應用上下文

已經知道,Spring IoC容器具有物件的建立、管理等控制權,但是需要我們自己去放入物件到容器裡,需要我們自己決定物件之間的依賴關係,總的來說,容器只是提供了一個管理物件的空間。我們需要通過Spring的應用上下文向容器新增代為管理的物件。

Spring應用上下文可以簡單的理解為將需要Spring管理的物件放入容器的容器物件,也即,應用上下文是Spring容器的一種抽象化表述,上面程式碼使用的ApplicationContext本質上就是一個維護Bean定義以及物件之間協作關係的高階介面。

Spring的核心是容器,Spring容器使用DI管理構成應用的元件。Spring自帶了多個容器實現,可以歸為兩種不同的型別。BeanFactory是最簡單的容器,提供基本的DI支援。應用上下文基於BeanFactory構建,它提供更多服務,例如解析配置文字資訊等等。

IoC/DI

Spring框架中的Bean不再是傳統上的用new的方式建立了,而是通過把Bean的管理許可權統一交由一個名為Spring IoC的容器統一管理,管理許可權包括:例項化、配置和組裝beans。Spring IoC容器通過讀取配置元資料獲取需要例項化、配置、組裝的物件的資訊。配置元資料資訊通常以XML檔案或Java註解或Java程式碼表示。

程式碼舉例:

介面:

public interface HelloService {
    public void sayHello();
}

實現類:

public class HelloServiceImp implements HelloService {
    public void sayHello() {
        System.out.println("Hello World!");
    }
}

前面提到可以用三種方式配置元資料資訊,這裡採用XML的方式:

helloworld.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans        
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context                
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
    <!-- id 表示元件的名字,class表示元件類 -->
    <bean id="helloService" class="com.HelloServiceImpl" />
    
</beans>

例項化一個IoC容器:

public class HelloServiceTest {
    public void testHelloWorld() {
        // 1、載入Spring上下文,讀取配置檔案例項化一個IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
        // 2、從容器中獲取Bean
        HelloService helloService = context.getBean("helloService", HelloService.class);
        // 3、執行業務邏輯
        helloService.sayHello();
    }
}

可以看到,頂層介面規定了方法,底下可以有各種列印輸出不同內容的實現類。通過配置xml的方式,將實現類註冊為一個具有特定ID的bean。在例項化容器部分,首先通過應用上下文讀取了元資料資訊,得到一個容器例項,然後獲取到一個bean,並將這個bean注入到Service,Service再執行具體方法。可以看到,我們的Service並不需要知道它要列印輸出的內容是什麼,只需負責它本來的任務,各部分各司其職,互不干擾但卻又互相配合。

Spring框架組成

Spring核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要元件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程式的配置和依賴性規範與實際的應用程式程式碼分開。

面向切面程式設計:這個模組是Spring應用系統中開發切面的基礎。AOP可以幫助應用物件解耦——將遍佈系統的關注點(如:事務、安全等)從它們所應用的物件中解耦出來。

資料訪問與整合:此模組抽象了大量樣板式程式碼,使得資料庫程式碼變得簡單明瞭。Spring ORM模組建立再對DAO的支援之上,併為多個ORM框架(如:Hibernate、iBATIS SQL Maps等)提供了一種構建DAO的簡便方式。

Web與遠端呼叫:自帶MVC框架——Spring MVC。整合RMI(Remote Method Invocation)、Hessian、Burlap、JAX-WS,自帶遠端呼叫框架——HTTP invoker。

測試:Spring為使用JNDI、Servlet和Portlet編寫端元測試提供了一些列的mock物件實現。

Spring還可以做什麼

Spring Portfolio包括多個構建於核心Spring框架之上的框架和類庫。整個Spring Portfolio幾乎為每一個領域的Java開發都提供了Spring程式設計模型。

Spring Boot:以Spring的視角,致力於簡化Spring本身。Spring Boot大量依賴於自動配置技術,它能夠消除大部分Spring配置。

Spring Web Flow:建立於Spring MVC框架之上,為基於流程的會話式Web應用(如購物車、嚮導等)提供了支援。

Spring Web Service:提供了契約優先的Web Service模型,服務的實現都是為了滿足服務的契約而編寫的。

Spring Security:利用Spring AOP,Spring Security為Spring應用提供了宣告式的安全機制。

Spring Integration:為了方便應用直接的互動,Spring Integerration提供了多種通用應用整合模式的Spring宣告式風格實現。

Spring Batch:適用於開發批處理應用,比如需要進行對資料的大量操作時。

Spring Data:不管使用的是文件資料庫(如:MongoDB),圖資料庫(如:Neo4j),還是傳統的關係型資料庫,Spring Data都提供了一種簡單的程式設計模型。

Spring Social:Spring Social更多的是關注connect而不是social,它能夠幫助你通過REST API連線Spring應用。

Spring Mobile:是Spring MVC新的擴充套件模組,用於支援移動Web應用開發。

如有錯誤之處,請多多原諒並且提出來,一起進步