1. 程式人生 > 程式設計 >快速入門 Java 後端開發的正確姿勢

快速入門 Java 後端開發的正確姿勢

這篇文章本是我的收費專欄裡的一篇文章,發現有很多人會付費閱讀這篇文章,因此決定將其免費分享出來,希望可以將其擴散幫到更多想快速入門Java的開發人員。

------------- 以下是正文----------------

前面三篇文章我們已經聊完了如何快速入門 Android、iOS、Web 前端開發,本篇輪到最後一個端——Java 後端了。Java 後端有著非常龐大的生態圈,也涉及到很多複雜的問題,如分散式事務、分散式查詢、微服務、高併發、容災、容器化等等,涉及到的技術棧和框架就更多了。不過,我們目前只是為了快速入門,我們只會學習最必要的那些知識,能支撐到我們進行實際專案的開發即可。那麼,我們需要學習的核心知識主要包括 Java

ServletJDBCMySQLRedisSpringMyBatis 等。Java 基礎部分在聊入門 Android開發時已經講過,這裡就不重複講了。

開發工具

先聊下 Java 後端的開發工具吧,我推薦使用 IntelliJ IDEA,這是被公認為最好用的 Java 開發工具,熟悉 Android Studio 的 Android 開發人員對它應該不陌生,其強大的功能和特性可以說是完虐 EclipseMyEclipse,尤其我最喜歡它的智慧程式碼提示功能。IDEA 用熟了之後絕對大大提升開發效率,目前我們公司開發人員也是全面轉向 IDEA 了。這裡我向大家推薦一套很詳細的中文專題教程,該教程在 github 上是開源的,也經常更新,以下是地址:

如果英文比較好,建議還是直接閱讀官方的幫助檔案:

Servlet

Servlet 是 Java Web 的底層技術,雖然現在因為有 Spring 框架,我們已經不需要直接編寫 Servlet 了,但作為底層技術,我們還是要了解其原理,這樣我們才能更好地理解在其之上的 Spring 框架等。

Servlet 其實就是 Server Applet —— 伺服器小程式,即執行在伺服器上的一個小程式,也是一個基於 Java 技術的 Web 元件。編寫一個 Servlet,實際上也是按照 Servlet 規範編寫一個 Java 類。只是這個 Java 類是不能獨立執行的,它並沒有 main 函式,它必須被部署到 Servlet 容器

中,由容器來例項化和呼叫 Servlet 的方法。Servlet 容器也稱為 Web 容器,目前主要就是 TomcatJetty,兩者各有優劣,Jetty 更滿足公有云的分散式環境的需求,而 Tomcat 更符合企業級環境。我們大部分時候還是處於開發企業級應用階段,因此,還是優先選擇 Tomcat。

目前 Servlet 規範已經演進到 4.0 版本,相比之前的版本,主要是新增了對 HTTP/2 的支援。另外,3.0 版本相比之前的 2.5 版本,最重要的則是新增了對 WebSocket 的支援,3.0 版本之前的 Servlet 只支援 HTTP 請求。那麼,對於目前的 Servlet 來說,需要學習哪些知識點呢?這次,我先把核心的知識點羅列出來,後面再來推薦一些相關的學習資源。

  • 環境配置:包括開發環境部署環境,要熟悉這兩種環境的搭建,開發環境主要就是 JDK 和 IDEA 的安裝配置,部署環境則是 Web 容器 Tomcat 的安裝配置。另外,Java Web 普遍使用 Maven 作為構建工具,所以也要了解下 Maven 的用法。雖然 Gradle 比 Maven 更先進,但在 Java 後端大部分專案目前依然還在使用 Maven。
  • 生命週期:要了解 Servlet 的生命週期,並瞭解 Servlet 容器對 Servlet 例項是如何管理的。
  • API:Servlet 的常用 API 要熟悉,主要包括 Servlet 介面、ServletConfig、ServletContext、RequestDispatcher、ServletRequest、ServletResponse、HttpServlet、HttpServletRequest、HttpServletResponse,尤其是最後兩個類 HttpServletRequestHttpServletResponse 必須要非常熟悉,這是在實際開發中會頻繁使用到的。
  • 過濾器:Servlet 過濾器可以攔截請求和響應,並進行一些處理。主要用於對使用者請求進行鑑權、做日誌記錄、對資料進行過濾或替換、對資料進行解碼或解密等等,多個過濾器可以組成一條過濾器鏈。
  • 監聽器:Servlet 監聽器主要用來監聽 ServletContext、HttpSession、ServletRequest 物件的生命週期事件,以及這些物件的屬性改變事件。
  • WebSocket:需要注意的是,網上有些繼承 WebSocketServlet 的實現方式已經是 Deprecated(過期)的,根據 Oracle 釋出的 Java 的 WebSocket 的 JSR356規範所展示的實現方式有兩種,一種是使用 @ServerEndpoint 註解,另一種是繼承 javax.websocket.Endpoint 類,推薦使用註解。關於 WebSocket 的開發入門可以看這篇文章:java WebSocket開發入門WebSocket

