Spring面試題整理

Spring 面試題

1. Spring框架有哪些模塊?

Spring框架由七個模塊組成組成,這7個模塊(或組件)均可以單獨存在,也可以與其它一個或多個模塊聯合使用,如下所示:

(1) Spring 核心容器——IoC容器

(2) Spring AOP

(3) Spring ORM

(4) Spring DAO

(5) Spring WEB

(6) Spring上下文(Context

(7) Spring MVC

 

2. 爲什麼要使用Spring框架,它有什麼優點?

(1) 輕量級的框架

(2) 非侵入性的

(3) 可以整合其它的框架,比如Struts, Hibernate

(4) 可以提供事務管理

 

3.Spring框架的工作機制是什麼?

(1) Spring MVC所有的請求都提交給DispatcherServlet,它會委託應用系統的其它模塊負責對請求進行真正的處理工作。

(2) DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller

(3) DispatcherServlet請請求提交到目標Controller

(4) Controller進行業務邏輯處理後,會返回一個ModelAndView

(5) Dispathcher查詢一個或多個ViewResolver(視圖解析器)找到ModelAndView對象指定的視圖對象

(6) 視圖對象負責將結果返回給客戶端。 

 

4.怎麼使用Spring配置事務 ?

    Spring同時支持編程式事務策略和聲明式事務策略,大部分時候都採用聲明式事務策略。

聲明式事務管理的配置方式,通常有以下4種:

(1) 使用TransactionProxyFactoryBean爲目標Bean生成事務代理的配置。此方式是最傳統、配置文件最臃腫、最難以閱讀的方式。

(2) 採用Bean繼承的事務代理配置方式,比較簡潔,但依然是增量式配置。

(3) 採用BeanNameAutoProxyCreator,根據Bean Name自動生成事務代理的方式。這是直接利用SpringAOP框架配置事務代理的方式,需要對SpringAOP框架有所理解。但這種方式避免了增量式配置,效果非常不錯。

(4) 採用DefaultAdvisorAutoProxyCreator,直接利用SpringAOP框架配置事務代理的方式,效果非常不錯,只是這種配置方式的可讀性不如第3種方式。

 

5.請你談談SSH整合

SSH整合:

(1) Struts(表示層)+ Spring(業務層)+ Hibernate(持久層) 

(2) Struts

Struts是一個表示層框架,主要作用是界面展示、接收請求和分發請求。

MVC框架中,Struts屬於VC層次,負責界面表現,負責MVC關係的分發。

View:沿用 JSPHTTPFormTagResourse

ControllerActionServletstruts-config.xmlAction

(3) Hibernate

Hibernate是一個持久層框架,它只負責與關係數據庫的操作。 

(4) Spring

Spring是一個業務層框架,是一個整合的框架,能夠很好地黏合表示層與持久層。 

 

6.在Spring框架中如何配置數據庫驅動?

使用org.springframework.jdbc.datasource.DriverManagerDataSource數據源來配置數據庫驅動。

示例:
<bean id=”dataSource”> 
    <property name=”driverClassName”> <value>org.hsqldb.jdbcDriver</value> </property>
    <property name=”url”><value>jdbc:hsqldb:db/appfuse</value></property>
    <property name=”username”><value>sa</value></property>
    <property name=”password”><value></value></property>
</bean>

 

7.在Spring框架中applicationContext.xml文件能不能改成其它文件名?

ContextLoaderListener是一個ServletContextListener,在啓動Tomcat應用服務器時,它會讀取WEB-INF目錄下的applicationContext.xml文件,初始化Spring配置

如果你想改變applicationContext.xml文件的名字或改變它的存儲位置,可以通過在web.xml文件中定義一個<context-param>元素來解決這個問題。

示例:
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener 

<context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/xyz.xml</param-value> 
     </context-param>

</listener-class> 
</listener> 

8.如何在Web應用裏配置Spring

在/WEB-INF/web.xml文件中,加入如下內容:

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup>

</servlet>

在啓動Web應用服務器(Tomcat)時,將加載/WEB-INF/applicationContext.xml文件中的內容。

在應用程序中,可以通過如下方式獲取ApplicationContext實例

WebApplicationContextUtils.getWebApplicationContext

9.Spring裏如何定義Hibernate Mapping

添加hibernate mapping 文件到WEB-INF目錄下的applicationContext.xml文件中。

示例:
<property name=”mappingResources”>
    <list>
        <value>org/appfuse/model/User.hbm.xml</value>
    </list>
</property>

10.解釋一下Dependency Injection(DI,依賴注入)IoC(Inversion of Control,控制反轉)?

依賴注入DI一種設計模式,通常也稱作控制反轉,儘管在技術上來講,依賴注入是一個IoC的特殊實現,依賴注入是指一個對象應用另外一個對象來提供一種特殊的能力。例如,把一個數據庫連接以參數的形式傳到一個對象的構造函數裏面而不是在那個對象內部自行創建一個連接。

控制反轉和依賴注入的基本思想就是把類的依賴從類內部轉化到外部以減少依賴。

應用控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被注入到對象中。所以,控制反轉是,關於一個對象如何獲取它依賴的對象的引用,這個責任的反轉。

 

11. Spring中的BeanFactoryApplicationContext的作用有哪些?

(1) BeanFactory負責讀取Bean配置文檔,管理Bean的加載和實例化,維護Bean之間的依賴關係,負責Bean生命週期。

(2) ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能: 

a. 國際化支持

b. 資源訪問:Resource rs = ctx. getResource(”classpath:config.properties”);

c. 事件傳遞:通過實現ApplicationContextAware接口

(3) 常用的獲取ApplicationContext的方法:

FileSystemXmlApplicationContext:從文件系統或者URL指定的xml配置文件創建,參數爲配置文件名或文件名數組

ClassPathXmlApplicationContext:從classpathxml配置文件創建,可以從jar包中讀取配置文件

WebApplicationContextUtils:從web應用的根目錄讀取配置文件,需要先在web.xml中配置,可以配置監聽器或者 servlet來實現 
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<servlet> 
    <servlet-name>context</servlet-name> 
    <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
    這兩種方式都默認配置文件爲WEB-INF/applicationContext.xml,也可使用context-param指定配置文件

<context-param>

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

<param-value>/WEB-INF/myApplicationContext.xml</param-value>

</context-param>

 

12. 如何在Spring中實現國際化

applicationContext.xml文件中配置一個bean
<bean id=”messageSource” class=”org.springframework.context.support.ResourceBundleMessageSource”>
    <property name=”basename”><value>message</value> </property> 
</bean>
     在src目錄下建多個properties文件,其命名格式是message_語言_國家
     在頁面中顯示信息時,通過applictionContext.getMessage(“鍵名”,”參數”,”區域”)取出相關的信息。 

 

 

13. Spring中的核心類有那些,各有什麼作用?

BeanFactory:產生一個新的實例,可以實現單例模式

BeanWrapper:提供統一的getset方法

ApplicationContext:提供Spring框架的實現,包括BeanFactory的所有功能

 

14. 什麼是AOPAOP的作用是什麼?

面向切面編程(AOP)提供另外一種角度來思考程序結構,通過這種方式彌補了面向對象編程(OOP)的不足。

除了類(classes)以外,AOP提供了切面。切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理

Spring的一個關鍵的組件就是AOP框架,可以自由選擇是否使用AOP,提供聲明式企業服務,特別是爲了替代EJB聲明式服務。最重要的服務是聲明性事務管理,這個服務建立在Spring的抽象事物管理之上

允許用戶實現自定義切面,用AOP來完善OOP的使用,可以把Spring AOP看作是對Spring的一種增強

 

15. 使用Spring有什麼好處?

(1) Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其它的包含了J2EE特有APIs的 framework,你會發現Spring關注了遺留問題。

(2) Spring能消除在許多工程上對Singleton的過多使用。

(3) Spring能消除使用各種格式的屬性定製文件的需要,在整個工程中,可通過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統屬性,爲此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。

(4) Spring能通過接口而不是類促進好的編程習慣,減少編程代價到幾乎爲零。

(5) Spring被設計爲讓使用它創建的應用儘可能少的依賴於它的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring

(6) 使用Spring構建的應用程序易於單元測試。

(7) Spring能使EJB的使用成爲一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOslocal EJBs來實現業務接口,卻不會影響調用代碼。

(8) Spring幫助你解決許多問題而無需使用EJBSpring能提供一種EJB的替換物,它們適於許多web應用。例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的數據庫打交道,甚至不需要JTA實現。

(9) Spring爲數據存取提供了一致的框架,不論是使用JDBCO/R mapping產品(如Hibernate)。

 

16. 什麼是Spring,它有什麼特點?

Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。

(1) 輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR文件裏發佈,並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。

(2) 控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了鬆耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認爲IoCJNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。 

(3) 面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務管理)進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責其它的系統級關注點,例如日誌或事務支持。 

