軟件庫(kù)與框架的區(qū)別
【注】本文譯自:「鏈接」
庫(kù)(Libraries)是提供特定功能(如建立網(wǎng)絡(luò)連接)的低級(jí)組件??蚣埽‵ramework)是已知的編程環(huán)境,比如 Spring Boot。
當(dāng)軟件主管開始構(gòu)建新的企業(yè)應(yīng)用程序時(shí),他們必須決定要使用哪一組庫(kù)和框架。 這引出了一個(gè)明顯的問題:軟件庫(kù)和框架之間有什么區(qū)別?
庫(kù)和軟件框架都有助于應(yīng)用程序的開發(fā)。但是,兩者之間的主要區(qū)別在于它們的任務(wù)范圍,以及它們減輕開發(fā)人員編寫代碼負(fù)擔(dān)的方式。
庫(kù)提供了開發(fā)人員可以調(diào)用來執(zhí)行特定功能的組件、類和方法。相比之下,框架提供的代碼已經(jīng)執(zhí)行了通常需要的功能,并在需要定制功能時(shí)調(diào)用開發(fā)人員提供的代碼。
庫(kù)與框架
庫(kù)是一組相關(guān)的低級(jí)組件,開發(fā)人員調(diào)用這些組件來實(shí)現(xiàn)特定結(jié)果。常用庫(kù)函數(shù)包括日期格式化和建立網(wǎng)絡(luò)連接。
框架處理更高級(jí)別的問題??蚣芴峁┝艘粋€(gè)既定的編程環(huán)境,它本身建立在低級(jí)庫(kù)之上。
例如,框架可能會(huì)處理如何最好地將應(yīng)用程序中的所有對(duì)象映射到相關(guān)數(shù)據(jù)庫(kù)中的表中。它還可以處理如何向最終用戶提供豐富的、基于 Web 的體驗(yàn)。