關於對 HTTP/2 的支援,目前還沒大範圍使用,相關資料也是非常少,可以以後再瞭解。

接著,再來推薦一些學習資源。首推 Head First 的一本書**《Head First Servlets & JSP》**,還是保持一貫通俗易懂的作風,非常適合入門。不過,其中,第 7/8/9 三章關於 JSP 的內容可以略過,畢竟 JSP 早已經過時不用了。第 14 章講模式部分則非常值得看,應該說是每個人都必看,當你理解了裡面所講的內容後,才有可能設計出一個更好的系統。

另外,我的 Servlet 入門書籍**《Servlet/JSP深入詳解——基於Tomcat的Web開發》也是本不錯的入門書,只是太老舊已經停印了,所以在亞馬遜、京東、噹噹等都買不到了,要看只能到網上找電子版了。比較新的一本書叫《Servlet、JSP和Spring MVC學習指南》**,2016年底出版,不過我沒看過,不知道怎麼樣。

菜鳥有一套簡明教程,其實也是翻譯自國外的一套英文教程,也可以簡單看看,有個基本認識。以下是地址:

視訊資源方面,我找到一份 Servlet 3.0 特性專題視訊,也分享給大家:

JDBC

JDBC = Java DataBase Connectivity(Java 資料庫連線),是一套訪問資料庫的標準 Java API。通過呼叫這套 API,就可以連線到資料庫,可以執行 SQL 語句,對資料庫裡的資料進行處理。不過,JDBC API 只是一套規範介面,真正與資料庫進行連線的則是 JDBC 驅動程式,不同的資料庫採用不同的 JDBC 驅動程式。

和 Servlet 一樣,因為有更方便的框架,我們也不直接使用 JDBC 的 API 進行資料庫程式設計了。不過,HibernateMyBatis 框架的底層還是 JDBC,因此,我們還是要了解 JDBC 的基本原理,才能更快地上手 MyBatis 等框架。好在這部分的內容很少,所以我們只需要投入很少時間就可以掌握了。也找了一份線上的 JDBC 教程分享給大家,以下是地址:

JDBC 的核心介面和類就只有幾個:DriverDriverManagerConnectionStatementResultSetSQLException。要了解這幾個介面和類的用法,以及瞭解使用 JDBC 的流程,簡單來說就是五個步驟:

  1. 註冊 JDBC 驅動程式;
  2. 建立與資料庫的連線;
  3. 執行 SQL 語句;
  4. 獲取結果資料;
  5. 清理資源。

另外,也要了解下對事務的處理,包括事務的提交和回滾。以及瞭解如何對 SQL 進行批量處理。所有這些內容在上面的 JDBC 教程中都有講述,我就不展開說了。另外,我在上面介紹的**《Servlet/JSP深入詳解——基於Tomcat的Web開發》**一書中也有一個章節專門講了 JDBC,也可以看一看。

資料庫

我們知道,資料庫分為關係型資料庫非關係型資料庫兩大類。關係型資料庫主要就是 MySQLOracleDB2PostgreSQL 等,標準資料查詢語言 SQL 就是一種基於關係型資料庫的語言。非關係型資料庫也稱 NoSQL(Not only SQL),主要包括 RedisMongoDBHBase 等。如今,很多專案都會使用一種以上的資料庫,其中,Redis 可以說是必選的。另外,MySQL 作為最流行的關係型資料庫,開源而且入門簡單,因此我們就先熟悉這兩個資料庫。

