iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
1

前言

從這章開始我們即將進入 Spring Boot 世界,前面章節是希望能與大家一起了解 Kotlin 基本語法,再進入後面章節的 Web 開發介紹,而自己在接觸 Spring 框架之前,其實有先接觸過 .Net MVCPHP LaravelPython FlaskDjango等框架,後來才在因緣際會之下進入 Spring 世界進行開發,還記得當初開始寫 Spring 時,其實對於 Spring 生態系有感受到不太好上手的狀況,但也有可能是因為我一開始接觸的 Spring 專案是早期開發配置的關係,就是利用許多XML配置和充滿非常多jar檔案的專案,光是在環境設定與學習就花了非常久的時間。

如果有朋友與我一樣,在因緣際會之下來到了 Spring 世界,我覺得可以從 Spring Boot 框架出發,至少在學習這條路上,開發的成就感會比較大,接下來的文章,我也將會從 Spring Boot 基礎由淺入深的方式進行介紹,與大家一同學習。

Spring 介紹

早期 Sun 公司在 1999 年 6月公佈新的Java體系架構,該架構根據不同級別的應用開發區分許多不同的應用版本,即J2SE(Java 2 Platform, Standard Edition)、J2EE(Java 2 Platform, Enterprise Edition)與J2ME(Java 2 Platform, Micro Edition):

  • J2SE 主要用於開發桌面應用軟體的程式設計
  • J2EE 主要用於網路程式開發
  • J2ME 主要用於嵌入式系統開發

而 J2SE、J2EE與J2ME 是當時所命名的名稱,直到 Java SE 6 出世後,Java不再帶有 2 這個數字,因此 J2SE、J2EE與J2ME分別被命名為Java SEJava EEJava ME,而 Sun 公司在2006年底,就將三大平台正名為Java SE、Java ME與Java EE,但時至今日,J2SE、J2ME與J2EE這個名詞還是很多人用。

其中,Java SE 又身為各應用平台基礎,許多人剛開始學習 Java 時,最先接觸的也是Java SE,它又可分作四個主要的部份:JVMJREJDKJava語言。為了要能運行Java撰寫好的程式,必須有Java虛擬機器(Java Virtual Machine, JVM),JVM 包括在 Java 執行環境(Java SE Runtime Environment, JRE)中,所以為了要運行Java程式,必須安裝JRE。如果要開發Java程式,必須取得JDK(Java SE Development Kits),JDK包括JRE以及開發過程中需要的一些工具程式,像是javac、java等工具程式。

Java EE 也以 Java SE 為基礎,定義了一系列的服務、API、協定等,適用於開發分散式、多層式架構、以元件為基礎、以Web為基礎的應用程式, 整個 Java EE 的體系其實是相當龐大的,比較為人熟悉的技術像是Java Server Pages (JSP)、Servlet、JavaMail、Enterprise JavaBeans(EJB)等。而早期J2EE應用程式是由 JSP、Java Servlet 與 EJB 模組等元件所組成,這些元件可供軟體開發人員建立大型之分散式應用程式,再由開發人員將 J2EE 應用程式封裝為 JAR 檔案部署至應用程式伺服器(Application Server)。

Spring Framework 是一個基於Java EE 的 MVC 框架,在設計目標上主要是為了簡化 Java EE 的應用程式開發為目的,進而取代 Java EE 早期非常龐大的技術-EJB,相較於 EJB 而言,Spring提供了更輕量和簡單的方法建構應用程式,加強 Java Plain Old Java Object(POJO) 功能,使整個框架具備之前只有 EJB 和其他企業級 Java 規範才具有的功能。

Spring 是一套開源框架,最早是由 Rod Johnson 為了解決企業級應用的開發複雜性所設計出來的框架,在Spring設計核心中,採取四種關鍵原則:

  • 使用POJO進行輕量級及最小侵入式開發
  • 透過依賴注入(Dependency, DI)和介面(Interface)實現鬆耦合
  • 透過AOP(Aspect Oriented Programming)和默認習慣進行宣告式程式設計
  • 透過AOP和樣板減少模式化程式碼

簡單來說,就是利用 Annotation 告訴 Spring 框架,標註的程式碼是代表什麼,進而減少重複例行性程式碼

在過去,Java 因具備有物件導向設計特性,大幅提升程式碼的維護與重用性,但也造成容易產生類別與類別之間的依賴關係,當專案不斷龐大時,程式容易造成高耦合性的發生。而在 Spring 框架核心部份運用了控制反轉(Inversion of Control, IOC)依賴注入(Dependency Injectionm, DI), 解決前述所提到的狀況。

IOC 其實是一種設計概念,將某物件對另一物件的控制權移轉給第三者進行管理,例如A物件程式內部需要使用到B物件時,代表A、B兩個物件具有依賴關係,而控制反轉則是將A對B的控制權移轉給第三者,讓A與B都必須倚賴第三者,降低A對B物件的耦合性。

