<div>
<a class="article-series-header" href="javascript:void(0);"></a>
<div>
<div>
• Java Collections 面試問題
<br>
• Java 類型系統面試問題
<br>
• Java 併發面試問題 (+ 答案)
<br>
• Java 類結構和初始化面試問題
<br>
• Java 8 面試問題 (+ 答案)
<br>
• Java 內存管理在 Java 面試問題 (+ 答案)
<br>
• Java 通用問題 (+ 答案)
<br>
• Java 流程控制面試問題 (+ 答案)
<br>
• Java 異常面試問題 (+ 答案)
<br>
• Java 註解面試問題 (+ 答案)
<br>
<div>
• Spring 框架頂部的面試問題 <span>(當前文章)</span>
</div>
</div>
<div>
• 目錄
<ul>
<li><a href="#introduction"><strong>1.</strong> 概述</a></li>
<li><a href="#spring-core"><strong>2.</strong> Spring 核心</a></li>
<li><a href="#Q1"><strong>Q1.</strong> 什麼是 Spring 框架?</a></li>
<li><a href="#Q2"><strong>Q2.</strong> 使用 Spring 的好處是什麼?</a></li>
<li><a href="#Q3"><strong>Q3.</strong> 你知道哪些 Spring 子項目?簡要描述一下它們。</a></li>
<li><a href="#Q4"><strong>Q4.</strong> 什麼是依賴注入?</a></li>
<li><a href="#Q5"><strong>Q5.</strong> 我們可以如何注入 Bean 到 Spring 中?</a></li>
<li><strong><a href="#Q6">Q6.</strong> 哪種方式注入 Bean 最好,為什麼?</a></strong><a href="#Q6">Q6.</strong></li>
<li><a href="#Q7"><strong>Q7.</strong> BeanFactory 和 ApplicationContext 有什麼區別?</a></li>
<li><a href="#Q8"><strong>Q8.</strong> 什麼是 Spring Bean?</a></li>
<li><a href="#Q9"><strong>Q9.</strong> Spring 框架的默認 Bean 作用域是什麼?</a></li>
<li><strong><a href="#Q10">Q10. </strong></strong><a href="#Q10">Q10.</strong> 如何定義 Bean 的作用域?</a></li>
<li><a href="#Q11"><strong>Q11.</strong> Singleton Bean 是否線程安全?</a></li>
<li><a href="#Q12"><strong>Q12.</strong> Spring Bean 生命週期是什麼樣的?</a></li>
<li><a href="#Q13"><strong>Q13.</strong> 什麼是 Spring Java 配置文件?</a></li>
<li><a href="#Q14"><strong>Q14.</strong> 我們可以在一個項目中擁有多個 Spring 配置文件嗎?</a></li>
<li><a href="#Q15"><strong>Q15.</strong> 什麼是 Spring Security?</a></li>
<li><a href="#Q16"><strong>Q16.</strong> 什麼是 Spring Boot?</a></li>
<li><a href="#Q17"><strong>Q17.</strong> 列出在 Spring 框架中使用的設計模式中的一些。</a></li>
<li><a href="#Q18"><strong>Q18.</strong> Prototype 作用域是如何工作的?</a></li>
</ul>
<br>
<ul>
<li><a href="#spring-web-MVC"><strong>3.</strong> Spring Web MVC</a></li>
<li><a href="#Q19"><strong>Q19.</strong> 如何獲取 ServletContext 和 ServletConfig 對象在 Spring Bean 中?</a></li>
<li><a href="#Q20"><strong>Q20.</strong> 控制器在 Spring MVC 中是什麼?</a></li>
<li><a href="#Q21"><strong>Q21.</strong> @RequestMapping 註解是如何工作的?</a></li>
</ul>
<br>
<ul>
<li><a href="#spring-data-access"><strong>4.</strong> Spring 數據訪問</a></li>
<li><a href="#Q22"><strong>Q22.</strong> Spring Jdbctemplate 類是什麼以及如何使用它?</a></li>
<li><a href="#Q23"><strong>Q23.</strong> 如何在 Spring 中啓用事務以及它們的優勢是什麼?</a></li>
<li><a href="#Q24"><strong>Q24.</strong> 什麼是 Spring DAO?</a></li>
</ul>
<br>
<ul>
<li><a href="#spring-aspect-oriented-programming"><strong>5.</strong> Spring 方面編程 (AOP)</a></li>
<li><a href="#Q25"><strong>Q25.</strong> 什麼是面向方面編程?</a></li>
<li><a href="#Q26"><strong>Q26.</strong> 方面、建議、斷點和 JoinPoint 在 AOP 中是什麼?</a></li>
<li><a href="#Q27"><strong>Q27.</strong> 什麼是編織?</a></li>
</ul>
<br>
<ul>
<li><a href="#spring-5"><strong>6.</strong> Spring 5</a></li>
<li><a href="#Q28"><strong>Q28.</strong> 什麼是反應式編程?</a></li>
<li><a href="#Q29"><strong>Q29.</strong> 什麼是 Spring WebFlux?</a></li>
<li><a href="#Q30"><strong>Q30.</strong> Mono 和 Flux 類型是什麼?</a></li>
<li><a href="#Q31"><strong>Q31.</strong> WebClient 和 WebTestClient 的用途是什麼?</a></li>
<li><a href="#Q32"><strong>Q32.</strong> 使用反應式流的缺點是什麼?</a></li>
<li><a href="#Q33"><strong>Q33.</strong> Spring 5 與舊版本的 Java 兼容嗎?</a></li>
<li><a href="#Q34"><strong>Q34.</strong> Spring 5 如何與 JDK 9 模塊化集成?</a></li>
<li><a href="#Q35"><strong>Q35.</strong> 我們可以同時使用 Web MVC 和 WebFlux 嗎?</a></li>
</ul>
<br>
<ul>
<li><a href="#conclusion"><strong>7.</strong> 結論</a></li>
</ul>
</div>
</div>
1. 概述
在本教程中,我們將探討在面試中可能出現的一些最常見 Spring 相關問題。
2. Spring Core
Spring Core 是 Spring 框架的核心模塊,它提供了核心功能,如 IoC(Inversion of Control)容器、依賴注入(Dependency Injection)以及面向對象編程的基礎設施。Spring Core 模塊定義了 Spring 框架的基礎架構,併為其他模塊提供了統一的接口。
核心概念:
- IoC (Inversion of Control): 在傳統的面向對象編程中,對象之間需要顯式地依賴彼此。IoC 模式則將控制權從應用程序代碼轉移到容器,容器負責管理對象的創建、配置和生命週期。
- 依賴注入 (Dependency Injection): 依賴注入是 IoC 的一種實現方式。它通過將對象的依賴關係從對象本身轉移到容器中來實現。常見的依賴注入類型包括:
- 構造注入 (Constructor Injection): 通過構造函數的參數注入依賴。
- Setter 注入 (Setter Injection): 通過 setter 方法注入依賴。
- 接口注入 (Interface Injection): 通過接口定義注入點,容器根據接口實現進行注入。
- Bean: Spring 容器管理的核心對象,通常指一個實現了 Spring 定義接口的 Java 類。
- Bean 定義: 描述如何創建和配置 Bean 的信息,包括 Bean 的名稱、作用域、依賴關係等。
代碼示例:
// 這是一個簡單的 Bean 定義示例
@Component
public class MyBean {
// ... 業務邏輯 ...
}
註釋: 這個 Bean 定義使用 @Component 註解聲明這是一個 Spring 組件,Spring 容器會自動管理這個 Bean 的生命週期。
Q1. 什麼是 Spring 框架?
Spring 是用於開發 Java Enterprise Edition 應用程序的最廣泛使用的框架。 此外,Spring 的核心功能可用於開發任何 Java 應用程序。
我們使用它的擴展功能來在 Jakarta EE 平台上構建各種 Web 應用程序。 此外,我們還可以僅使用其依賴注入機制在簡單的獨立應用程序中進行使用。
Q2. 使用Spring的優勢是什麼?
Spring 旨在簡化 Jakarta EE 開發,下面我們來看看其優勢:
- 輕量級 – 使用框架會帶來輕微的開發開銷。
- 依賴反轉 (IoC) – Spring 容器負責管理各種對象的依賴關係,而不是創建或查找依賴對象。
- 面向方面編程 (AOP) – Spring 支持 AOP,可以將業務邏輯與系統服務分離。
- IoC 容器 – 管理 Spring Bean 的生命週期以及項目特定的配置。
- MVC 框架 – 用於創建 Web 應用程序或 RESTful Web 服務,能夠返回 XML/JSON 響應。
- 事務管理 – 通過使用 Java 註解或 Spring Bean XML 配置文件的方式,減少 JDBC 操作、文件上傳等中的樣板代碼量。
- 異常處理 – Spring 提供了一種便捷的 API,可以將特定於技術的異常翻譯為未檢查異常。
Q3. 您瞭解哪些 Spring 子項目?簡要描述它們。
- 核心 – 關鍵模塊,提供框架的基本組成部分,例如 IoC 或 DI
- JDBC – 提供 JDBC 抽象層,無需為特定供應商數據庫編寫 JDBC 代碼
- ORM 集成 – 提供對流行的對象關係映射 API 的集成層,例如 JPA、JDO 和 Hibernate
- Web – 以 Web 為導向的集成模塊,提供多部分文件上傳、Servlet 監聽器和以 Web 為導向的應用程序上下文功能
- MVC 框架 – 以 MVC 設計模式實現的 Web 模塊
- AOP 模塊 – 提供面向切面編程的實現,允許定義清晰的方法攔截器和切入點
Q4. 什麼是依賴注入?
依賴注入(Dependency Injection,簡稱DI)是控制反轉(IoC)的一個方面,它是一種通用概念,指出我們不手動創建對象,而是描述它們應該如何被創建。然後,IoC容器會在需要時實例化所需的類。
關於更多細節,請參考 這裏。
Q5. 如何在 Spring 中注入 Bean?
以下是一些在 Spring 中注入 Bean 的方法:
- 設置注入 (Setter Injection)
- 構造函數注入 (Constructor Injection)
- 字段注入 (Field Injection)
配置可以通過 XML 文件或註解進行。
要了解更多信息,請查看本文。
Q6. 哪種方式注入 Bean 最好,為什麼?
推薦的方法是使用構造函數參數注入強制依賴項,並使用 setter 方法注入可選依賴項。這是因為構造函數注入允許將值注入不可變字段,並且更容易進行測試。
Q7. BeanFactory 和 ApplicationContext 的區別是什麼?
<em>BeanFactory</em> 是一個接口,代表一個提供和管理 Bean 實例的容器。默認實現在調用 <em>getBean()</em> 時延遲實例化 Bean。
相比之下,<em>ApplicationContext</em> 是一個接口,代表一個包含應用程序的所有信息、元數據和 Bean 的容器。它還擴展了 <em>BeanFactory</em> 接口,但默認實現在應用程序啓動時立即實例化 Bean。但是,這種行為可以針對單個 Bean 進行覆蓋。
關於所有差異,請參閲 文檔。
Q8. 什麼是 Spring Bean?
Spring Bean 是由 Spring IoC 容器初始化的 Java 對象。
Q9. Spring 框架的默認 Bean 作用域是什麼?
默認情況下,Spring Bean 會被初始化為 單例。
Q10. 如何定義 Bean 的作用域?
為了設置 Spring Bean 的作用域,可以使用 <em >@Scope</em> 註解或 XML 配置文件的“scope”屬性。請注意,有五個支持的作用域:
- 單例 (Singleton)
- 原型 (Prototype)
- 請求 (Request)
- 會話 (Session)
- 全局會話 (Global-session)
有關不同之處,請參閲 這裏。
Q11. 單例 Bean 是否線程安全?
No, singleton beans are not thread-safe, as thread safety is about execution, whereas the singleton is a design pattern focusing on creation. Thread safety depends only on the bean implementation itself.
Q12. Spring Bean 生命週期流程是怎樣的?
首先,Spring Bean 需要基於 Java 或 XML Bean 定義進行實例化。 它也可能需要執行一些初始化操作,使其進入可用狀態。 之後,當 Bean 不再被需要時,它將被從 IoC 容器中移除。
整個包含所有初始化方法的生命週期如圖所示 (原文):
Q13. Java 基於的配置是什麼?
這是一種以類型安全的方式配置 Spring 應用程序的一種方式。它是 XML 方式配置的替代方案。
此外,為了將項目從 XML 遷移到 Java 配置,請參閲這篇文章。
Q14. 我們的項目中可以擁有多個 Spring 配置文件嗎?
是的,在大型項目中,擁有多個 Spring 配置文件被推薦,以提高可維護性和模塊化程度。
我們可以加載多個基於 Java 的配置文件:
@Configuration
@Import({MainConfig.class, SchedulerConfig.class})
public class AppConfig {或者,我們也可以加載一個 XML 文件,其中包含所有其他配置:
ApplicationContext context = new ClassPathXmlApplicationContext("spring-all.xml");在 XML 文件內部,我們將包含以下內容:
<import resource="main.xml"/>
<import resource="scheduler.xml"/>Q15. Spring Security 是什麼?
Spring Security 是 Spring 框架中的一個獨立模塊,專注於為 Java 應用程序提供身份驗證和授權方法。它還負責處理常見的安全漏洞,例如 CSRF 攻擊。
要將 Spring Security 應用於 Web 應用程序,可以從簡單的註解 @EnableWebSecurity 開始。
有關更多信息,我們有一系列與安全相關的文章。
Q16. Spring Boot 簡介?
Spring Boot 是一個提供預配置的框架集,旨在減少樣板配置。 這樣,我們就可以用最少的代碼快速啓動一個 Spring 應用。
Q17. 列舉 Spring 框架中使用的設計模式有哪些?
- 單例模式 – singleton 作用域的 Bean
- 工廠模式 – BeanFactory 類
- 原型模式 – prototype 作用域的 Bean
- 適配器模式 – Spring Web 和 Spring MVC
- 代理模式 – Spring 面向方面編程的支持
- 模板方法模式 – JdbcTemplate, HibernateTemplate, 等等
- 前置控制器 – Spring MVC 的 DispatcherServlet
- 數據訪問對象 – Spring DAO 支持
- 模型視圖控制器 – Spring MVC
Q18. 作用域原型的工作原理是什麼?
作用域原型(Scope Prototype)意味着每次調用 Bean 的實例時,Spring 都會創建一個新的實例並返回。這與默認的單例(Singleton)作用域不同,後者僅在 Spring IoC 容器中實例化一個單一的 對象實例。
3. Spring Web MVC
Spring Web MVC 是 Spring Framework 中用於構建基於 Servlet 的 Web 應用程序的模塊。它遵循 Model-View-Controller (MVC) 設計模式,將應用程序邏輯、數據和用户界面分離,從而提高代碼的可維護性和可測試性。
核心組件:
- DispatcherServlet: Servlet 的核心,負責處理所有傳入的 HTTP 請求,並將其路由到相應的處理器。
- Controller: 負責處理用户請求,並將其轉換為模型對象。
- View Resolver: 將模型對象轉換為視圖(例如 JSP、Thymeleaf)的視圖對象。
- Template: 用於渲染視圖對象,生成最終的 HTML 頁面。
- Handler Mapping: 根據請求的 URL 和 HTTP 方法,將請求路由到相應的 Handler。
- Validator: 驗證用户輸入的數據,確保數據的有效性。
關鍵特性:
- Model-View-Controller (MVC) 設計模式: 清晰地分離了應用程序的不同部分,提高了代碼的可維護性和可測試性。
- 基於 Servlet 的架構: 與 Java EE 兼容,可以利用現有的 Servlet 基礎設施。
- 靈活的配置: 通過 XML 或註解配置,可以靈活地定製 Web 應用程序的行為。
- 強大的測試支持: 易於編寫單元測試和集成測試,確保應用程序的質量。
示例代碼 (Java):
// Example Controller
@Controller
public class MyController {
@GetMapping("/hello")
public String hello() {
return "hello"; // 返回視圖名稱
}
@GetMapping("/world")
public String world() {
return "world"; // 返回視圖名稱
}
}
Q19. 如何在 Spring Bean 中獲取 ServletContext 和 ServletConfig 對象?
我們可以通過實現 Spring 感知接口來完成。完整的列表可以在 這裏找到。
我們也可以使用 @Autowired 註解在這些 Bean 上:
@Autowired
ServletContext servletContext;
@Autowired
ServletConfig servletConfig;Q20. Spring MVC 中的控制器是什麼?
簡單來説,所有由 DispatcherServlet 處理的請求都將被路由到帶有 @Controller 註解的類。每個控制器類都將一個或多個請求映射到方法,這些方法處理並執行請求,並使用提供的輸入參數。
為了更好地理解,我們建議您回顧一下典型的 Spring MVC 架構中 Front Controller 的概念。
Q21. <em @RequestMapping</em>> 註解的工作原理是什麼?
<em @RequestMapping</em>> 註解用於將 Web 請求映射到 Spring 控制器方法。除了簡單用例外,我們還可以將其用於映射 HTTP 頭部、使用 <em @PathVariable</em>> 將 URI 的一部分綁定,以及處理 URI 參數和 <em @RequestParam</em>> 註解。
關於 <em @RequestMapping</em>> 的更多詳細信息,請參見此處。
要了解更多 Spring MVC 問題,請查看我們關於 Spring MVC 面試問題文章。
4. Spring Data Access
Q22. Spring JdbcTemplate 類是什麼以及如何使用它?
Spring JDBC 模板是訪問我們感興趣的數據庫操作邏輯的主要 API:
- 創建和關閉連接
- 執行語句和存儲過程調用
- 迭代 ResultSet 並返回結果
為了使用它,我們需要定義簡單的 DataSource 配置:
@Configuration
@ComponentScan("org.baeldung.jdbc")
public class SpringJdbcConfig {
@Bean
public DataSource mysqlDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
dataSource.setUsername("guest_user");
dataSource.setPassword("guest_password");
return dataSource;
}
}欲瞭解更多解釋,請查看這篇簡短的文章。
Q23. 如何啓用 Spring 中的事務及其優勢?
有兩類不同的配置 Transactions 的方式:使用註解或使用面向切面編程 (AOP),每種方式都有其優勢。
根據 官方文檔,使用 Spring Transactions 的優勢如下:
- 提供一致的編程模型,適用於不同的事務 API,例如 JTA、JDBC、Hibernate、JPA 和 JDO
- 支持聲明式事務管理
- 比一些複雜的事務 API(例如 JTA)提供更簡單的程序事務管理 API
- 與 Spring 的各種數據訪問抽象集成良好
Q24. Spring DAO 是什麼?
Spring 數據訪問對象 (DAO) 是 Spring 提供的,用於與 JDBC、Hibernate 和 JPA 等數據訪問技術以一致且易於的方式進行交互的支持。
有一整套系列內容討論了 Spring 中的持久化,它提供了一個更深入的瞭解。
5. 基於面向切面的 Spring 編程
Q25. 什麼是面向切面編程 (AOP)?
面向切面 允許通過在現有代碼中添加額外行為,而無需修改受影響的類,從而實現對橫切關注點(如事務管理)的模塊化。這些橫切關注點跨越多個類型和對象。
以下是基於面向切面的執行時間日誌示例。
Q26. 什麼是 AOP 中的 Aspect、Advice、Pointcut 和 JoinPoint?
- Aspect – 一個實現橫切關注點的類,例如事務管理。
- Advice – 指的是在特定 JoinPoint 及其匹配的 Pointcut 被應用程序訪問時執行的方法。
- Pointcut – 是一組正則表達式,用於與 JoinPoint 進行匹配,以確定是否需要執行 Advice。
- JoinPoint – 指程序執行期間的一個點,例如方法的執行或異常的處理。
Q27. 什麼是織入 (Weaving)?
根據 官方文檔,織入 (Weaving) 是一個將切面 (Aspects) 與其他應用程序類型或對象連接起來以創建被建議對象 (Advised Object) 的過程。 這可以在編譯時、加載時或運行時完成。 Spring AOP,就像其他純 Java AOP 框架一樣,在運行時執行 織入 (Weaving)。
6. Spring 5
Spring Framework 5 是 Spring 框架的重大升級,帶來了許多改進和新特性。以下是一些關鍵的變化:
- Java 8 支持: Spring 5 完全支持 Java 8,包括 Lambda 表達式、Stream API 和 Optional 類等。
- 基於 Reactor 的支持: Spring 5 引入了對 Reactor 的原生支持,這使得構建響應式應用程序更加容易。
- HTTP/2 支持: Spring 5 增加了對 HTTP/2 的支持,可以提高 Web 應用程序的性能。
- 改進的測試支持: Spring 5 提供了更好的測試支持,包括對 JUnit 5 和 Mockito 5 的集成。
- 新的模塊: Spring 5 引入了新的模塊,例如
spring-context-core和spring-context-indexer。
// This code demonstrates the use of Lambda expressions.
// Lambda expressions provide a concise way to implement functional interfaces.
public class LambdaExample {
public static void main(String[] args) {
// Example Lambda expression
Integer sum = (a, b) -> a + b;
System.out.println("Sum: " + sum(5, 3));
}
}
Q28. 什麼是響應式編程?
響應式編程是一種非阻塞、事件驅動的應用,能夠利用少量線程進行擴展,背壓是關鍵組成部分,旨在確保生產者不會淹沒消費者。
這些是響應式編程的主要優勢:
- 充分利用多核和多 CPU 硬件上的計算資源
- 通過減少序列化來提高性能
響應式編程通常是事件驅動的,與響應式系統不同,後者是消息驅動的。因此,使用響應式編程並不意味着我們正在構建一個響應式系統,後者是一種架構風格。
然而,響應式編程可以用作實現響應式系統的手段,如果遵循 響應式宣言,而響應式宣言對於理解至關重要。
基於此,響應式系統具有四個重要的特性:
- 響應性 – 系統應及時響應。
- 彈性 – 在系統遇到故障時,它應保持響應性。
- 彈性 – 響應式系統能夠響應變化並保持在不同工作負載下的響應性。
- 消息驅動 – 響應式系統需要通過異步消息傳遞來建立組件之間的邊界。
Q29. Spring WebFlux 是什麼?
Spring WebFlux 是 Spring 的響應式 Web 框架,它是 Spring MVC 的一種替代方案。
為了實現這種響應式模型並具有高度可擴展性,整個棧是非阻塞的。 查閲我們的 Spring 5 WebFlux 教程以獲取更多詳細信息。
Q30. 什麼是 Mono 和 Flux 類型?
Spring Framework 5 中的 WebFlux 框架使用 Reactor 作為其異步基礎。
該項目提供了兩個核心類型:Mono 用於表示單個異步值,Flux 用於表示異步值的流。它們都實現了 Publisher 接口,該接口由 Reactive Streams 規範定義。
Mono 實現 Publisher 接口,並返回 0 到 1 個元素。
public abstract class Mono<T> implements Publisher<T> {...}並且實現了Publisher並返回個元素:
public abstract class Flux<T> implements Publisher<T> {...}根據定義,這兩種類型代表流,因此它們都是惰性的。這意味着在通過 subscribe()方法消費流時,沒有任何操作會被執行。這兩種類型也是不可變的,因此調用任何方法都會返回一個新的 Flux 或 Mono 實例。
Q31. WebClient 和 WebTestClient 的用途是什麼?
<em>WebClient</em> 是 Web Reactive 新框架中的一個組件,可以作為反應式客户端,用於執行非阻塞 HTTP 請求。由於它是反應式客户端,因此可以處理反應式流和回壓,並且可以充分利用 Java 8 람다表達式。它還可以處理同步和異步場景。
另一方面,<em>WebTestClient</em> 是一種類似類,我們可以用於測試。它本質上是 <em>WebClient</em> 的一個薄殼,可以連接到任何服務器,通過 HTTP 連接。它還可以通過模擬請求和響應對象直接綁定到 WebFlux 應用程序,而無需 HTTP 服務器。
Q32. 使用反應式流的缺點是什麼?
以下是使用反應式流的一些主要缺點:
- 調試反應式應用程序比較困難,請查看我們的關於調試反應式流的教程,以獲取一些有用的調試技巧。
- 由於傳統的關係型數據存儲尚未採用反應式範式,因此對反應式數據存儲的支持有限。
- 實施時存在額外的學習曲線。
Q33. Spring 5 與舊版 Java 版本是否兼容?
為了充分利用 Java 8 的特性,Spring 代碼庫已被徹底重構。這意味着舊版本的 Java 無法使用。因此,框架需要 Java 8 或更高版本。
Q34. Spring 5 如何與 JDK 9 模塊化集成?
在 Spring 5 中,一切都已模塊化。 這樣,我們就不會被迫導入可能沒有我們需要的功能的 JAR 包。
請參考我們的 Java 9 模塊化指南 以深入瞭解這項技術的原理。
讓我們來看一個例子,以瞭解 Java 9 中新的模塊功能以及如何基於此概念組織一個 Spring 5 項目。
我們首先創建一個新的類,其中包含一個方法,返回一個 <mark>String</mark> 值“HelloWorld”。 我們將此內容放在一個新的 Java 項目中——HelloWorldModule。
package com.hello;
public class HelloWorld {
public String sayHello(){
return "HelloWorld";
}
}然後我們創建一個新的模塊:
module com.hello {
export com.hello;
}現在,讓我們創建一個新的 Java 項目,名為 HelloWorldClient,通過定義模塊來消費上述模塊:
module com.hello.client {
requires com.hello;
}該模塊現在已準備好進行測試:
public class HelloWorldClient {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
log.info(helloWorld.sayHello());
}
}Q35. 我們可以同時在同一個應用程序中使用 Web MVC 和 WebFlux 嗎?
目前,Spring Boot 只允許使用 Spring MVC 或 Spring WebFlux 中的一個,因為 Spring Boot 會根據 classpath 中存在的依賴項自動配置上下文。
此外,Spring MVC 不能在 Netty 上運行。 MVC 是一種阻塞式範式,而 WebFlux 是一種非阻塞式風格。 因此,我們不應該將兩者混合使用,因為它們具有不同的用途。
7. 結論
在本文中,我們探討了所有關於 Spring 的技術面試中最重要的幾個問題。
我們希望這篇文章能幫助您在未來的 Spring 面試中取得成功。祝您好運!