1. 程式人生 > >最全的Spring面試題和答案

最全的Spring面試題和答案

1、什麼是Spring框架?Spring框架有哪些主要模組?

        Spring框架是一個為Java應用程式的開發提供了綜合、廣泛的基礎性支援的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員可以專注於應用程式的開發。Spring框架本身亦是按照設計模式精心打造,這使得我們可以在開發環境中安心的整合Spring框架,不必擔心Spring是如何在後臺進行工作的。

       Spring框架至今已集成了20多個模組。這些模組主要被分如下圖所示的核心容器、資料訪問/整合,、Web、AOP(面向切面程式設計)、工具、訊息和測試模組。

更多資訊:Spring 框架教程。


2、使用Spring框架能帶來哪些好處?

下面列舉了一些使用Spring框架帶來的主要好處:

          Dependency Injection(DI) 方法使得構造器和JavaBean properties檔案中的依賴關係一目瞭然。
          與EJB容器相比較,IoC容器更加趨向於輕量級。這樣一來IoC容器在有限的記憶體和CPU資源的情況下進行應用程式的開發和釋出就變得十分有利。
         Spring並沒有閉門造車,Spring利用了已有的技術比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他檢視技術。
Spring框架是按照模組的形式來組織的。由包和類的編號就可以看出其所屬的模組,開發者僅僅需要選用他們需要的模組即可。
要測試一項用Spring開發的應用程式十分簡單,因為測試相關的環境程式碼都已經囊括在框架中了。更加簡單的是,利用JavaBean形式的POJO類,可以很方便的利用依賴注入來寫入測試資料。
         Spring的Web框架亦是一個精心設計的Web MVC框架,為開發者們在web框架的選擇上提供了一個除了主流框架比如Struts、過度設計的、不流行web框架的以外的有力選項。
Spring提供了一個便捷的事務管理介面,適用於小型的本地事物處理(比如在單DB的環境下)和複雜的共同事物處理(比如利用JTA的複雜DB環境)。

3、什麼是控制反轉(IOC)?什麼是依賴注入?

         控制反轉是應用於軟體工程領域中的,在執行時被裝配器物件來繫結耦合物件的一種程式設計技巧,物件之間耦合關係在編譯時通常是未知的。在傳統的程式設計方式中,業務邏輯的流程是由應用程式中的早已被設定好關聯關係的物件來決定的。在使用控制反轉的情況下,業務邏輯的流程是由物件關係圖來決定的,該物件關係圖由裝配器負責例項化,這種實現方式還可以將物件之間的關聯關係的定義抽象化。而繫結的過程是通過“依賴注入”實現的。

         控制反轉是一種以給予應用程式中目標元件更多控制為目的設計正規化,並在我們的實際工作中起到了有效的作用。

依賴注入是在編譯階段尚未知所需的功能是來自哪個的類的情況下,將其他物件所依賴的功能物件例項化的模式。這就需要一種機制用來啟用相應的元件以提供特定的功能,所以依賴注入是控制反轉的基礎。否則如果在元件不受框架控制的情況下,框架又怎麼知道要建立哪個元件?

在Java中依然注入有以下三種實現方式:

構造器注入
Setter方法注入
介面注入

4、請解釋下Spring框架中的IoC?

           Spring中的 org.springframework.beans 包和 org.springframework.context包構成了Spring框架IoC容器的基礎。

           BeanFactory 介面提供了一個先進的配置機制,使得任何型別的物件的配置成為可能。ApplicationContex介面對BeanFactory(是一個子介面)進行了擴充套件,在BeanFactory的基礎上添加了其他功能,比如與Spring的AOP更容易整合,也提供了處理message resource的機制(用於國際化)、事件傳播以及應用層的特別配置,比如針對Web應用的WebApplicationContext。

org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具體實現,用來包裝和管理前面提到的各種bean。BeanFactory介面是Spring IoC 容器的核心介面。


5、BeanFactory和ApplicationContext有什麼區別?

         BeanFactory 可以理解為含有bean集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請求時將對應的bean例項化。

          BeanFactory還能在例項化物件的時生成協作類之間的關係。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命週期的控制,呼叫客戶端的初始化方法(initialization methods)和銷燬方法(destruction methods)。

從表面上看,application context如同bean factory一樣具有bean定義、bean關聯關係的設定,根據請求分發bean的功能。但application context在此基礎上還提供了其他的功能。

