溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

為什么要用Spring作為Java框架

發(fā)布時(shí)間:2021-09-10 11:11:01 來(lái)源:億速云 閱讀:123 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“為什么要用Spring作為Java框架”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“為什么要用Spring作為Java框架”吧!

1. 概述

在本文中,我們將討論 Spring 作為最流行的 Java 框架之一的主要價(jià)值體現(xiàn)。

最重要的是,我們將嘗試?yán)斫?Spring 成為我們選擇框架的原因。Spring 的詳細(xì)信息及其組成部分已在我們 之前的教程中廣泛介紹。 因此,我們將跳過(guò)介紹性的“如何”部分,并主要關(guān)注“為什么”。

2. 為什么使用任何框架?

在我們開(kāi)始任何關(guān)于 Spring 的討論之前,首先讓我們了解為什么我們首先需要使用任何框架。

像 Java 這樣的通用編程語(yǔ)言能夠支持多種應(yīng)用程序。 更不用說(shuō) Java 每天都在積極地改進(jìn)。

此外,還有無(wú)數(shù)開(kāi)源和專(zhuān)有庫(kù)在這方面支持 Java 。

那么,我們究竟為什么需要一個(gè)框架呢?老實(shí)說(shuō),使用框架來(lái)完成任務(wù)并不是絕對(duì)必要的。但是,出于以下幾個(gè)原因,使用一個(gè)通常是明智的:

  • 幫助我們專(zhuān)注于核心任務(wù),而不是與之相關(guān)的樣板

  • 以設(shè)計(jì)模式的形式匯集了多年的智慧

  • 幫助我們遵守行業(yè)和監(jiān)管標(biāo)準(zhǔn)

  • 降低應(yīng)用程序的總體擁有成本

我們剛剛觸及了表面,我們必須說(shuō),好處難以忽視。但這不可能是積極的,所以要注意的是:

  • 強(qiáng)制我們以特定的方式編寫(xiě)應(yīng)用程序

  • 綁定到特定版本的語(yǔ)言和庫(kù)

  • 添加到應(yīng)用程序的資源占用

坦率地說(shuō),在軟件開(kāi)發(fā)和框架中沒(méi)有什么銀彈,Java 當(dāng)然也不例外。因此,應(yīng)該根據(jù)上下文來(lái)選擇哪個(gè)框架或不用框架。

在本文的最后,我們將更好地做出關(guān)于 Java 中的 Spring 的決策。

3. Spring 生態(tài)系統(tǒng)的簡(jiǎn)要概述

在我們開(kāi)始對(duì) Spring 框架進(jìn)行定性評(píng)估之前,讓我們仔細(xì)看看 Spring 生態(tài)系統(tǒng)是什么樣子的。

Spring 是在2003年的某個(gè)時(shí)候出現(xiàn)的,當(dāng)時(shí) Java 企業(yè)版發(fā)展迅速,開(kāi)發(fā)企業(yè)應(yīng)用程序很令人興奮,但也很乏味!

Spring 最初是 Java 的 一個(gè)控制反轉(zhuǎn) (IoC)容器。我們?nèi)匀恢饕獙?Spring 與它聯(lián)系起來(lái),事實(shí)上,它構(gòu)成了框架的核心,以及在此基礎(chǔ)上開(kāi)發(fā)的其他項(xiàng)目。

3.1. Spring 框架

Spring 框架 被劃分為多個(gè)模塊,這使得在任何應(yīng)用程序中都可以很容易地選擇要使用的部分:

  • Core:提供核心特性,如 DI (依賴(lài)注入)、國(guó)際化、驗(yàn)證和 AOP (面向切面編程)

  • Data Access:支持通過(guò)JTA ( Java事務(wù) API )、JPA (Java 持久性 API )和 JDBC (Java 數(shù)據(jù)庫(kù)連接)訪問(wèn)數(shù)據(jù)

  • Web:同時(shí)支持 Servlet API(Spring MVC)和最近的反應(yīng)式 API(Spring WebFlux),另外還支持WebSockets、STOMP 和 WebClient

  • Integration:支持通過(guò) JMS(Java 消息服務(wù))、JMX (Java 管理擴(kuò)展)和 RMI (遠(yuǎn)程方法調(diào)用)集成到企業(yè) Java

  • Testing:通過(guò)模擬對(duì)象、測(cè)試裝置、上下文管理和緩存支持單元和集成測(cè)試