軟件庫(kù)示例
一個(gè)庫(kù)的例子是 Java 日期和時(shí)間 API。它是一組定義屬性和方法的類和接口,開發(fā)人員可以使用這些屬性和方法來格式化日期、執(zhí)行時(shí)區(qū)轉(zhuǎn)換并提供全局日歷支持。Java 開發(fā)人員在需要時(shí)實(shí)例化 Date 和 Time 類,并以他們認(rèn)為合適的任何方式調(diào)用庫(kù)的方法。
另一個(gè) Java 庫(kù)示例是流行的?java.net?網(wǎng)絡(luò) I/O 包。該庫(kù)由數(shù)十個(gè)類和接口組成,開發(fā)人員使用這些類和接口來打開網(wǎng)絡(luò)端口、處理傳入連接并將數(shù)據(jù)發(fā)送到互連的客戶端。
只需要使用?java.net?包,軟件開發(fā)人員就可以實(shí)現(xiàn)處理基于 REST 的 Web 服務(wù)或通過 HTTP 協(xié)議的基于 HTML 的請(qǐng)求-響應(yīng)循環(huán)所需的所有必要邏輯。java.net?庫(kù)提供了一組低級(jí) API,任何開發(fā)人員都可以使用這些 API 來開發(fā)通過網(wǎng)絡(luò)進(jìn)行通信的應(yīng)用程序。
流行的 Java 庫(kù)
其他流行的 Java 庫(kù),包括已經(jīng)利用了 Java 框架的?Spring Boot、JHipster 或 Vaadin 等 的庫(kù),包括:
Apache Commons Math
BouncyCastle for cryptography
Java Advanced Imaging
Java Speech
Java 3D
JavaMail
Joda-Time
Apache Collections
Jackson for JSON and XML
Java Networking
軟件框架的作用
企業(yè)項(xiàng)目通常需要開發(fā)人員提供一組 RESTful API,以便外部客戶端與在線應(yīng)用程序集成。然而,許多開發(fā)人員不僅解決了如何使用低級(jí)?java.net?庫(kù)來處理 RESTful API 調(diào)用的問題,而且還將他們的工作作為開源項(xiàng)目來分享。這是軟件框架的本質(zhì)。它是一個(gè)現(xiàn)有項(xiàng)目,解決了一個(gè)常見且具有挑戰(zhàn)性的問題,開發(fā)人員可以在自己的項(xiàng)目中使用它。
框架是解決常見且具有挑戰(zhàn)性的問題的現(xiàn)有項(xiàng)目,開發(fā)人員可以在自己的項(xiàng)目中使用它。
在給定的問題域中,通常有許多框架可供選擇。在 Java 生態(tài)系統(tǒng)中,有許多流行的框架使用標(biāo)準(zhǔn)的 Java 和 Jakarta EE 庫(kù)來解決如何最好地處理基于 REST 的請(qǐng)求-響應(yīng)周期的問題,包括:
Spring Boot
Jersey
RESTEasy
Restlet
Micronaut
Apache CFX
JAX-RS
框架有觀點(diǎn)
將框架與庫(kù)區(qū)分開來的另一個(gè)關(guān)鍵特征是后者通常包括關(guān)于如何解決給定問題、問題的范圍以及如何以最有效和最有效的方式解決框架目標(biāo)的觀點(diǎn)。
框架將在各種非功能性需求上展開競(jìng)爭(zhēng),例如易用性、性能、可插入性和兼容性。
框架和控制反轉(zhuǎn)
最后,庫(kù)和框架之間的一個(gè)關(guān)鍵區(qū)別因素是兩者之間的相對(duì)控制反轉(zhuǎn) (IoC)。IoC 通常被稱為好萊塢原則。與庫(kù)不同,框架對(duì)開發(fā)人員編寫的代碼采取“不要打電話給我們,我們會(huì)打電話給你”的方法。
要使用庫(kù)開發(fā)應(yīng)用程序,開發(fā)人員必須實(shí)例化庫(kù)組件并調(diào)用其中存在的類和接口的方法。例如,如果開發(fā)人員想要使用?java.net?庫(kù)來創(chuàng)建他們自己的 RESTful 應(yīng)用程序,他們將需要調(diào)用各種 API 來打開端口、處理 HTTP 連接、將數(shù)據(jù)格式化為 XML 或 JSON 表示形式來回通信,以及當(dāng)客戶端發(fā)起請(qǐng)求時(shí)發(fā)起一個(gè)請(qǐng)求。
另一方面,框架負(fù)責(zé)支持項(xiàng)目核心功能所需的所有底層管道。只有在需要時(shí),框架才會(huì)調(diào)用開發(fā)人員提供的代碼。
IoC 和 Spring Boot
用 Spring Boot 編寫的 RESTful Web 服務(wù)很好地體現(xiàn)了 IoC 的好萊塢原則。
使用 Spring Boot RESTful Web 服務(wù),開發(fā)人員只需編寫在發(fā)生基于 HTTP 的 GET 調(diào)用時(shí)要執(zhí)行的邏輯。當(dāng) GET 調(diào)用發(fā)生時(shí),Spring Boot 框架會(huì)處理它,解釋它,將數(shù)據(jù)交換格式轉(zhuǎn)換為 JSON 或 XML,然后將 RESTful 請(qǐng)求路由到開發(fā)人員的業(yè)務(wù)邏輯。
開發(fā)人員只需要編寫業(yè)務(wù)邏輯。由框架決定何時(shí)調(diào)用業(yè)務(wù)邏輯。
IoC 框架在 Java 中很常見。以下是十個(gè)常見的例子。
Hibernate
Struts
JavaServer Faces
Play for Scala
Vaadin
JHipster
JRuby
JUnit
Quarkus
Grails
框架和庫(kù)一起使用
雖然框架和庫(kù)有不同的功能,但它們都可以幫助開發(fā)者完成更多工作。當(dāng)許多常見的編程挑戰(zhàn)已經(jīng)被解決并以許可的開源項(xiàng)目的形式被共享時(shí),沒有軟件專業(yè)人員愿意浪費(fèi)時(shí)間重復(fù)發(fā)明輪子。
每當(dāng)您啟動(dòng)一個(gè)新的軟件開發(fā)項(xiàng)目時(shí),選擇一個(gè)已被證明和建立的軟件開發(fā)框架非常重要。同時(shí),與您的個(gè)人開發(fā)和設(shè)計(jì)理念保持一致。在極少數(shù)情況下,特定的情況超出了所選框架的范圍,標(biāo)準(zhǔn)庫(kù)總是在那里幫助您的開發(fā)人員彌合差距。