先介紹下關係型資料庫設計工具吧,非關係型資料庫好像沒什麼專門的設計工具就不介紹了。首先,Windows 下無疑 PowerDesigner 是最強大也是最流行的,可惜的是它並沒有推出 Mac 版本。Mac 下我推薦使用 Navicat,既是好用的關係資料庫客戶端,也是不錯的資料庫建模工具,建模完成後可以匯出為一個 SQL 檔案,很方便。

對於 MySQL,目前我們也還不需要去研究比較深入的東西,比如儲存引擎、儲存過程、觸發器、事務隔離級別、分散式事務、鎖機制等等,最初級的主要了解以下內容:

  • 安裝配置:這不用說,最最基本的
  • SQL:對 SQL 肯定要非常熟悉,這也是最基本的
  • 資料型別:要了解 MySQL 有哪些資料型別,以及不同資料型別之間有哪些差異
  • 約束:瞭解並熟悉各種約束的用法,包括主鍵約束、非空約束、唯一性約束、自增約束、預設值約束等
  • 索引:索引很重要,必須要懂,當然,如何用好索引也是門學問
  • 函式:瞭解一些常用的函式,如 count、sum、avg、max、min、now 等等

這些基礎方面的知識就不用推薦什麼學習資源了,網上隨便找一大把。不過,對於掌握這些基礎知識之後的深入學習,我推薦兩本書:《高效能 MySQL》《MySQL 技術內幕:InnoDB 儲存引擎》。另外,官方檔案也是必不可少的,只是內容比較多。

對於 Redis,因為是基於記憶體的,所以效能非常高,很多專案用它作快取。雖然是一個 key - value 資料庫,但 value 可以是字串(String)、雜湊(Map)、列表(List)、集合(Sets)、有序集合(Sorted Sets) 等型別。推薦一個菜鳥的簡明教程,可以簡單入門:

書籍方面,推薦看**《Redis實戰》**,是一本非常不錯且廣受好評的入門書籍。

另外,Redis 的 Java 庫叫 Jedis,也要簡單瞭解下其用法。

Spring

Spring 發展到如今,已經成為一個很龐大的生態圈,我們所瞭解的 Spring Framework 只是整個 Spring 生態圈的一個核心專案,除此之外還有很多其他專案,包括 Spring BootSpring CloudSpring DataSpring For Android 等 20 多個專案,你可以在 Spring 官網看到所有專案。不過,我們入門只先了解兩個專案:Spring BootSpring Framework。其中,Spring Framework 是我們要學習的核心框架,但也不是要了解這個專案的全部內容,只先了解一些基礎的東西,能夠支撐到我們進行入門級的開發就足夠了。

那麼,先來聊聊 Spring Framework,目前最新版本是 Spring Framework 5.0。Spring Framework 包含有20多個模組,包括 spring-corespring-aopspring-beansspring-contextspring-jdbcspring-webspring-webmvcspring-websocket 等等,具體列表可以檢視 Spring Framework 的 Github 專案。不過,一般我們不需要將所有模組都引入到專案中,根據所需去引入即可。

學習 Spring Framework,有兩個核心設計思想是要掌握的,就是 控制反轉(Inversion of Control,簡稱 IoC)面向切面程式設計(Aspect Oriented Programming,簡稱 AOP)。說到控制反轉,還有一個概念也要理解,叫 依賴注入(Dependency Injection,簡稱 DI),區別就是,控制反轉是一種設計思想,而依賴注入則是其中一種實現的方式,還有另一個實現方式叫依賴查詢(Dependency Lookup)。不過,大部分都是採用依賴注入,Spring 使用的也是依賴注入的方式。另外,Spring 核心還有一個控制反轉容器(IoC Container),主要就是通過配置檔案以及利用反射在執行時建立所需要的實現類。要理解這幾個概念,推薦看知乎上的一個回答,深入淺出,非常好理解:

AOP 同樣也是一種設計思想,主要是為了分離出一些非業務邏輯的程式碼,如日誌記錄、效能統計,安全控制,事務處理,異常處理等。在 Spring 底層是通過動態代理的方式實現了 AOP 的內部機制,另外,上層也支援 AspectJ 的註解方式。AOP 中還有幾個相關概念需要理解:AspectJoint pointPointcutAdviceWeaveIntroductionTarget ObjectAOP Proxy。那麼,為了幫助大家理解 AOP 這些概念和原理,以及 Spring 中要如何使用 AOP,我找了兩篇文章分享給大家學習:

接著,再來瞭解下 Spring Boot,Spring Boot 能夠簡化基於 Spring 的應用的搭建和開發,Spring Cloud 就是基於 Spring Boot 的。Spring Boot 從根本上來說就是一些庫的集合,這些庫的 artifactId 一般都是以 spring-boot-starter- 為字首。使用 Spring Boot 搭建專案也是非常簡單的,我就分享《Spring Cloud微服務實戰》一書的作者翟永超部落格的兩篇文章給大家吧:

要相對系統地入門 Spring,我推薦評價最高的兩本書:《Spring實戰(第4版)》《精通Spring 4.x:企業應用開發實戰》。兩本書都是基於 Spring 4 的,基於 Spring 5 的書籍還沒有,不過這對於入門來說並沒什麼影響。另外,《精通Spring 4.x:企業應用開發實戰》這本書中還加了 Spring Boot 的章節。Spring Framework 的官方檔案也可以看,內容畢竟是最新也是最詳細的,只是內容太多了,據說有600多頁,所以一時半會是看不完的,一般也不推薦初學者直接看官方檔案,只建議對某些點理解得還不是很深的情況下可以去翻來看看,加深理解。Spring Boot 的官方檔案也是一樣。

MyBatis

前面我們知道,Java 訪問資料庫的標準 API 是 JDBC,只是,直接使用 JDBC API 進行編碼操作資料庫的話,程式碼非常繁瑣,可擴充套件性非常低,因此,才會衍生出 HibernateMyBatisSpringJDBC 等對 JDBC 進行了封裝的 ORM 框架,以簡化開發。那麼,為什麼選擇 MyBatis,而不是 Hibernate 或 SpringJDBC 呢?主要是因為目前最流行的還是 MyBatis,另外 MyBatis 也容易上手。

先來瞭解下 ORM 這個概念,ORM = Object Relational Mapping,稱為物件關係對映,即業務實體物件和關係資料庫之間建立起一種對映關係,最簡單的對映關係就是:一個類對應一張資料表,類的每個例項對應表中的一條記錄,類的每個屬性則對應表的每個欄位。Hibernate 是一個標準的 ORM 框架,在實體類和資料庫之間建立了完整的對映關係,基本不需要開發人員自己寫 SQL,內部會自動生成 SQL 語句,因此,對於資料量非常大的應用,想要優化 SQL 語句就比較困難。MyBatis 則是一個半自動化的 ORM 框架,不同於 Hibernate 提供了從實體類到資料庫表的全套對映機制,SQL 是自動生成的;而 MyBatis 則只是在實體類和 SQL 之間建立對映關係,並不自動生成 SQL 語句,因此,開發人員是需要自己寫 SQL 的。這樣,對 SQL 進行優化則比較方便了。

要了解 MyBatis 的用法,直接看官方檔案即可,內容不多,且還有中文版本,以下是連結地址:

實戰入門

前面的內容非常多,要通過實戰專案將所有知識點全部串起來還真的比較難,主要是如今已經找不到專案會直接編寫 Servlet 和 JDBC 了,而這兩塊是 Java Web 的底層技術,必須要理解透徹。那麼,我們只能拆開來學習,Servlet 和 JDBC 原生部分,建議就按照書籍上的 Demo 去練習,主要目的是要通過編碼對那些核心的知識點形成深刻理解。Spring、MyBatis、資料庫這些,則可以通過一些開源專案進行學習,我找到一個基於 Spring Boot 的不錯的學習專案,推薦給大家:

裡面的每個小專案都非常簡單,建議重點看 springboot-mybatis-redis 這個小專案,最貼合我們需要學習的內容。因為專案太簡單,建議對其進行擴充套件,比如,自己多增加一個表,並通過增加新的 REST 介面對其進行增刪改查;或者新增使用者註冊登入功能,並使用過濾器對使用者作統一鑑權;或者再新增對 WebSocket 的支援。最好是將其擴充套件成一個相對完整的 Java Web 專案,比如做一個簡化的電商專案,不需要介面,只需要提供介面。當你能完成這個完整的 Java Web 專案之後,也算真正入門了。

思考與實踐

如果用 Gradle 作為構建工具,要如何配置?與 Android 的配置有何不同?SpringJDBC 要怎麼使用?與 MyBatis 比較如何?通過專案實戰去感受這些知識點的差異吧。


掃描以下二維碼即可關注訂閱號。