教妹學Java:Spring 入門篇
你好呀,我是沉默王二,一個和黃家駒一樣身高,劉德華一樣顏值的程式設計師(管你信不信呢)。從兩位偶像的年紀上,你就可以斷定我的碼齡至少在 10 年以上,但實話實說,我一直堅信自己只有 18 歲,因為我有一顆好學的心。本篇文章就打算通過我和三妹對話的形式來學一學“Spring 的基礎”。
教妹學 Java,沒見過這麼放肆的標題吧?“語不驚人死不休”,沒錯,本篇文章的標題就是這麼酷炫,不然你怎麼會點進來?
![](http://www.itwanger.com/assets/images/2020/03/java-spring-rumen-01.png)
我有一個漂亮如花的妹妹(見上圖),她叫什麼呢?我想聰明的讀者能猜得出:沉默王三,沒錯,年方三六。父母正考慮讓她向我學習,做一名正兒八經的 Java 程式設計師。我期初是反對的,因為程式設計師這行業容易掉頭髮。但家命難為啊,與其反對,不如做點更積極的事情,比如說寫點有趣的文章教教她。
![](http://www.itwanger.com/assets/images/2020/03/java-spring-rumen-02.gif)
“二哥,你怎麼現在才想起來要教我學 Spring 啊?”
“沒辦法啊,三妹,之前教妹學 Java 系列被噴的體無完膚,沒辦法就停滯了。今天決定走自己的路,讓別人也走自己的路去。”
“我就說嘛,Spring 在 Java 中佔據那麼重要的位置,你竟然沒捨得教我,還以為你怕被我拍死在沙灘上呢?”
“嗯,你天真了。”
01、Spring 簡史
“二哥,據說 Spring 前後經歷了 3 個時代,你能給我說說嗎?”
“沒問題啊。”
1)石器時代
也就是 Spring 1.x 時代,一個專案看上去全都是 xml 檔案,裡面配置著各種各樣的 bean,專案越大,xml 檔案就越多,到最後人都感覺不好了,像回到了原始社會。
2)黑鐵時代
也就是 Spring 2.x 時代,終於可以使用註解配置 bean 了,這主要得益於 JDK 1.5 新增的註解功能。想一想,一個小小的註解,比如說 @Component
、@Service
就可以替代一大段的 xml 配置程式碼,簡直爽歪歪啊。
使用 xml 檔案配置資料來源,使用註解配置業務類,兩種方式相得益彰。
3)黃金時代
也就是 Spring 3.x 至今,可以使用 Java 配置的方式了。那什麼是 Java 配置呢?
其實從形式上看,Java 配置和註解配置沒什麼區別,因為 Java 配置也用的是註解,只不過,以前用 application-context.xml 配置資料來源等資訊,現在用 @Configuration
02、Spring 特性
“二哥,據說 Spring 的特性非常豐富,你能給我說說嗎?”
“沒問題啊。”
1)核心技術:依賴注入(DI)、面向切面程式設計(AOP)、國際化、資料繫結、型別轉換
2)測試:TestContext 框架、Spring MVC 測試
3)資料訪問:事務、JDBC、物件關係對映(ORM)
4)Spring MVC(一個模型 - 檢視 - 控制器「MVC」的 Web 框架)、Spring WebFlux(一個典型非阻塞非同步的框架)
5)Spring Integration(面向企業應用整合)
03、Spring 生態
“二哥,據說 Spring 的生態圈非常火熱,你能給我說說嗎?”
“沒問題啊。”
1)Spring Boot:當下最火的一個 Spring 專案了,使用它我們可以快速搭建好一個專案
2)Spring Cloud:為分散式開發提供了強大的工具集
3)Spring Security:通過認證和授權保護應用
4)Spring Web Flow:基於 Spring MVC 的流程式 Web 應用
5)等等等等
04、快速搭建 Spring 專案
“二哥,說了那麼多,能不能來個上手專案,讓我瞧瞧 Spring 專案到底長什麼樣子?”
“馬上就來,三妹。”
我推薦使用 Intellij IDEA 作為整合開發工具,因為它外掛豐富、功能全面。就我們目前的開發任務來說,社群版足夠用了。
1)開啟 IDEA,依次點選 File→New→Project→Maven。
![](http://www.itwanger.com/assets/images/2020/03/java-spring-rumen-03.png)
2)點選 Next 後填寫專案的名稱,然後建立專案。開啟 pom.xml 檔案,新增以下內容。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
dependencies 節點下添加了 Spring 的核心依賴 spring-context,它為 Spring 提供了一個執行時的環境,用以儲存各個物件的狀態。它依賴於 Spring 的四個核心元件:spring-aop、spring-beans、spring-core、spring-expression,也就是說只要引入 spring-context 的依賴,Maven 會自動引入這四個核心。
build 節點下添加了 Maven 的編譯外掛,並且指定了 Java 的編譯版本為 1.8。
3)IDEA 下編輯檔案會自動儲存,所以與此同時,Maven 會將 Spring 的依賴包全部下載到本地倉庫中。
4)稍稍眯一會眼睛,就可以看到 Spring 的依賴包了。
![](http://www.itwanger.com/assets/images/2020/03/java-spring-rumen-04.png)
5)Maven 是一個軟體專案管理工具,基於專案物件模型(Project Object Model,明白 pom.xml 的由來了吧?)的概念,可以管理專案依賴的 jar 包,對專案進行編譯打包等。
6)新建 HelloService 類,程式碼如下:
@Service
public class HelloService {
public void hello (String what) {
System.out.println("hello " + what);
}
}
@Service
註解一般在業務邏輯層使用。該類非常簡單,只有一個方法 hello()
,引數是字串,然後在控制檯列印 hello xxx
。
7)新建 HelloConfig 類,程式碼如下:
@Configuration
public class HelloConfig {
@Bean
public HelloService helloService() {
return new HelloService();
}
}
@Configuration
註解表明當前類是一個配置類,相當於 Spring 配置的一個 xml 檔案。
@Bean
註解用在 helloService()
方法上,表明當前方法返回一個 Bean 物件(HelloService),然後將其交給 Spring 管理。產生這個 Bean 物件的方法只會被呼叫一次,隨後 Spring 將其放在自己的 IOC 容器中。
8)新建 HelloMain 類,程式碼如下:
public class HelloMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HelloConfig.class);
HelloService helloService = context.getBean(HelloService.class);
helloService.hello("66666");
context.close();
}
}
HelloMain 類中有一個 main()
方法,它負責將當前專案跑起來。
AnnotationConfigApplicationContext
是一個用來管理註解 Bean 的容器,可以將 @Configuration
註解的類 Class 作為引數獲取容器物件。再通過 getBean()
方法獲取註冊的 Bean 物件。獲取到 HelloService 物件後,就可以讓它說一聲“66666”了。
![](http://www.itwanger.com/assets/images/2020/03/java-spring-rumen-05.png)
“二哥,這篇文章中的示例程式碼你上傳到碼雲了嗎?最近 GitHub 訪問起來有點卡。”
“你到挺貼心啊,三妹。碼雲傳送門~”
“二哥,你教得真不錯,我完全學會了,一點也不枯燥。”
“那必須滴啊,期待下一篇吧?”
“那是當然啊,期待,非常期待,望眼欲穿的感覺。”
![](http://www.itwanger.com/assets/images/2020/03/java-spring-rumen-06.gif)
05、鳴謝
請允許我熱情地吐槽一下,這篇文章我不希望再被噴了,看在我這麼辛苦搞原創(創意+乾貨+有趣)的份上,多鼓勵鼓勵好不好?別瞅了,點讚唄,你最美你最帥