I have posted a lot of Spring Tutorials recently. This post will help you get through Spring interview Questions explaining the core concepts in detail.
Spring Framework 是最受歡迎的 Java EE 框架之一,用於網絡應用程序。 依賴注入 和面向方面的編程是 Spring 框架的核心。如果你擅長 Spring 框架,那麼在 Java 面試中被選中的機會就會非常高。
專業提示: 核心 Java 是任何基於 Java 的框架的基礎,所以如果你正在為面試做準備,請通過閱讀 核心 Java 面試問題 和 Java 面試問題 文章。
Spring 面試問題與答案
在這裡,我提供了近50個Spring面試問題及其答案。它更新至Spring 5,因此包含了所有最新功能,如 Spring WebFlux 用於反應式編程。
1. 什麼是Spring Framework?
Spring是最廣泛使用的Java EE框架之一。Spring框架的核心概念是“依賴注入”和“面向方面的編程”。
Spring框架也可用於普通的Java應用程序中,通過實現依賴注入來實現不同組件之間的鬆耦合。我們可以使用Spring對面向方面的編程的支持來執行橫切任務,如日誌記錄和身份驗證。
I like spring because it provides a lot of features and different modules for specific tasks such as Spring MVC and Spring JDBC. Since it’s an open-source framework with a lot of online resources and active community members, working with the Spring framework is easy and fun at the same time.
推薦閱讀:Spring Framework
2. Spring Framework的一些重要功能是什麼?
Spring框架建立在兩個設計概念之上 – 依賴注入和面向方面的編程。
Spring框架的一些特點包括:
- 輕量級且使用框架的開發開銷很少。
- 依賴注入或控制反轉,可以編寫彼此獨立的組件,Spring容器負責將它們連接在一起以實現我們的工作。
- Spring IoC容器管理Spring Bean的生命周期和项目特定的配置,例如JNDI查找。
- Spring MVC框架可用于创建Web应用程序和能够返回XML和JSON响应的RESTful Web服务。
- 通过使用注解或Spring Bean配置文件,可以对事务管理、JDBC操作、文件上传、异常处理等提供支持,配置非常简单。
3. 使用Spring框架的优势是什么?
使用Spring框架的一些优势包括:
- 减少应用程序不同组件之间的直接依赖关系。Spring IoC容器负责初始化资源或Bean,并将它们注入为依赖项。
- 在Spring框架中编写单元测试案例很容易,因为我们的业务逻辑与实际资源实现类没有直接依赖关系。我们可以轻松编写测试配置并注入我们的模拟Bean进行测试。
- 减少样板代码的数量,例如初始化对象、打开/关闭资源。我非常喜欢JdbcTemplate类,因为它帮助我们消除了与JDBC编程相关的所有样板代码。
- Spring框架分為多個模組,幫助我們保持應用程序的輕量級。例如,如果我們不需要Spring事務管理功能,就不需要將該依賴添加到項目中。
- Spring框架支持大多數Java EE功能,甚至更多。它始終處於新技術的領先地位,例如,有一個用於Android的Spring項目,幫助我們為本機Android應用程序編寫更好的代碼。這使得Spring框架成為一個完整的包,我們不需要為不同的需求尋找不同的框架。
4. Spring 5的重要特點有哪些?
Spring 5是從Spring 4進行的重大改版。一些重要特點包括:
- 支持Java 8及更高版本,因此我們可以使用Lambda表達式。
- 支持Java EE7和Servlet 4.0規範。
- 文件操作現在通過NIO 2流執行,如果你的應用程序需要處理大量文件,這是一個巨大的改進。
- 引入spring-jcl來整理日誌記錄,之前由於沒有單一點進行日誌記錄而一團糟。
- 支持Kotlin,Lombok,Reactor 3.1 Flux和Mono以及RxJava。
- Spring WebFlux將反應式編程引入Spring中。
- 支持JUnit 5
- 支持通過索引文件“META-INF/spring.components”提供Spring組件信息,而不是透過類路徑掃描。
請閱讀Spring 5功能以獲得有關此版本的詳細概述。
5. 什麼是Spring WebFlux?
Spring WebFlux是Spring 5中引入的新模塊。Spring WebFlux是遷移到Spring框架中的反應式編程模型的第一步。
Spring WebFlux是Spring MVC模塊的替代方案。Spring WebFlux用於創建完全異步和非阻塞的應用程序,基於事件循環執行模型構建。
您可以在Spring WebFlux教程中了解更多信息。
6. 什麼是依賴注入?
依賴注入設計模式允許我們刪除硬編碼的依賴項,使我們的應用程序具有鬆散耦合性、可擴展性和可維護性。我們可以實現依賴注入模式,將依賴解析從編譯時移至運行時。
使用依賴注入的一些好處包括關注點分離、減少樣板代碼、可配置的組件和方便的單元測試。
更多資訊請參考依賴注入教程。我們還可以使用Google Guice進行依賴注入來自動化依賴注入的過程。但在大多數情況下,我們尋求的不僅僅是依賴注入,這就是Spring佔據領先地位的原因。
7. 如何在Spring Framework中實現DI?
我們可以使用基於Spring XML和基於註釋的配置來實現Spring應用程序中的DI。為了更好地理解,請閱讀Spring依賴注入示例,其中您可以學習這兩種方式並使用JUnit測試案例。該文章還包含了一個示例項目的壓縮文件,您可以下載並進行更多的實驗學習。
8. 使用Spring Tool Suite的好處是什麼?
我們可以將插件安裝到Eclipse中,以獲得Spring Tool Suite的所有功能。然而,STS與Eclipse捆綁,並帶有一些其他重要的功能,如Maven支持、用於創建不同類型的Spring項目的模板,以及用於Spring應用程序的更好性能的tc server。
I like STS because it highlights the Spring components and if you are using AOP pointcuts and advice, then it clearly shows which methods will come under the specific pointcut. So rather than installing everything on our own, I prefer using STS when developing Spring-based applications.
9. 命名一些重要的Spring模組?
一些重要的Spring Framework模組包括:
- Spring Context – 用於依賴注入。
- Spring AOP – 用於面向切面編程。
- Spring DAO – 使用DAO模式進行數據庫操作。
- Spring JDBC – 用於JDBC和數據源支持。
- Spring ORM – 用於ORM工具支持,如Hibernate。
- Spring Web模組 – 用於創建Web應用程序。
- Spring MVC – 用於創建Web應用程序、Web服務等的模型-視圖-控制器實現。
10. 什麼是面向方面的編程?
企業應用程序有一些常見的橫切關注點,可應用於不同類型的對象和應用程序模塊,例如日誌記錄、交易管理、數據驗證、身份驗證等。通過面向對象編程中的類實現應用程序的模塊化。在AOP中,應用程序的模塊化是通過切面實現的,並且它們被配置為橫跨不同的類方法。
AOP消除了橫切任務對於在普通面向對象編程中不可能的類的直接依賴性。例如,我們可以為日誌記錄有一個單獨的類,但其他類必須調用這些方法。但是,在AOP中,我們配置方面,方法執行會自動發生。閱讀有關Spring AOP支持的更多信息,請參閱Spring AOP示例。
11. 什麼是AOP中的Aspect、Advice、Pointcut、JointPoint和Advice Arguments?
層面: 層面是實現橫切關注點(例如事務管理)的類別。層面可以是一個正常的類別,通過在Spring Bean配置文件中進行配置,然後配置;或者我們可以使用Spring AspectJ支持,使用@Aspect
注釋將類別聲明為層面。
建議: 建議是針對特定連接點採取的操作。在編程方面,它們是在應用程序中達到具有匹配切入點的特定連接點時執行的方法。您可以將建議視為Spring攔截器或Servlet過濾器。
切入點: 切入點是與連接點匹配的正則表達式,用於確定是否需要執行建議。切入點使用不同種類的表達式與連接點匹配。Spring框架使用AspectJ切入點表達式語言來確定將應用建議方法的連接點。
連接點: 連接點是應用程序中的特定點,例如方法執行、異常處理、更改對象變量值等。在Spring AOP中,連接點始終是方法的執行。
建議引數: 我們可以在建議方法中傳遞引數。我們可以在切入點中使用args()表達式,應用於與引數模式匹配的任何方法。如果我們使用這個,那麼我們需要在建議方法中使用相同的名稱,從中確定引數類型。
這些概念一開始似乎令人困惑,但如果你通過Spring Aspect, Advice Example閱讀,你就能夠很容易地理解它們。
12. Spring AOP 和 AspectJ AOP 之間的區別是什麼?
AspectJ是面向切面編程的行業標準實現,而Spring則為某些情況實現了AOP。Spring AOP 和 AspectJ 之間的主要區別是:
- Spring AOP 比 AspectJ 更容易使用,因為我們不需要擔心編織過程。
- Spring AOP 支持 AspectJ 注解,因此如果您熟悉 AspectJ,那麼使用 Spring AOP 將更容易。
- Spring AOP 只支持基於代理的 AOP,因此它只能應用於方法執行連接點。AspectJ 支持所有類型的切入點。
- Spring AOP 的一個缺點是它只能應用於通過 Spring Context 創建的 bean。
13. 什麼是Spring IoC容器?
控制反轉(IoC)是實現對象之間鬆散耦合的機制。為了實現對象在運行時的鬆散耦合和動態綁定,這些對象定義它們的依賴關係,由其他裝配器對象注入。Spring IoC容器是一個程序,它將依賴關係注入對象並使其為我們使用準備好。
Spring框架IoC容器類別包含在org.springframework.beans
和org.springframework.context
包中,為我們提供了不同的方式來解耦對象的依賴關係。
我們使用的一些有用的ApplicationContext實現包括;
- AnnotationConfigApplicationContext:用於使用基於註解的配置的獨立Java應用程序。
- ClassPathXmlApplicationContext:用於使用基於XML的配置的獨立Java應用程序。
- FileSystemXmlApplicationContext:類似於ClassPathXmlApplicationContext,只是XML配置文件可以從文件系統的任何位置加載。
- AnnotationConfigWebApplicationContext和XmlWebApplicationContext用於Web應用程序。
14. 什麼是 Spring Bean?
由 Spring IoC 容器初始化的任何普通 Java 類都被稱為 Spring Bean。我們使用 Spring ApplicationContext
來獲取 Spring Bean 實例。
Spring IoC 容器管理 Spring Bean 的生命週期、bean 範圍,並注入 bean 中所需的任何依賴項。
15. Spring bean 配置文件的重要性是什麼?
我們使用 Spring Bean 配置文件來定義所有將由 Spring 上下文初始化的 bean。當我們創建 Spring ApplicationContext 的實例時,它會讀取 spring bean XML 文件並初始化所有這些 bean。一旦上下文初始化完成,我們就可以使用它來獲取不同的 bean 實例。
除了 Spring Bean 配置之外,此文件還包含 spring MVC 拦截器、視圖解析器和其他元素,以支持基於注解的配置。
16. 有哪些不同的方式可以配置一个类作为 Spring Bean?
有三种不同的方式来配置 Spring Bean。
XML 配置:这是最流行的配置方式,我们可以在上下文文件中使用 bean 元素来配置 Spring Bean。例如:
<bean name="myBean" class="com.journaldev.spring.beans.MyBean"></bean>
基于 Java 的配置:如果只使用注解,可以使用 @Bean
注解配置 Spring Bean。该注解与 @Configuration
类一起使用,用于配置 Spring Bean。示例配置如下:
@Configuration
@ComponentScan(value="com.journaldev.spring.main")
public class MyConfiguration {
@Bean
public MyService getService(){
return new MyService();
}
}
要从 Spring 上下文获取此 Bean,我们需要使用以下代码片段:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
基于注解的配置:我们还可以使用 @Component、@Service、@Repository 和 @Controller 注解配置这些类作为 Spring Bean。对于这些注解,我们需要提供要扫描的基本包位置。例如:
<context:component-scan base-package="com.journaldev.spring" />
17. Spring Bean 有哪些不同的作用域?
Spring Bean 定義了五種作用域。
- singleton: 每個容器只會創建一個 bean 實例。這是 Spring Bean 的默認作用域。在使用此作用域時,請確保 Spring Bean 沒有共享的實例變量,否則可能會導致數據一致性問題,因為它不是線程安全的。
- prototype: 每次請求時都會創建一個新的實例。
- request: 與 prototype 作用域相同,但是專用於 Web 應用程序。每個 HTTP 請求都會為 bean 創建一個新的實例。
- session: 容器將為每個 HTTP 會話創建一個新的 bean。
- global-session: 用於為 Portlet 應用程序創建全局會話 bean。
Spring Framework 是可擴展的,我們也可以創建自己的作用域。但是大多數情況下,我們使用框架提供的作用域就足夠了。要設置 Spring Bean 的作用域,可以在 bean 元素中使用 “scope” 屬性或使用 @Scope 注解進行註解配置。
18. Spring Bean 的生命周期是什麼?
Spring Beans 由 Spring 容器初始化,並注入所有相依性。當上下文被摧毀時,它也會摧毀所有已初始化的 beans。這在大多數情況下都運作良好,但有時我們想在將我們的 beans 準備好使用之前初始化其他資源或進行一些驗證。Spring 框架支持在 spring beans 中提供 post-initialization 和 pre-destroy 方法。
我們可以通過兩種方式實現這一點 – 通過實現 InitializingBean
和 DisposableBean
接口,或在 spring bean 配置中使用 init-method 和 destroy-method 屬性。有關詳細信息,請參閱 Spring Bean 生命周期方法。
19. 如何在 Spring Bean 中獲取 ServletContext 和 ServletConfig 對象?
在 spring bean 中獲取容器特定對象有兩種方法。
- 實現Spring *Aware介面,對於這些ServletContextAware和ServletConfigAware介面,有關這些aware介面的完整示例,請閱讀Spring Aware介面。
- 使用
@Autowired
註釋與類型為ServletContext
和ServletConfig
的bean變量。它們僅在特定於Servlet容器的環境中才能工作。
@Autowired
ServletContext servletContext;
20. 什麼是Bean wiring和@Autowired註釋?
在初始化時注入Spring Bean依賴關係的過程稱為Spring Bean Wiring。
通常,最佳實踐是對所有bean依賴項進行明確的連線,但Spring框架也支持自動連線。我們可以使用@Autowired
註釋與字段或方法進行按類型自動連線。為了使此註釋起作用,我們還需要在Spring bean配置文件中啟用基於註釋的配置。這可以通過context:annotation-config元素完成。
有關@Autowired
註釋的更多詳細信息,請閱讀Spring Autowire示例。
21. 不同種類的 Spring Bean 自動連線有哪些?
Spring 框架中有四種自動連線的類型。
- 按名稱自動連線
- 按類型自動連線
- 按構造函數自動連線
- 使用@Autowired和@Qualifier註釋進行自動連線
在 Spring 3.1 之前,還支持autowire by autodetect,類似於按構造函數或按類型自動連線。有關這些選項的詳細信息,請閱讀Spring Bean Autowiring。
22. Spring Bean 是否提供線程安全性?
Spring Bean 的默認作用域是單例,因此每個上下文只有一個實例。這意味著任何線程都可以更新的類級變量將導致不一致的數據。因此,在默認模式下,Spring Beans 不是線程安全的。
然而,我們可以將Spring Bean的作用域更改為request、prototype或session以實現線程安全,但代價是性能。這是一個設計決策,基於項目的需求。
23. Spring MVC中的控制器是什麼?
就像MVC設計模式一樣,控制器是負責處理所有客戶端請求並將它們發送到配置的資源以處理它們的類。在Spring MVC中,DispatcherServlet是初始化上下文的前端控制器類,其基於Spring Bean配置。
A Controller class is responsible to handle a different kind of client requests based on the request mappings. We can create a controller class by using @Controller annotation. Usually, it’s used with @RequestMapping annotation to define handler methods for specific URI mapping.
24. Spring中 @Component、@Controller、@Repository 和 @Service 注釋之間的區別是什麼?
@Component 用於表示一個類別是一個元件。這些類別用於自動檢測並在使用基於注釋的配置時配置為一個 bean。
@Controller 是一種特定類型的元件,在 MVC 應用程序中使用,並且通常與 RequestMapping 注釋一起使用。
@Repository 注釋用於指示一個元件被用作存儲/檢索/搜索數據的存儲庫和機制。我們可以將此注釋應用於 DAO 模式實現類。
@Service 用於表示一個類別是一個服務。通常,提供一些服務的業務外觀類別會用這個注釋進行標註。
我們可以對一個類別使用上述任何一個注釋進行自動檢測,但提供不同類型是為了讓您能夠輕鬆地區分被標註類別的目的。
25. DispatcherServlet 和 ContextLoaderListener 是什麼?
DispatcherServlet 是 Spring MVC 應用程序中的前端控制器,它加載 Spring Bean 配置文件並初始化所有配置的 Bean。如果啟用了註釋,它還會掃描包並配置任何使用 @Component、@Controller、@Repository 或 @Service 註釋的 Bean。
ContextLoaderListener 是啟動和關閉 Spring 根 WebApplicationContext 的監聽器。它的重要功能是將 ApplicationContext 的生命周期與 ServletContext 的生命周期綁定在一起,並自動創建 ApplicationContext。我們可以使用它來定義可以在不同的 Spring 上下文中共享的 Bean。
26. Spring 中的 ViewResolver 是什麼?
ViewResolver 實現用於按名稱解析視圖頁面。我們在 Spring Bean 配置文件中進行配置。例如:
<!-- 將 @Controllers 選擇的視圖解析為 /WEB-INF/views 目錄中的 .jsp 資源 -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
InternalResourceViewResolver是ViewResolver接口的一种实现,我们通过bean属性提供视图页面目录和后缀位置。因此,如果控制器处理程序方法返回“home”,视图解析器将使用位于/WEB-INF/views/home.jsp的视图页面。
27. 什么是MultipartResolver及其使用场景?
MultipartResolver接口用于上传文件 – CommonsMultipartResolver和StandardServletMultipartResolver是Spring框架提供的两个用于文件上传的实现。默认情况下,没有配置多部分解析器,但要使用它们进行文件上传,我们只需在Spring bean配置中定义一个名为“multipartResolver”且类型为MultipartResolver的bean。
一旦配置完成,任何多部分请求都将由配置的MultipartResolver解析并传递给包装的HttpServletRequest。然后在控制器类中使用它来获取文件并处理。有关完整示例,请阅读Spring MVC文件上传示例。
28. 如何在Spring MVC框架中處理異常?
Spring MVC框架提供以下幾種方法來幫助我們實現健壯的異常處理。
基於控制器 – 我們可以在控制器類中定義異常處理方法。我們只需要為這些方法添加@ExceptionHandler註釋即可。
全局異常處理器 – 異常處理是一個橫切關注點,Spring提供了@ControllerAdvice註釋,我們可以與任何類一起使用,以定義我們的全局異常處理器。
HandlerExceptionResolver實現 – 對於通用的異常,我們大多數時候提供靜態頁面。Spring框架提供了一個HandlerExceptionResolver接口,我們可以實現它來創建全局異常處理器。定義全局異常處理器的這種額外方式是因為Spring框架還提供了默認的實現類,我們可以在spring bean配置文件中定義,以獲得Spring框架的異常處理好處。
請參閱Spring 异常处理示例的完整示例。
29. 如何在 Java 程式中建立 ApplicationContext?
有以下幾種方式可以在獨立的 Java 程式中建立 spring 上下文。
- AnnotationConfigApplicationContext:如果我們在獨立的 Java 應用程序中使用 Spring 並使用注解進行配置,那麼我們可以使用這個來初始化容器並獲取 bean 對象。
- ClassPathXmlApplicationContext:如果我們在獨立應用程式中有一個 spring bean 配置 XML 文件,那麼我們可以使用這個類來加載文件並獲取容器對象。
- FileSystemXmlApplicationContext:這與 ClassPathXmlApplicationContext 類似,只是 XML 配置文件可以從文件系統中的任何位置加載。
30. 我們可以有多個 Spring 配置文件嗎?
對於 Spring MVC 應用程式,我們可以通過 contextConfigLocation 定義多個 spring 上下文配置文件。該位置字符串可以由多個位置組成,用任意數量的逗號和空格分隔。例如;
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml,/WEB-INF/spring/appServlet/servlet-jdbc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
我們還可以通過 context-param 定義多個根級 spring 配置並通過其加載。例如;
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml /WEB-INF/spring/root-security.xml</param-value>
</context-param>
另一個選擇是在上下文配置文件中使用 import 元素來導入其他配置,例如:
<beans:import resource="spring-jdbc.xml"/>
31. ContextLoaderListener 是什麼?
ContextLoaderListener 是用於加載根上下文並定義將對所有其他上下文可見的 spring bean 配置的監聽器類。它在 web.xml 文件中配置如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
32. 創建 Spring MVC 應用程式所需的最小配置是什麼?
要創建一個簡單的 Spring MVC 應用程式,我們需要執行以下任務。
- 在項目中添加 spring-context 和 spring-webmvc 依賴項。
- 設定
DispatcherServlet
在 web.xml 檔案中,以透過 Spring 容器處理請求。 - Spring bean 配置檔用於定義 beans,如果使用註釋,則必須在這裡進行配置。同時,我們需要為視圖頁面配置視圖解析器。
- Controller 類別中定義了處理客戶端請求的請求映射。
以上步驟應該足夠創建一個簡單的 Spring MVC Hello World 應用程式。
33. 如何將 Spring MVC 框架與 MVC 架構聯繫起來?
正如其名,Spring MVC 是建立在模型-視圖-控制器架構之上。DispatcherServlet
是 Spring MVC 應用程式中的前端控制器,負責處理所有傳入的請求並將它們委派給不同的控制器處理方法。
模型可以是 Spring 框架中的任何 Java Bean,就像任何其他 MVC 框架一樣,Spring 提供對表單數據自動綁定到 Java Beans 的支援。我們可以將模型 Beans 設置為在視圖頁面中使用的屬性。
視圖頁面可以是 JSP、靜態 HTML 等,而視圖解析器負責查找正確的視圖頁面。一旦識別出視圖頁面,控制權就會返回到 DispatcherServlet 控制器。DispatcherServlet負責呈現視圖並將最終響應返回給客戶端。
34. 如何在Spring MVC应用程序中实现本地化?
Spring通过资源包(resource bundles)为本地化(i18n)提供了出色的支持。使应用程序本地化所需的基本步骤包括:
- 为不同的区域创建消息资源包,例如 messages_en.properties、messages_fr.properties 等。
- 在Spring bean配置文件中定义类型为 ResourceBundleMessageSource 或 ReloadableResourceBundleMessageSource 的 messageSource bean。
- 为了支持区域更改,定义类型为 CookieLocaleResolver 的 localeResolver bean,并配置 LocaleChangeInterceptor 拦截器。以下是一个示例配置:
<beans:bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:messages" />
<beans:property name="defaultEncoding" value="UTF-8" />
</beans:bean>
<beans:bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<beans:property name="defaultLocale" value="en" />
<beans:property name="cookieName" value="myAppLocaleCookie"></beans:property>
<beans:property name="cookieMaxAge" value="3600"></beans:property>
</beans:bean>
<interceptors>
<beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="locale" />
</beans:bean>
</interceptors>
- 在视图页面中使用
spring:message
元素,使用键名,DispatcherServlet 会选择相应的值,以相应的区域渲染页面并作为响应返回。
有关完整示例,请阅读 Spring本地化示例。
35. 我們如何使用 Spring 創建返回 JSON 響應的 Restful Web 服務?
我們可以使用 Spring 框架來創建返回 JSON 數據的 Restful Web 服務。Spring 提供了與 Jackson JSON API 的集成,我們可以用它來發送 Restful Web 服務中的 JSON 響應。
我們需要按照以下步驟配置我們的 Spring MVC 應用程序以發送 JSON 響應。
1. 添加 Jackson JSON 依賴,如果你使用 Maven,可以使用以下代碼完成:
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind-version}</version>
</dependency>
2. 在 Spring Bean 配置文件中配置 RequestMappingHandlerAdapter bean,並將 message converters 屬性設置為 MappingJackson2HttpMessageConverter bean。示例配置如下:
<!-- 配置在方法處理程序中插入 JSON 作為請求和響應 -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter"/>
</beans:list>
</beans:property>
</beans:bean>
<!-- 配置將 JSON 轉換為 POJO 及反之的 bean -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>
3. 在控制器處理方法中,使用 @ResponseBody
注解將對象作為響應返回。示例代碼:
@RequestMapping(value = EmpRestURIConstants.GET_EMP, method = RequestMethod.GET)
public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) {
logger.info("Start getEmployee. ID="+empId);
return empData.get(empId);
}
4. 你可以通過任何 API 調用 Rest 服務,但如果你想使用 Spring,則可以輕鬆使用 RestTemplate 類。
對於一個完整的示例,請閱讀Spring Restful Webservice Example。
36. 你使用過哪些重要的Spring註釋?
我在我的項目中使用的一些Spring註釋包括:
- @Controller – 用於Spring MVC項目中的控制器類。
- @RequestMapping – 用於配置控制器處理程序方法中的URI映射。這是一個非常重要的註釋,所以你應該閱讀Spring MVC RequestMapping Annotation Examples
- @ResponseBody – 用於將對象作為響應發送,通常用於將XML或JSON數據作為響應發送。
- @PathVariable – 用於將URI中的動態值映射到處理程序方法參數。
- @Autowired – 用於自動連接 Spring Beans 中的依賴項。
- @Qualifier – 與@Autowired 注釋一起使用,以避免當存在多個 bean 類型的情況下混淆。
- @Service – 用於服務類。
- @Scope – 用於配置 Spring Bean 的作用域。
- @Configuration、@ComponentScan 和 @Bean – 用於基於 Java 的配置。
- 用於配置方面和建議的 AspectJ 注釋,@Aspect、@Before、@After、@Around、@Pointcut 等。
37. 我們可以將對象作為Controller處理程序方法的響應嗎?
是的,我們可以使用@ResponseBody註釋。這是我們在restful Web服務中發送基於JSON或XML的響應的方法。
38. 如何在Spring MVC應用程序中上傳文件?
Spring提供了通過MultipartResolver接口實現的內置支持來上傳文件。使用起來非常簡單,只需進行配置更改即可使其運作。我們需要編寫控制器處理程序方法來處理傳入的文件並對其進行處理。有關完整示例,請參見Spring文件上傳示例。
39. 如何在Spring Web MVC框架中验证表单数据?
Spring支持基于JSR-303注解的验证,同时提供了一个Validator接口,我们可以实现它来创建自定义验证器。对于使用JSR-303基础验证,我们需要用必要的验证注解对bean变量进行注释。
对于自定义验证器的实现,我们需要在控制器类中进行配置。有关完整示例,请阅读Spring MVC表单验证示例。
40. 什么是Spring MVC拦截器,如何使用它?
Spring MVC拦截器类似于Servlet Filters,允许我们拦截客户端请求并进行处理。我们可以在三个地方拦截客户端请求 – preHandle、postHandle和afterCompletion。
我们可以通过实现HandlerInterceptor接口或扩展HandlerInterceptorAdapter抽象类来创建Spring拦截器。
我們需要在 spring bean 配置文件中配置攔截器。 我們可以定義一個攔截器來攔截所有客戶端請求,或者我們也可以為特定的 URI 映射配置它。 有關詳細示例,請參閱Spring MVC Interceptor Example。
41. Spring JdbcTemplate 類是什麼,如何使用它?
Spring 框架與 JDBC API 有很好的集成,並提供了 JdbcTemplate 實用程序類,我們可以使用它來避免我們的數據庫操作邏輯中的樣板代碼,如打開/關閉連接,ResultSet,PreparedStatement 等。
有關 JdbcTemplate 的示例,請參閱Spring JDBC Example。
42. 如何在 Spring Web 應用程序中使用 Tomcat JNDI DataSource?
對於使用servlet容器配置的JNDI數據源,我們需要在Spring bean配置文件中進行配置,然後將其注入為Spring bean的依賴項。然後,我們可以使用JdbcTemplate
來執行數據庫操作。
<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>
有關完整示例,請參見Spring Tomcat JNDI Example。
43. 如何在Spring中實現事務管理?
Spring框架通過聲明式事務管理和編程式事務管理提供事務管理支持。聲明式事務管理是最廣泛使用的,因為它易於使用並且在大多數情況下都能正常工作。
我們使用@Transactional
註釋來進行聲明式事務管理的方法。我們需要在Spring bean配置文件中為數據源配置事務管理器。
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
44. 什麼是Spring DAO?
Spring DAO支援與JDBC、Hibernate等數據訪問技術的一致且簡單的工作方式。例如,我們有JdbcDaoSupport、HibernateDaoSupport、JdoDaoSupport和JpaDaoSupport分別對應不同的技術。
Spring DAO還提供了一致的異常層次結構,我們不需要捕獲特定的異常。
45. 如何集成Spring和Hibernate框架?
如果您使用Hibernate 3+,可以使用Spring ORM模塊來集成Spring和Hibernate框架,其中SessionFactory提供了當前的session,那麼您應該避免使用HibernateTemplate或HibernateDaoSupport類,最好使用帶有依賴注入的DAO模式進行集成。
Spring ORM支持使用Spring聲明式事務管理,因此您應該使用該功能,而不是為事務管理使用Hibernate樣板代碼。
為了更好地理解,您應該閱讀以下教程:
46. 什麼是 Spring Security?
Spring Security 框架專注於在 Java 應用程序中提供身份驗證和授權。它還負責處理大多數常見的安全漏洞,例如 CSRF 攻擊。
在 Web 應用程序中使用 Spring Security 非常有益且易於使用,通過使用注解,如 @EnableWebSecurity
。您應該閱讀以下文章以了解如何使用 Spring Security 框架。
47. 如何將 java.util.Properties 注入到 Spring Bean 中?
我們必須定義 propertyConfigurer bean,它將從給定的屬性文件中加載屬性。然後,我們可以使用 Spring EL 支持將屬性注入到其他 bean 依賴關係中。例如:
<bean id="propertyConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="/WEB-INF/application.properties" />
</bean>
<bean class="com.journaldev.spring.EmployeeDaoImpl">
<property name="maxReadResults" value="${results.read.max}"/>
</bean>
如果您正在使用注解配置Spring Bean,那么您可以像下面这样注入属性。
@Value("${maxReadResults}")
private int maxReadResults;
48. 請列出Spring Framework中使用的一些設計模式。
Spring Framework使用了許多設計模式,其中一些常見的包括:
- 單例模式:使用默認作用域創建Bean。
- 工廠模式:Bean工廠類
- 原型模式:Bean範圍
- 適配器模式:Spring Web和Spring MVC
- 代理模式:Spring面向方面編程支持
- 模板方法模式:JdbcTemplate,HibernateTemplate等
- 前端控制器:Spring MVC DispatcherServlet
- 數據訪問對象: Spring DAO 支援
- 依賴注入和面向切面編程
49. Spring Framework 的一些最佳實踐是什麼?
Spring Framework 的一些最佳實踐包括:
- 避免在模式引用中使用版本號,以確保我們擁有最新的配置。
- 根據其關注點將Spring bean配置分開,例如spring-jdbc.xml,spring-security.xml。
- 對於在Spring MVC中的多個上下文中使用的Spring bean,請在根上下文中創建它們並使用監聽器初始化。
- 盡可能配置bean依賴關係,盡量避免自動連接。
- 對於應用程序級屬性,最佳方法是創建一個屬性文件並在Spring bean配置文件中讀取它。
- 對於較小的應用程序,註釋很有用,但對於較大的應用程序,註釋可能會變得很痛苦。如果我們將所有配置都放在XML文件中,則維護將更容易。
- 使用正確的註釋組件以便易於理解其目的。對於服務使用@Service,對於DAO bean使用@Repository。
- Spring框架有很多模塊,根據需要使用。刪除通常在通過Spring Tool Suite模板創建項目時添加的所有額外依賴項。
- 如果使用Aspects,請確保將聯接點保持盡可能狹窄,以避免對不需要的方法進行建議。考慮使用更容易使用並避免任何問題的自定義註釋。
- 僅在實際受益時使用依賴注入,不要僅僅為了鬆耦合而使用它,因為這樣更難維護。
50. 什麼是Spring Boot?
Spring Boot 使 Spring 框架獨特。它為我們提供了一種簡單的方式來創建不同類型的 Java 應用程序,並將它們附加到 Servlet 容器運行時環境。因此,我們獲得一個單一的 JAR 檔,可以運行以執行該項目。這使我們在非常短的時間內得到了產品部署就緒的骨架項目,從而節省了很多時間。這樣,我們可以更多地專注於業務邏輯,而不是通過構建代碼,然後將其部署在 Servlet 容器上的常見過程。由於這是一個非常廣泛的話題,我建議您閱讀 Spring Boot 面試問題。
這就是關於 Spring 框架面試問題的所有內容。我希望這些問題對您即將到來的 Java EE 面試有所幫助。我將繼續將更多問題添加到列表中,一旦找到它們,我將隨即添加。如果您知道更多應該包含在列表中的問題,請確保對其進行評論,我將包含在內。
Source:
https://www.digitalocean.com/community/tutorials/spring-interview-questions-and-answers