以Spring框架來說,IOC概念主要運用在Spring可建立Bean物件負責控制物件的生命週期和物件間的關係,而Bean 只是普通的Java物件,由Spring IOC容器根據XML文件Java AnnotationJava Config文件進行創建、配對和管理。IOC容器執行的主要任務有「創建Bean物件」、「根據配置文件配對相依的Bean」、「為Bean設置初始化參數」、「管理Bean生命週期」,可讓開發者只需聲明所需要的物件,就可輕鬆達到寬鬆耦合(loose coupling)的目的,直接使用Bean的功能。IOC容器在 Spring 中有兩種類型(BeanFactory、ApplicationContext),其中 ApplicationContext 又比 BeanFactory 更加強大,故經常在專案中看見 ApplicationContext 的使用。

如上所述,IOC容器會根據開發者設定方式進行 Bean 的操作,而 Bean 目前在 Spring 可配置的方式有三種方式:

  1. XML - 使用 XML 文件進行配置
  2. Annotation - 使用 @Service 或 @Component 註解配置
  3. Java - 從 Spring 3 開始,可使用 Java 程式配置Bean,主要註解是 @Configuration、@ComponentScan 和 @Bean

DI 則是實現 IOC 的方法之一,是達到 抽離類別實體化 行為的一種設計模式,即是把被依賴物件注入被動接收物件中,有效解決兩個類別間耦合性過高的問題,通常會搭配介面(Interface)方式進行注入,DI概念與範例在前面的函數章節有提到。

前述有提到,Spring Framework是一個基於 Java EE 的 MVC 架構,常見的 MVC 架構也就是將一個應用程式(Application)架構分為模型層(Model)展示層 (View)控制層(Controller),通常Model會有一般類別或資料庫存取邏輯,View是與使用者互動的介面,Controller則是將Model與View串連起來的關鍵角色,而 Spring 除了 MVC 架構之外,它還提供相當多的元件,如:Spring SecuritySpring ValidationSpring Data等,讓我們在開發應用程式時,能夠將更多時間專注在系統的業務邏輯實現上。

以一個最基本的 Spring Controller來舉例,它本身就是一個類別,我們在撰寫時,會定義 package 以及需要載入(import)的類別,再利用 Java Annotation-@Controller 定義這個類別是個Controller。在類別中,只要指定HelloWorld方法的RequestMapping,也就是指定這個Controller的相對URI。以下面的程式範例來說,當瀏覽器要求 /Hello (實際網址為:http://localhost:8080/Hello ) 就會呼叫sayHi() 方法,而sayHi()方法的回傳值會是執行完這段程式碼之後要執行的事情,即回傳「Hello Spring & Kotlin」字串。

package com.devin;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
class HomeController {

    @RequestMapping("/Hello")
    @ResponseBody
    fun sayHi(): String {
        return "Hello Spring & Kotlin"
    }
}

上述這隻範例程式,當我們在瀏覽器輸入URL後,讓我們得到對應的字串「Hello Spring & Kotlin」,其實是透過 Web Container 與 Servlet 進行 HTTP 傳遞與處理,早期 JSP 檔案會被 Web 容器轉譯為 Servlet 的 .java 原始檔,再編譯為 .class 檔案載入容器進行運作,而在 Spring Web 中任何 Entry point 都是 Servlet,而 Web Container 是 Servlet 唯一認得的 HTTP 伺服器,以我們範例而言,使用的 Web Container 是 Tomcat。

上述有提到 Servlet 概念,Java Servlet 其實是運行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或 HTTP 用戶端請求和 HTTP 伺服器上的資料庫或應用程式之間的中介層(Middleware),使用Servlet,可以用來收集網頁表單的輸入值、呈現來自資料庫的資料或是可以動態創建網頁。
https://ithelp.ithome.com.tw/upload/images/20200921/20121179mPzvHwi9ZN.png

圖片引用自 w3big Servlet介紹

最後,Spring Boot 其實不算是一門新技術,以本質上來說,Spring Boot 就是 Spring,它是為了簡化 Spring 應用的建立、執行、除錯、部署等而出現的,使用它可以讓我們把時間更專注於業務邏輯的需求開發,無需過多關注 XML 配置,讓開發者可快速構建Spring應用。

Spring Boot 特色是:

  1. 能夠快速開發基於 Spring 的應用程式
  2. 預設使用內嵌的 Tomcat 作為應用伺服器
  3. 自動管理套件依賴版本
  4. 方便開發各種對外服務,如 REST API、WebSocket、Web、Streaming、Tasks
  5. 提供快速方便使用的微服務相關技術
  6. 提供一些大型項目常用的非功能性特性,例如:嵌入式服务、安全、監控、健康檢查、外部配置

Reference

  1. [官方] Spring Boot 官方文件
  2. [文章] 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

上一篇
[Day 11] 遠征 Kotlin × 函數式程式設計
下一篇
[Day 13] 遠征 Kotlin × 建置 Spring Boot 專案
系列文
30天從零撰寫 Kotlin 語言並應用於 Spring Boot 開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言