提供了支援國際化的文字訊息
統一的資原始檔讀取方式
已在監聽器中註冊的bean的事件
以下是三種較常見的 ApplicationContext 實現方式:

1、ClassPathXmlApplicationContext:從classpath的XML配置檔案中讀取上下文,並生成上下文定義。應用程式上下文從程式環境變數中取得。

ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);

2、FileSystemXmlApplicationContext :由檔案系統中的XML配置檔案讀取上下文。

ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);

3、XmlWebApplicationContext:由Web應用的XML檔案讀取上下文。


6、Spring有幾種配置方式?

將Spring配置到應用開發中有以下三種方式:

基於XML的配置
基於註解的配置
基於Java的配置

7、如何用基於XML配置的方式配置Spring?

          在Spring框架中,依賴和服務需要在專門的配置檔案來實現,我常用的XML格式的配置檔案。這些配置檔案的格式通常用<beans>開頭,然後一系列的bean定義和專門的應用配置選項組成。

           SpringXML配置的主要目的時候是使所有的Spring元件都可以用xml檔案的形式來進行配置。這意味著不會出現其他的Spring配置型別(比如宣告的方式或基於Java Class的配置方式)

           Spring的XML配置方式是使用被Spring名稱空間的所支援的一系列的XML標籤來實現的。Spring有以下主要的名稱空間:context、beans、jdbc、tx、aop、mvc和aso。

<beans>

<!-- JSON Support -->

<bean name="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>

<bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>

</beans>


下面這個web.xml僅僅配置了DispatcherServlet,這件最簡單的配置便能滿足應用程式配置執行時元件的需求。

<web-app>

<display-name>Archetype Created Web Application</display-name>

<servlet>

<servlet-name>spring</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>spring</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

</web-app>

8、如何用基於Java配置的方式配置Spring?

            Spring對Java配置的支援是由@Configuration註解和@Bean註解來實現的。由@Bean註解的方法將會例項化、配置和初始化一個新物件,這個物件將由Spring的IoC容器來管理。@Bean宣告所起到的作用與<bean/> 元素類似。被@Configuration所註解的類則表示這個類的主要目的是作為bean定義的資源。被@Configuration宣告的類可以通過在同一個類的內部呼叫@bean方法來設定嵌入bean的依賴關係。

最簡單的@Configuration 宣告類請參考下面的程式碼:

@Configuration

public class AppConfig

{

@Bean

public MyService myService() {

return new MyServiceImpl();

}

}

對於上面的@Beans配置檔案相同的XML配置檔案如下:

<beans>

<bean id="myService" class="com.howtodoinjava.services.MyServiceImpl"/>

</beans>


上述配置方式的例項化方式如下:利用AnnotationConfigApplicationContext 類進行例項化

public static void main(String[] args) {

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

MyService myService = ctx.getBean(MyService.class);

myService.doStuff();

}

要使用元件組建掃描,僅需用@Configuration進行註解即可:

@Configuration

@ComponentScan(basePackages = "com.howtodoinjava")

public class AppConfig  {

...

}


在上面的例子中,com.acme包首先會被掃到,然後再容器內查詢被@Component 宣告的類,找到後將這些類按照Sring bean定義進行註冊。

如果你要在你的web應用開發中選用上述的配置的方式的話,需要用AnnotationConfigWebApplicationContext 類來讀取配置檔案,可以用來配置Spring的Servlet監聽器ContrextLoaderListener或者Spring MVC的DispatcherServlet。

<web-app>

<!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext

instead of the default XmlWebApplicationContext -->

<context-param>

<param-name>contextClass</param-name>

<param-value>

org.springframework.web.context.support.AnnotationConfigWebApplicationContext

</param-value>

</context-param>

<!-- Configuration locations must consist of one or more comma- or space-delimited

fully-qualified @Configuration classes. Fully-qualified packages may also be

specified for component-scanning -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>com.howtodoinjava.AppConfig</param-value>

</context-param>

<!-- Bootstrap the root application context as usual using ContextLoaderListener -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- Declare a Spring MVC DispatcherServlet as usual -->

<servlet>

<servlet-name>dispatcher</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext

instead of the default XmlWebApplicationContext -->

<init-param>

<param-name>contextClass</param-name>

<param-value>

org.springframework.web.context.support.AnnotationConfigWebApplicationContext

</param-value>

</init-param>

