溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為什么要用Spring作為Java框架

發布時間:2021-09-10 11:11:01 來源:億速云 閱讀:153 作者:chen 欄目:大數據

這篇文章主要講解了“為什么要用Spring作為Java框架”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“為什么要用Spring作為Java框架”吧!

1. 概述

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

最重要的是,我們將嘗試理解 Spring 成為我們選擇框架的原因。Spring 的詳細信息及其組成部分已在我們 之前的教程中廣泛介紹。 因此,我們將跳過介紹性的“如何”部分,并主要關注“為什么”。

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

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

像 Java 這樣的通用編程語言能夠支持多種應用程序。 更不用說 Java 每天都在積極地改進。

此外,還有無數開源和專有庫在這方面支持 Java 。

那么,我們究竟為什么需要一個框架呢?老實說,使用框架來完成任務并不是絕對必要的。但是,出于以下幾個原因,使用一個通常是明智的:

  • 幫助我們專注于核心任務,而不是與之相關的樣板

  • 以設計模式的形式匯集了多年的智慧

  • 幫助我們遵守行業和監管標準

  • 降低應用程序的總體擁有成本

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

  • 強制我們以特定的方式編寫應用程序

  • 綁定到特定版本的語言和庫

  • 添加到應用程序的資源占用

坦率地說,在軟件開發和框架中沒有什么銀彈,Java 當然也不例外。因此,應該根據上下文來選擇哪個框架或不用框架。

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

3. Spring 生態系統的簡要概述

在我們開始對 Spring 框架進行定性評估之前,讓我們仔細看看 Spring 生態系統是什么樣子的。

Spring 是在2003年的某個時候出現的,當時 Java 企業版發展迅速,開發企業應用程序很令人興奮,但也很乏味!

Spring 最初是 Java 的 一個控制反轉 (IoC)容器。我們仍然主要將 Spring 與它聯系起來,事實上,它構成了框架的核心,以及在此基礎上開發的其他項目。

3.1. Spring 框架

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

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

  • Data Access:支持通過JTA ( Java事務 API )、JPA (Java 持久性 API )和 JDBC (Java 數據庫連接)訪問數據

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

  • Integration:支持通過 JMS(Java 消息服務)、JMX (Java 管理擴展)和 RMI (遠程方法調用)集成到企業 Java

  • Testing:通過模擬對象、測試裝置、上下文管理和緩存支持單元和集成測試

3.2. Spring 項目

但是,Spring 更有價值的是一個強大的生態系統,這個生態系統多年來一直在發展,并且還在不斷發展。 它們的結構是 Spring 項目 ,它們是在 Spring 框架之上開發的。

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

  • Boot:為我們提供了一組高度自定義但可擴展的模板,用于在幾乎不花費時間的情況下創建基于 Spring 的各種項目。它使使用嵌入式 Tomcat 或類似容器創建獨立的 Spring 應用程序變得非常容易。

  • Cloud:提供支持輕松地開發一些常見的分布式系統模式,如服務發現,斷路器,以及 API 網關。 它有助于我們減少在本地,遠程甚至托管平臺中部署此類樣板模式的工作量。

  • Security:提供一種健壯的機制,以高度可定制的方式為基于 Spring 的項目開發身份驗證和授權。通過最少的聲明性支持,我們可以獲得對常見攻擊的保護,比如會話固定、點擊劫持和跨站點請求偽造。

  • Mobile:提供檢測設備并相應地調整應用程序行為的功能。此外,支持設備感知的視圖管理,以獲得最佳用戶體驗、站點首選項管理和站點切換器。

  • Batch:提供輕量級框架,用于為數據歸檔等企業系統開發批處理應用程序。對調度、重啟、跳過、收集指標和日志記錄有直觀的支持。此外,還支持通過優化和分區對大容量作業進行擴展。

毋庸置疑,這是對 Spring 所提供內容的一個相當抽象的介紹。但是它為我們提供了關于 Spring 的組織和廣度的足夠的基礎,以便我們進一步討論。

4. Spring 操作

人們習慣于添加一個 hello world 程序來了解任何新技術。

讓我們來看看 Spring 如何讓編寫一個不僅僅是 Hello World 的程序變得輕松自如。我們將創建一個應用程序,該應用程序將 CRUD 操作公開為一個域實體(如由內存數據庫支持的雇員)的 REST API。更重要的是,我們將使用基本認證來保護我們的突變端點。最后,沒有好的、舊的單元測試,任何應用程序都不能真正完成。

4.1. 項目設置

我們將使用 Spring Initializr 設置 Spring Boot 項目,這是一個方便的在線工具,可以引導具有正確依賴項的項目。我們將添加 Web、JPA、H2 和 Security 作為項目依賴項,以正確地獲得 Maven 配置設置。 更多細節引導在我們以前的文章之一。

4.2. 域模型和持久性

由于幾乎不需要做什么,我們已經準備好定義域模型和持久性。

讓我們首先將 Employee 定義為一個簡單的 JPA 實體:

@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
}

注意,我們在實體定義中包含了自動生成的 id 。

現在我們必須為實體定義 JPA 存儲庫。這就是 Spring 使它變得非常簡單的地方:

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

我們所要做的就是定義一個這樣的接口,Spring JPA 將為我們提供一個用默認和自定義操作充實的實現。相當整潔!在我們的其他文章中可以找到更多關于 使用 Spring Data JPA 的細節。

4.3. 控制器