(4) 容器——Spring包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創建——基於一個可配置原型(prototype),你的bean可以創建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。 

(5) 框架——Spring可以將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件裏。 Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。

 

17. AOP裏面幾個重要名詞概念的解釋

(1) 切面(Aspect)

一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。 在Spring AOP中,切面可以使用通用類(基於模式的風格) 或者在普通類中以 @Aspect 註解來實現。 

(2) 連接點(Joinpoint)

在程序執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。 在Spring AOP中,一個連接點總是代表一個方法的執行。 通過聲明一個org.aspectj.lang.JoinPoint類型的參數可以使通知(Advice)的主體部分獲得連接點信息。 

(3) 通知(Advice)

在切面的某個特定的連接點(Joinpoint)上執行的動作。通知有各種類型,其中包括“around”“before”“after”等通知。 通知的類型將在後面部分進行討論。許多AOP框架,包括Spring,都是以攔截器做通知模型,並維護一個以連接點爲中心的攔截器鏈。 

(4) 切入點(Pointcut)

匹配連接點(Joinpoint)的斷言。通知和一個切入點表達式關聯,並在滿足這個切入點的連接點上運行(例如,當執行某個特定名稱的方法時)。 切入點表達式如何和連接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法。

(5) 引入(Introduction)

也被稱爲內部類型聲明(inter-type declaration))。聲明額外的方法或者某個類型的字段。 Spring允許引入新的接口(以及一個對應的實現)到任何被代理的對象。 例如,你可以使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。 

(6) 目標對象(Target Object)

被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫做被通知(advised) 對象。 既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個被代理(proxied)對象。 

(7) AOP代理(AOP Proxy)

AOP框架創建的對象,用來實現切面契約(aspect contract)(包括通知方法執行等功能)。 在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。 注意:Spring 2.0最新引入的基於模式(schema-based)風格和@AspectJ註解風格的切面聲明,對於使用這些風格的用戶來說,代理的創建是透明的。 

(8) 織入(Weaving)

把切面(aspect)連接到其它的應用程序類型或者對象上,並創建一個被通知(advised)的對象。 這些可以在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。 Spring和其它純Java AOP框架一樣,在運行時完成織入。

18、 SpringBean有多種作用域,包括:

singletonprototyperequestsessionglobal sessionapplication、自定義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章