30個類手寫Spring核心原理之環境準備(1)

Tom彈架構發表於2021-12-09

本文節選自《Spring 5核心原理》

1 IDEA整合Lombok外掛

1.1 安裝外掛

IntelliJ IDEA是一款非常優秀的整合開發工具,功能強大,而且外掛眾多。Lombok是開源的程式碼生成庫,是一款非常實用的小工具,我們在編輯實體類時可以通過Lombok註解減少getter、setter等方法的編寫,在更改實體類時只需要修改屬性即可,減少了很多重複程式碼的編寫工作。
首先需要安裝IntelliJ IDEA中的Lombok外掛,開啟IntelliJ IDEA後單擊選單欄中的File→Settings(如下圖所示),或者使用快捷鍵Ctrl+Alt+S進入設定介面。

file

單擊設定介面中的Plugins進行外掛的安裝,在右側單擊Browse repositories按鈕,如下圖所示。

file

然後在搜尋介面中輸入lombok可以查詢到下方的Lombok Plugin,單擊Lombok Plugin可在右側看到Install按鈕,單擊該按鈕便可開始安裝,如下圖所示。

file

我們在如下安裝介面可以看到Lombok支援的所有註解。

file

在安裝過程中有Downloading Plugins的提示,安裝過程中進度條會變化。需要提醒的是,在安裝過程中一定要保證網路連線可用且良好,否則可能會安裝失敗。
安裝成功後可以看到下圖右側的Restart IntelliJ IDEA按鈕,此時可先不操作,因為還有後續的配置工作。

file

回到Plugins,此時在下圖右側可以搜尋到Lombok(而安裝前搜尋不到)。

file

1.2 配置註解處理器

在如下設定介面單擊Build, Execution, Deployment→Compiler→Annotation Processors,然後在右側勾選Enable annotation processing複選項即可。

file

1.3 使用外掛

使用前需要說明的是,安裝的外掛只是一個呼叫,就像我們使用maven外掛一樣,本機需要安裝maven才行。我們在使用Lombok前也需要在pom.xml檔案中新增Lombok的依賴。


#託管的類掃描包路徑#
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.10</version>
</dependency>

接下來編輯一個Config測試類,新增兩個屬性,最後在類上新增@Data屬性,這個註解可以幫我們在.class檔案中生成類中所有屬性的get/set、equals、canEqual、hashCode、toString方法等,如下圖所示。

file

我們還可以通過下面的方式檢視Lombok生成的方法。在選單欄中單擊View→Tool Windows→Structure,便可以看到類中所有的方法,這些都是Lombok自動生成的,如下面兩圖所示。

file

file

2 從Servlet到ApplicationContext

在“用300行程式碼手寫提煉Spring核心原理”一章中,我們已經瞭解Spring MVC的入口是DispatcherSerlvet,並實現了DispatcherServlet的init()方法,在init()方法中完成了IoC容器的初始化。而在使用Spring的過程中,見得最多的是ApplicationContext,似乎Spring託管的所有例項Bean都可以通過呼叫getBean()方法來獲得。那麼ApplicationContext又是從何而來的呢?從Spring原始碼中可以看到,DispatcherServlet的類圖如下圖所示。

file

DispatcherServlet繼承了FrameworkServlet,FrameworkServlet繼承了HttpServletBean,HttpServletBean繼承了HttpServlet。在HttpServletBean的init()方法中呼叫了FrameworkServlet的initServletBean()方法,在initServletBean()方法中初始化WebApplicationContext例項。在initServletBean()方法中呼叫了DispatcherServlet重寫的onRefresh()方法。在DispatcherServlet的onRefresh()方法中又呼叫了initStrategies()方法,初始化Spring MVC的九大元件。
其實,通過上面複雜的呼叫關係可以得出一個結論:在Servlet的init()方法中初始化了IoC容器和Spring MVC所依賴的九大元件。
在手寫之前先將框架類關係畫出來,如下圖所示,順便也回顧一下我們之前講過的IoC容器結構。

file

3 準備基礎配置

在開始手寫之前我們先做一個約定,所有的手寫類都以GP開頭,以區別於Spring框架中的原生類,方便對比理解。如DispatcherServlet在這個Mini版本中會命名為GPDispatcherServlet,所有的方法名儘量和原生Spring保持一致,可能有些引數列表會做一些微調,主要目的是理解設計思路。

3.1 application.properties配置

還是先從application.properties檔案開始,用application.properties來代替application.xml,具體配置如下:


#託管的類掃描包路徑#
scanPackage=com.gupaoedu.vip.spring.demo

3.2 pom.xml配置

接下來看pom.xml的配置,主要關注jar包依賴:


<properties>
    <!-- dependency versions -->
    <servlet.api.version>2.4</servlet.api.version>
</properties>

<dependencies>
    <!-- requied start -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>${servlet.api.version}</version>
        <scope>provided</scope>
    </dependency>
    <!-- requied end -->

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

</dependencies>

3.3 web.xml配置

web.xml配置如下:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:javaee="http://java.sun.com/xml/ns/javaee"
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
   version="2.4">
   <display-name>Gupao Spring Application</display-name>

   <servlet>
      <servlet-name>gupaomvc</servlet-name>
      <servlet-class>com.gupaoedu.vip.spring.formework.webmvc.servlet.GPDispatcherServlet </servlet-class>
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:application.properties</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>gupaomvc</servlet-name>
      <url-pattern>/*</url-pattern>
   </servlet-mapping>

</web-app>

3.4 GPDispatcherServlet

GPDispatcherServlet程式碼如下:


package com.gupaoedu.vip.spring.formework.webmvc.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//Servlet只是作為一個MVC的啟動入口
public class GPDispatcherServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

用30個類手寫一個Spring的準備階段就到此為止,大家一定要記得自己動手操作。光看不練假把式。

本文為“Tom彈架構”原創,轉載請註明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支援是我堅持創作的動力。

原創不易,堅持很酷,都看到這裡了,小夥伴記得點贊、收藏、在看,一鍵三連加關注!如果你覺得內容太乾,可以分享轉發給朋友滋潤滋潤!

相關文章