3.2. Spring 項(xiàng)目

但是,Spring 更有價(jià)值的是一個(gè)強(qiáng)大的生態(tài)系統(tǒng),這個(gè)生態(tài)系統(tǒng)多年來(lái)一直在發(fā)展,并且還在不斷發(fā)展。 它們的結(jié)構(gòu)是 Spring 項(xiàng)目 ,它們是在 Spring 框架之上開(kāi)發(fā)的。

盡管 Spring 項(xiàng)目的清單很長(zhǎng),而且一直在變化,但仍有一些值得一提的地方:

  • Boot:為我們提供了一組高度自定義但可擴(kuò)展的模板,用于在幾乎不花費(fèi)時(shí)間的情況下創(chuàng)建基于 Spring 的各種項(xiàng)目。它使使用嵌入式 Tomcat 或類(lèi)似容器創(chuàng)建獨(dú)立的 Spring 應(yīng)用程序變得非常容易。

  • Cloud:提供支持輕松地開(kāi)發(fā)一些常見(jiàn)的分布式系統(tǒng)模式,如服務(wù)發(fā)現(xiàn),斷路器,以及 API 網(wǎng)關(guān)。 它有助于我們減少在本地,遠(yuǎn)程甚至托管平臺(tái)中部署此類(lèi)樣板模式的工作量。

  • Security:提供一種健壯的機(jī)制,以高度可定制的方式為基于 Spring 的項(xiàng)目開(kāi)發(fā)身份驗(yàn)證和授權(quán)。通過(guò)最少的聲明性支持,我們可以獲得對(duì)常見(jiàn)攻擊的保護(hù),比如會(huì)話固定、點(diǎn)擊劫持和跨站點(diǎn)請(qǐng)求偽造。

  • Mobile:提供檢測(cè)設(shè)備并相應(yīng)地調(diào)整應(yīng)用程序行為的功能。此外,支持設(shè)備感知的視圖管理,以獲得最佳用戶體驗(yàn)、站點(diǎn)首選項(xiàng)管理和站點(diǎn)切換器。

  • Batch:提供輕量級(jí)框架,用于為數(shù)據(jù)歸檔等企業(yè)系統(tǒng)開(kāi)發(fā)批處理應(yīng)用程序。對(duì)調(diào)度、重啟、跳過(guò)、收集指標(biāo)和日志記錄有直觀的支持。此外,還支持通過(guò)優(yōu)化和分區(qū)對(duì)大容量作業(yè)進(jìn)行擴(kuò)展。

毋庸置疑,這是對(duì) Spring 所提供內(nèi)容的一個(gè)相當(dāng)抽象的介紹。但是它為我們提供了關(guān)于 Spring 的組織和廣度的足夠的基礎(chǔ),以便我們進(jìn)一步討論。

4. Spring 操作

人們習(xí)慣于添加一個(gè) hello world 程序來(lái)了解任何新技術(shù)。

讓我們來(lái)看看 Spring 如何讓編寫(xiě)一個(gè)不僅僅是 Hello World 的程序變得輕松自如。我們將創(chuàng)建一個(gè)應(yīng)用程序,該應(yīng)用程序?qū)?CRUD 操作公開(kāi)為一個(gè)域?qū)嶓w(如由內(nèi)存數(shù)據(jù)庫(kù)支持的雇員)的 REST API。更重要的是,我們將使用基本認(rèn)證來(lái)保護(hù)我們的突變端點(diǎn)。最后,沒(méi)有好的、舊的單元測(cè)試,任何應(yīng)用程序都不能真正完成。

4.1. 項(xiàng)目設(shè)置