現在我們必須定義一個網絡控制器路由和處理我們的傳入請求:

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

實際上,我們所要做的就是對這個類使用注解并定義路由元信息以及每個處理程序方法。

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

4.4. 安全

所以現在我們已經定義了所有內容,但是如何保護創建或刪除員工之類的操作呢?我們不希望對這些端點進行未經身份驗證的訪問!

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
}

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

4.5. 測試

現在我們已經做了所有的事情,但是等等,我們如何測試這個呢?

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

@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 為我們提供了必要的基礎設施來編寫簡單的單元和集成測試,否則這些測試將依賴于要初始化和配置的 Spring 上下文。

4.6. 運行應用程序

最后,我們如何運行這個應用程序?這是 Spring Boot 的另一個有趣的方面。盡管我們可以將其打包為常規應用程序并傳統上部署在 Servlet 容器上。

但這有什么好玩的!Spring Boot 附帶一個嵌入式 Tomcat 服務器

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

這是一個預先創建的類,作為引導程序的一部分,具有使用嵌入式服務器啟動此應用程序的所有必要細節。

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

5. Spring 的替代品

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

如前所述,Spring 框架及其項目為企業開發人員提供了廣泛的選擇。如果我們對當代 Java 框架做一個快速評估,它們甚至不能與 Spring 提供給我們的生態系統相提并論。

然而,對于特定的領域,它們確實形成了一個令人信服的論據來選擇替代方案:

  • Guice: 為 Java 應用程序提供一個健壯的 IoC 容器

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

  • Hibernate: 一個基于 JPA 支持的數據訪問框架

除了這些之外,還有一些新功能提供了比特定領域更廣泛的支持,但仍然沒有涵蓋 Spring 必須提供的所有內容:

  • Micronaut: 一個基于 JVM 的框架,針對云本地微服務而定制

  • Quarkus: 一個新時代的 Java 棧,它承諾提供更快的啟動時間和更小的內存占用

顯然,完全迭代這個列表既不必要也不可行,但是我們在這里得到了廣泛的概念。

6. 為什么選擇 Spring?

最后,我們構建了所有必需的上下文來解決我們的核心問題,為什么是 Spring?我們了解框架可以幫助我們開發復雜的企業應用程序的方式。

此外,我們了解我們針對特定問題所做的選擇,例如 Web,數據訪問,框架方面的集成,尤其是 Java 。

現在,在所有這些當中,Spring 的亮點在哪里?讓我們來探索一下。

6.1. 可用性

任何框架流行的一個關鍵方面是開發人員使用它是多么容易。Spring 通過多個配置選項和約定優于配置使開發人員可以輕松啟動,然后準確配置他們需要的內容。

Spring Boot 這樣的項目使得引導一個復雜的 Spring 項目變得非常簡單。更不用說,它有優秀的文檔和教程來幫助任何人入門。

6.2. 模塊化

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

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

6.3. 一致性

雖然 Spring 不支持所有 Java EE 規范,但它支持所有技術,通常在必要時提高對標準規范的支持。 例如,Spring 支持基于 JPA 的存儲庫,因此切換提供程序變得微不足道。

此外,Spring 支持行業規范,如 Spring Web Reactive 下的 Reactive Stream 和 Spring HATEOAS 下的 HATEOAS 。

6.4. 可測試性

采用任何框架在很大程度上還取決于測試構建在其上的應用程序是多么容易。 Spring 的核心是倡導并支持測試驅動開發(TDD)。

Spring 應用程序主要由 POJO 組成,這自然使單元測試相對簡單得多。 但是,Spring 確實為 MVC 等場景提供了 Mock 對象,否則單元測試變得復雜。

6.5. 成熟

Spring 在創新、采用和標準化方面有著悠久的歷史。多年來,它已經足夠成熟,可以成為大型企業應用程序開發中最常見問題的默認解決方案。

更令人興奮的是積極的開發和維護。每天都在開發對新語言特性和企業集成解決方案的支持。

6.6. 社區支持

最后但并非最不重要的是,任何框架甚至類庫都通過創新在行業中生存下來,而且沒有比社區更好的創新場所。 Spring 是由 Pivotal Software 領導的開源軟件,由大型組織和個人開發者組成的支持。

這就意味著它仍然具有背景意義,而且往往具有未來主義色彩,這一點從它旗下項目的數量就可以明顯看出。

7. 不使用 Spring 的原因

有各種各樣的應用程序可以從不同級別的 Spring 使用中受益,并且這種應用程序的變化與 Spring 的增長速度一樣快。

但是,我們必須理解 Spring 和其他框架一樣,有助于管理應用程序開發的復雜性。它幫助我們避免常見的陷阱,并使應用程序隨著時間的推移保持可維護性。

這是以額外的資源足跡和學習曲線為代價的,盡管可能很小。 如果確實存在一個足夠簡單并且預計不會變得復雜的應用程序,那么根本不使用任何框架可能會帶來更多益處!

8. 結論

在本文中,我們討論了在應用程序開發中使用框架的好處。我們還進一步簡要的討論了 Spring 框架。

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

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

不過,我們應該在本文的結尾給出一些建議。盡管聽起來很有說服力,但在軟件開發中通常沒有單一的、通用的解決方案。

因此,我們必須運用我們的智慧,為我們要解決的具體問題選擇最簡單的解決辦法。

感謝各位的閱讀,以上就是“為什么要用Spring作為Java框架”的內容了,經過本文的學習后,相信大家對為什么要用Spring作為Java框架這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女