<!-- Again, config locations must consist of one or more comma- or space-delimited

and fully-qualified @Configuration classes -->

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>com.howtodoinjava.web.MvcConfig</param-value>

</init-param>

</servlet>

<!-- map all requests for /app/* to the dispatcher servlet -->

<servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<url-pattern>/app/*</url-pattern>

</servlet-mapping>

</web-app>

9、怎樣用註解的方式配置Spring?

            Spring在2.5版本以後開始支援用註解的方式來配置依賴注入。可以用註解的方式來替代XML方式的bean描述,可以將bean描述轉移到元件類的內部,只需要在相關類上、方法上或者欄位宣告上使用註解即可。註解注入將會被容器在XML注入之前被處理,所以後者會覆蓋掉前者對於同一個屬性的處理結果。

             註解裝配在Spring中是預設關閉的。所以需要在Spring檔案中配置一下才能使用基於註解的裝配模式。如果你想要在你的應用程式中使用關於註解的方法的話,請參考如下的配置。

<beans>

<context:annotation-config/>

<!-- bean definitions go here -->

</beans>

在 <context:annotation-config/>標籤配置完成以後,就可以用註解的方式在Spring中向屬性、方法和構造方法中自動裝配變數。

下面是幾種比較重要的註解型別:

@Required:該註解應用於設值方法。
@Autowired:該註解應用於有值設值方法、非設值方法、構造方法和變數。
@Qualifier:該註解和@Autowired註解搭配使用,用於消除特定bean自動裝配的歧義。
JSR-250 Annotations:Spring支援基於JSR-250 註解的以下註解,@Resource、@PostConstruct 和 @PreDestroy。

10、請解釋Spring Bean的生命週期?

            Spring Bean的生命週期簡單易懂。在一個bean例項被初始化時,需要執行一系列的初始化操作以達到可用的狀態。同樣的,當一個bean不在被呼叫時需要進行相關的析構操作,並從bean容器中移除。

            Spring bean factory 負責管理在spring容器中被建立的bean的生命週期。Bean的生命週期由兩組回撥(call back)方法組成。

           初始化之後呼叫的回撥方法。
           銷燬之前呼叫的回撥方法。
          Spring框架提供了以下四種方式來管理bean的生命週期事件:

         InitializingBean和DisposableBean回撥介面
         針對特殊行為的其他Aware介面
         Bean配置檔案中的Custom init()方法和destroy()方法
         @PostConstruct和@PreDestroy註解方式
         使用customInit()和 customDestroy()方法管理bean生命週期的程式碼樣例如下:

<beans>

<bean id="demoBean" class="com.howtodoinjava.task.DemoBean"

init-method="customInit" destroy-method="customDestroy"></bean>

</beans>


更多內容請參考:Spring生命週期Spring Bean Life Cycle。


11、Spring Bean的作用域之間有什麼區別?

         Spring容器中的bean可以分為5個範圍。所有範圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:

singleton:這種bean範圍是預設的,這種範圍確保不管接受到多少個請求,每個容器中只有一個bean的例項,單例的模式由bean factory自身來維護。
prototype:原形範圍與單例範圍相反,為每一個bean請求提供一個例項。
request:在請求bean範圍內會每一個來自客戶端的網路請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。
Session:與請求範圍類似,確保每個session中有一個bean的例項,在session過期後,bean會隨之失效。
global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要宣告讓所有的portlet共用全域性的儲存變數的話,那麼這全域性變數需要儲存在global-session中。
全域性作用域與Servlet中的session作用域效果相同。

相關推薦

MySQL試題答案

Mysql 的儲存引擎,myisam和innodb的區別。 答: 1.MyISAM 是非事務的儲存引擎,適合用於頻繁查詢的應用。表鎖,不會出現死鎖,適合小資料,小併發。 2.innodb是支援事務的儲存引擎,合於插入和更新操作比較多的應用,設計合理的話是行鎖(最大區別就在鎖的級別上),適合大資料,大併發

史上 69 道 Spring 試題答案

str 路徑 輕量 情況下 list 開發 erp throw 解決方案 史上最全 69 道 Spring 面試題和答案 目錄Spring 概述依賴註入Spring beansSpring註解Spring數據訪問Spring面向切面編程(AOP)Spring MVC S

史上69道Spring試題答案

目錄 Spring 概述 依賴注入 Spring beans Spring註解 Spring資料訪問 Spring面向切面程式設計(AOP) Spring MVC Spring 概述 1. 什麼是spring? Spring 是個java企業級應用的開源開發

Spring試題答案

1、什麼是Spring框架?Spring框架有哪些主要模組?         Spring框架是一個為Java應用程式的開發提供了綜合、廣泛的基礎性支援的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員可以專注於應用程式的開發。Spring框架本身

JAVA面試--史上 69 道 Spring 試題答案

開發十年,就只剩下這套架構體系了! >>>   

Spring試題答案

tar aos 好處 責任 strong enc 進行 需求 getter Spring 概述 1. 什麽是spring? Spring 是個java企業級應用的開源開發框架。Spring主要用來開發Java應用,但是有些擴展是針對構建J2EE平臺的web應用。Sprin

69道Spring試題答案

clas 完成 上傳 stp 集合 xml配置 很好 單元測試 簡潔 Spring 概述 1. 什麽是spring? Spring 是個Java企業級應用的開源開發框架。Spring主要用來開發Java應用,但是有些擴展是針對構建J2EE平臺的web應用。Spring 框架

經典Spring 試題答案

  目錄 Spring 概述 依賴注入 Spring beans Spring註解 Spring資料訪問 Spring面向切面程式設計(AOP) Spring MVC Spring 概述   1. 什麼是spring? S

69 個經典 Spring 試題答案

Spring 概述 1. 什麼是spring? Spring 是個java企業級應用的開源開發框架。Spring主要用來開發Java應用,但是有些擴充套件是針對構建J2EE平臺的web應用。Spring 框架目標是簡化Java企業級應用開發,並通過POJO為基礎

試題:70道Spring試題答案

轉自:搜雲庫 本文包括以下部分 Spring 概述 Spring 依賴注入 Spring beans Spring 註解 Spring 資料訪問 Spring 面向切面程式設計(AOP) Spring M

iOS 試題~[有答案]

//聯絡人:石虎 QQ:1224614774 暱稱:嗡嘛呢叭咪哄 QQ群:807236138  群稱:iOS 技術交流學習群/* ----多執行緒、特別是NSOperation和 GCD的內部原理。執行時機制的原理和運用場景。 SDWebImage的原理。實現機制。如何解決T

69道Spring試題答案,簡單明了無套路

ada 函數 編碼 相對 相互 目標 功能 時也 必須 目錄 Spring 概述 依賴註入 Spring beans Spring註解 Spring數據訪問 Spring面向切面編程(AOP) Spring MVC Spring 概述 1. 什麽是

2019年一線大廠春招:Spring試題答案合集(上篇)

開發十年,就只剩下這套架構體系了! >>>   

2019年一線大廠春招:Spring試題答案合集(下篇)

開發十年,就只剩下這套架構體系了! >>>   

2018年,經典的26個JavaScript試題答案

根據 Stack Overflow 的 2018 年度調查,JavaScript 連續六年成為最常用的程式語言。所以我們必須面對這樣的現實,JavaScript 已經成為全棧開發技能的基石,在全棧開發面試中都會不可避免地涉及到與 JavaScript 有關的問題。FullStack.Cafe 彙編了

史上python試題詳解 (二)(附帶詳細答案(關注、持續更新))

23、re的match和search區別? re.match()從開頭開始匹配string。 re.search()從anywhere 來匹配string。 # 多行模式>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No ma

史上python試題詳解(三)(附帶詳細答案(關注、持續更新))

38、面向物件深度優先和廣度優先是什麼?     39、面向物件中super的作用? 40、是否使用過functools中的函式?其作用是什麼? 1 Python自帶的 functools 模組提供了一些常用的高階函式,也就是用於處理其它函式的特殊函式。

史上Java試題(帶全部答案

轉載:https://blog.csdn.net/linzhiqiang0316/article/details/80473906 今天要談的主題是關於求職,求

史上Java試題(帶全部答案,你可能要收藏!)

原文地址:前幾天,有朋友去面試之前問我關於後端架構相關的問題,但奈於我去年更多的工作是在移動SDK開發上,對此有所遺忘,實屬無奈,後面準備總結下.今天要談的主題是關於求職.求職是在每個技術人員的生涯中都要經歷多次,對於我們大部分人而言,在進入自己心儀的公司之前少不了準備工作,

46道史上Redis試題,面試官能問的都被我找到了(含答案

開發十年,就只剩下這套架構體系了! >>>