我們將使用 Spring Initializr 設(shè)置 Spring Boot 項(xiàng)目,這是一個(gè)方便的在線工具,可以引導(dǎo)具有正確依賴(lài)項(xiàng)的項(xiàng)目。我們將添加 Web、JPA、H2 和 Security 作為項(xiàng)目依賴(lài)項(xiàng),以正確地獲得 Maven 配置設(shè)置。 更多細(xì)節(jié)引導(dǎo)在我們以前的文章之一。

4.2. 域模型和持久性

由于幾乎不需要做什么,我們已經(jīng)準(zhǔn)備好定義域模型和持久性。

讓我們首先將 Employee 定義為一個(gè)簡(jiǎn)單的 JPA 實(shí)體:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String firstName;
    @NotNull
    private String lastName;
    // Standard constructor, getters and setters
}

注意,我們?cè)趯?shí)體定義中包含了自動(dòng)生成的 id 。

現(xiàn)在我們必須為實(shí)體定義 JPA 存儲(chǔ)庫(kù)。這就是 Spring 使它變得非常簡(jiǎn)單的地方:

public interface EmployeeRepository 
  extends CrudRepository<employee, long> {
    List<employee> findAll();
}

我們所要做的就是定義一個(gè)這樣的接口,Spring JPA 將為我們提供一個(gè)用默認(rèn)和自定義操作充實(shí)的實(shí)現(xiàn)。相當(dāng)整潔!在我們的其他文章中可以找到更多關(guān)于 使用 Spring Data JPA 的細(xì)節(jié)。

4.3. 控制器

現(xiàn)在我們必須定義一個(gè)網(wǎng)絡(luò)控制器路由和處理我們的傳入請(qǐng)求:

@RestController
public class EmployeeController {
    @Autowired
    private EmployeeRepository repository;
    @GetMapping("/employees")
    public List<employee> getEmployees() {
        return repository.findAll();
    }
    // Other CRUD endpoints handlers
}

實(shí)際上,我們所要做的就是對(duì)這個(gè)類(lèi)使用注解并定義路由元信息以及每個(gè)處理程序方法。

在我們的前一篇文章中詳細(xì)討論了如何使用 Spring REST 控制器。

4.4. 安全

所以現(xiàn)在我們已經(jīng)定義了所有內(nèi)容,但是如何保護(hù)創(chuàng)建或刪除員工之類(lèi)的操作呢?我們不希望對(duì)這些端點(diǎn)進(jìn)行未經(jīng)身份驗(yàn)證的訪問(wèn)!

Spring Security 在這方面非常出色:

@EnableWebSecurity
public class WebSecurityConfig 
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) 
      throws Exception {
        http
          .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/employees", "/employees/**")
            .permitAll()
          .anyRequest()
            .authenticated()
          .and()
            .httpBasic();
    }
    // other necessary beans and definitions
}

這里有 更多的細(xì)節(jié)需要注意理解 ,但最重要的一點(diǎn)是我們只允許 GET 操作不受限制的聲明式方式。

4.5. 測(cè)試

現(xiàn)在我們已經(jīng)做了所有的事情,但是等等,我們?nèi)绾螠y(cè)試這個(gè)呢?

讓我們看看 Spring 是否可以讓編寫(xiě) REST 控制器的單元測(cè)試變得更容易:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class EmployeeControllerTests {
    @Autowired
    private MockMvc mvc;
    @Test
    @WithMockUser()
    public void givenNoEmployee_whenCreateEmployee_thenEmployeeCreated() throws Exception {
        mvc.perform(post("/employees").content(
            new ObjectMapper().writeValueAsString(new Employee("First", "Last"))
            .with(csrf()))
          .contentType(MediaType.APPLICATION_JSON)
          .accept(MediaType.APPLICATION_JSON))
          .andExpect(MockMvcResultMatchers.status()
            .isCreated())
          .andExpect(jsonPath("$.firstName", is("First")))
          .andExpect(jsonPath("$.lastName", is("Last")));
    }
    // other tests as necessary
}

正如我們所看到的,Spring 為我們提供了必要的基礎(chǔ)設(shè)施來(lái)編寫(xiě)簡(jiǎn)單的單元和集成測(cè)試,否則這些測(cè)試將依賴(lài)于要初始化和配置的 Spring 上下文。

4.6. 運(yùn)行應(yīng)用程序

最后,我們?nèi)绾芜\(yùn)行這個(gè)應(yīng)用程序?這是 Spring Boot 的另一個(gè)有趣的方面。盡管我們可以將其打包為常規(guī)應(yīng)用程序并傳統(tǒng)上部署在 Servlet 容器上。

但這有什么好玩的!Spring Boot 附帶一個(gè)嵌入式 Tomcat 服務(wù)器

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

這是一個(gè)預(yù)先創(chuàng)建的類(lèi),作為引導(dǎo)程序的一部分,具有使用嵌入式服務(wù)器啟動(dòng)此應(yīng)用程序的所有必要細(xì)節(jié)。

此外,這是高度可定制的。

5. Spring 的替代品

雖然選擇使用框架相對(duì)容易,但在框架之間進(jìn)行選擇通常會(huì)讓我們的選擇變得艱巨。 但為此,我們必須至少粗略地了解 Spring 提供的功能有哪些替代方案。

如前所述,Spring 框架及其項(xiàng)目為企業(yè)開(kāi)發(fā)人員提供了廣泛的選擇。如果我們對(duì)當(dāng)代 Java 框架做一個(gè)快速評(píng)估,它們甚至不能與 Spring 提供給我們的生態(tài)系統(tǒng)相提并論。

然而,對(duì)于特定的領(lǐng)域,它們確實(shí)形成了一個(gè)令人信服的論據(jù)來(lái)選擇替代方案:

  • Guice: 為 Java 應(yīng)用程序提供一個(gè)健壯的 IoC 容器

  • Play: 非常適合作為具有響應(yīng)性支持的 Web 框架

  • Hibernate: 一個(gè)基于 JPA 支持的數(shù)據(jù)訪問(wèn)框架

除了這些之外,還有一些新功能提供了比特定領(lǐng)域更廣泛的支持,但仍然沒(méi)有涵蓋 Spring 必須提供的所有內(nèi)容:

  • Micronaut: 一個(gè)基于 JVM 的框架,針對(duì)云本地微服務(wù)而定制

  • Quarkus: 一個(gè)新時(shí)代的 Java 棧,它承諾提供更快的啟動(dòng)時(shí)間和更小的內(nèi)存占用

顯然,完全迭代這個(gè)列表既不必要也不可行,但是我們?cè)谶@里得到了廣泛的概念。

6. 為什么選擇 Spring?

最后,我們構(gòu)建了所有必需的上下文來(lái)解決我們的核心問(wèn)題,為什么是 Spring?我們了解框架可以幫助我們開(kāi)發(fā)復(fù)雜的企業(yè)應(yīng)用程序的方式。

此外,我們了解我們針對(duì)特定問(wèn)題所做的選擇,例如 Web,數(shù)據(jù)訪問(wèn),框架方面的集成,尤其是 Java 。

現(xiàn)在,在所有這些當(dāng)中,Spring 的亮點(diǎn)在哪里?讓我們來(lái)探索一下。

6.1. 可用性

任何框架流行的一個(gè)關(guān)鍵方面是開(kāi)發(fā)人員使用它是多么容易。Spring 通過(guò)多個(gè)配置選項(xiàng)和約定優(yōu)于配置使開(kāi)發(fā)人員可以輕松啟動(dòng),然后準(zhǔn)確配置他們需要的內(nèi)容

Spring Boot 這樣的項(xiàng)目使得引導(dǎo)一個(gè)復(fù)雜的 Spring 項(xiàng)目變得非常簡(jiǎn)單。更不用說(shuō),它有優(yōu)秀的文檔和教程來(lái)幫助任何人入門(mén)。

6.2. 模塊化

Spring 受歡迎的另一個(gè)關(guān)鍵方面是其高度模塊化的特性。 我們可以選擇使用整個(gè) Spring 框架或僅使用必要的模塊。 此外,我們可以根據(jù)需要選擇包含一個(gè)或多個(gè) Spring 項(xiàng)目。

而且,我們還可以選擇使用 Hibernate 或 Struts 等其他框架!

6.3. 一致性

雖然 Spring 不支持所有 Java EE 規(guī)范,但它支持所有技術(shù),通常在必要時(shí)提高對(duì)標(biāo)準(zhǔn)規(guī)范的支持。 例如,Spring 支持基于 JPA 的存儲(chǔ)庫(kù),因此切換提供程序變得微不足道。

此外,Spring 支持行業(yè)規(guī)范,如 Spring Web Reactive 下的 Reactive Stream 和 Spring HATEOAS 下的 HATEOAS 。

6.4. 可測(cè)試性

采用任何框架在很大程度上還取決于測(cè)試構(gòu)建在其上的應(yīng)用程序是多么容易。 Spring 的核心是倡導(dǎo)并支持測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)。

Spring 應(yīng)用程序主要由 POJO 組成,這自然使單元測(cè)試相對(duì)簡(jiǎn)單得多。 但是,Spring 確實(shí)為 MVC 等場(chǎng)景提供了 Mock 對(duì)象,否則單元測(cè)試變得復(fù)雜。

6.5. 成熟

Spring 在創(chuàng)新、采用和標(biāo)準(zhǔn)化方面有著悠久的歷史。多年來(lái),它已經(jīng)足夠成熟,可以成為大型企業(yè)應(yīng)用程序開(kāi)發(fā)中最常見(jiàn)問(wèn)題的默認(rèn)解決方案。

更令人興奮的是積極的開(kāi)發(fā)和維護(hù)。每天都在開(kāi)發(fā)對(duì)新語(yǔ)言特性和企業(yè)集成解決方案的支持。

6.6. 社區(qū)支持

最后但并非最不重要的是,任何框架甚至類(lèi)庫(kù)都通過(guò)創(chuàng)新在行業(yè)中生存下來(lái),而且沒(méi)有比社區(qū)更好的創(chuàng)新場(chǎng)所。 Spring 是由 Pivotal Software 領(lǐng)導(dǎo)的開(kāi)源軟件,由大型組織和個(gè)人開(kāi)發(fā)者組成的支持。

這就意味著它仍然具有背景意義,而且往往具有未來(lái)主義色彩,這一點(diǎn)從它旗下項(xiàng)目的數(shù)量就可以明顯看出。

7. 不使用 Spring 的原因

有各種各樣的應(yīng)用程序可以從不同級(jí)別的 Spring 使用中受益,并且這種應(yīng)用程序的變化與 Spring 的增長(zhǎng)速度一樣快。

但是,我們必須理解 Spring 和其他框架一樣,有助于管理應(yīng)用程序開(kāi)發(fā)的復(fù)雜性。它幫助我們避免常見(jiàn)的陷阱,并使應(yīng)用程序隨著時(shí)間的推移保持可維護(hù)性。

這是以額外的資源足跡和學(xué)習(xí)曲線為代價(jià)的,盡管可能很小。 如果確實(shí)存在一個(gè)足夠簡(jiǎn)單并且預(yù)計(jì)不會(huì)變得復(fù)雜的應(yīng)用程序,那么根本不使用任何框架可能會(huì)帶來(lái)更多益處!

8. 結(jié)論

在本文中,我們討論了在應(yīng)用程序開(kāi)發(fā)中使用框架的好處。我們還進(jìn)一步簡(jiǎn)要的討論了 Spring 框架。

在討論這個(gè)主題時(shí),我們還研究了一些可用于 Java 的替代框架。

最后,我們討論了促使我們選擇 Spring 作為 Java 選擇框架的原因。

不過(guò),我們應(yīng)該在本文的結(jié)尾給出一些建議。盡管聽(tīng)起來(lái)很有說(shuō)服力,但在軟件開(kāi)發(fā)中通常沒(méi)有單一的、通用的解決方案。

因此,我們必須運(yùn)用我們的智慧,為我們要解決的具體問(wèn)題選擇最簡(jiǎn)單的解決辦法。

感謝各位的閱讀,以上就是“為什么要用Spring作為Java框架”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)為什么要用Spring作為Java框架這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI