javascript
Spring学习(十)Spring常见面试题汇总
本文借鑒:Spring框架總結,Spring容器中Bean的生命周期,69道Spring面試題和答案
一、前言
此篇文章一是為了整合一下常見的面試題,二也是為了簡單的歸納一些常見的知識點,萌新剛上路,很多地方總結得不足或者答案不準確,歡迎各位大佬補充,感謝!
二、面試題
1、基礎概念
Q:使用Spring框架的好處是什么?
- 輕量:Spring 是輕量的,基本的版本大約2MB。
- 控制反轉:Spring通過控制反轉實現了松散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
- 面向切面的編程(AOP):Spring支持面向切面的編程,并且把應用業務邏輯和系統服務分開。
- 容器:Spring 包含并管理應用中對象的生命周期和配置。
- MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
- 事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。
- 異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO拋出的)轉化為一致的unchecked 異常。
Q:Spring配置文件是什么?
Spring配置文件是個XML 文件,一般命名為applicationContext.xml,這個文件包含了類信息,描述了如何配置它們,以及如何相互調用。
Q:ApplicationContext通常的實現是什么?
- FileSystemXmlApplicationContext?:此容器從一個XML文件中加載beans的定義,XML Bean 配置文件的全路徑名必須提供給它的構造函數。
- ClassPathXmlApplicationContext:此容器也從一個XML文件中加載beans的定義,這里,你需要正確設置classpath因為這個容器將在classpath里找bean配置。
- WebXmlApplicationContext:此容器加載一個XML文件,此文件定義了一個WEB應用的所有bean。
Q:BeanFactory和ApplicationContext有什么區別?
概述:都可以當做Spring的容器。其中ApplicationContext是BeanFactory的子接口。?
區別:?
BeanFactory:
- 是Spring里面最底層的接口。?
- 以延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),才對該Bean進行加載實例化。?
- 如果Bean的某一個屬性沒有注入,BeanFacotry加載后,直至第一次使用調用getBean方法才會拋出異常。(運行時異常)
ApplicationContext:
- 是BeanFactory的子接口。
- 在容器啟動時,一次性創建了所有的Bean。
- 在容器啟動時,一次性創建了所有的Bean,我們就可以發現Spring中存在的配置錯誤。(啟動時異常) ?
2、IOC/DI
Q:什么是Spring IOC 容器?
Spring?IOC?負責創建對象,管理對象,通過依賴注入(DI),裝配對象,配置對象,并且管理這些對象的整個生命周期。
Q:如何理解IOC和DI??
IOC:控制反轉
DI:依賴注入
兩個名詞是以不同角度來描述Spring的工作,控制反轉指的是把創建對象的控制權交由Spring進行處理,從“主動”變成“被動”;依賴注入指的是把配置在Spring容器中,由Spring組裝好的對象引入到你自己的對象之中去。
Q:IOC的優點是什么?
IOC?或?DI把應用的代碼量降到最低。最小的代價和最小的侵入性實現松耦合。
Q:有哪些不同類型的IOC(依賴注入)方式?
- 構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列參數,每個參數代表一個對其他類的依賴。
- Setter方法注入:Setter方法注入是容器通過調用無參構造器或無參static工廠方法實例化bean之后,調用該bean的setter方法,即實現了基于setter的依賴注入。
3、Spring Beans
Q:什么是Spring?beans?
被Spring?IOC容器初始化,裝配,和管理的,形成Spring應用主干的java對象。(默認為單例 tag="singleton")
Q:Spring容器中Bean的生命周期??
- 實例化Bean并填充屬性
- 注入依賴關系
- 初始化
- bean交給應用開發人員處理
- 銷毀?
Q:創建Spring?beans的方式?
- 構造函數:SpringContext利用無參的構造函數創建一個對象,然后利用setter方法賦值。也可以直接通過有參構造函數直接賦值。
- 靜態方法創建對象:在類中定義一個返回值為需要獲取的對象的構造方法,然后在xml中配置“factory-method”屬性指向構造方法。
- 工廠方法創建對象:實例工程方法需要先創建工廠實例,然后在創建所需對象的時候,將其賦值為“factory-bean”
PS:詳解見Spring創建對象的三種方式
Q:Spring Bean 定義 包含什么?
一個Spring?Bean?的定義包含容器必知的所有配置元數據,包括如何創建一個bean,它的生命周期詳情及它的依賴。
PS:元數據主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等。
Q:如何給Spring 容器提供配置元數據?
- XML配置文件。
- 基于注解的配置。
- 基于java的配置。(建立一個SpringConfig的java類用于配置,用@Configuration來注解該類)
PS:詳解見Spring中基于java的配置
Q:如何定義Bean的作用域?
可以通過bean?定義中的scope屬性來定義。
Spring框架支持以下五種bean的作用域:
- singleton : bean在每個Spring ioc 容器中只有一個實例。(非線程安全!!!)
- prototype:一個bean的定義可以有多個實例。
- request:每次http請求都會創建一個bean,該作用域僅在基于web的Spring ApplicationContext情形下有效。
- session:在一個HTTP Session中,一個bean定義對應一個實例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
- global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
Q:什么是Spring的內部bean?
當一個bean僅被用作另一個bean的屬性時,它能被聲明為一個內部bean,為了定義inner?bean,在Spring?的?基于XML的?配置元數據中,可以在?<property/>或?<constructor-arg/>?元素內使用<bean/>?元素,內部bean通常是匿名的,它們的Scope一般是prototype。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="person2" class="com.itdjx.spring.dependency.injection.Person"><property name="name" value="ZH"/><property name="age" value="25"/><property name="sex" value="男"/><property name="car" ><bean class="com.itdjx.spring.dependency.injection.Car"><constructor-arg value="Audi" index="0"/><constructor-arg value="德國" index="1"/><constructor-arg value="300000" type="double"/></bean></property></bean></beans> View CodeQ:在?Spring中如何注入一個java集合?
Spring提供以下幾種集合的配置元素:
- <list>類型用于注入一列值,允許有相同的值。
- <set> 類型用于注入一組值,不允許有相同的值。
- <map> 類型用于注入一組鍵值對,鍵和值都可以為任意類型。
- <props>類型用于注入一組鍵值對,鍵和值都只能為String類型。
Q:Bean的裝配與自動裝配?
裝配:裝配,或bean 裝配是指在Spring 容器中把bean組裝到一起,前提是容器需要知道bean的依賴關系,如何通過依賴注入來把它們裝配到一起。
自動裝配:Spring?容器能夠自動裝配相互合作的bean,這意味著容器不需要<constructor-arg>和<property>配置,能通過Bean工廠自動處理bean之間的協作。
Q:解釋不同方式的自動裝配?
有五種自動裝配的方式,可以用來指導Spring容器用自動裝配方式來進行依賴注入。
- no:默認的方式是不進行自動裝配,通過顯式設置ref 屬性來進行裝配。
- byName:通過參數名 自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byname,之后容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
- byType:通過參數類型自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byType,之后容器試圖匹配、裝配和該bean的屬性具有相同類型的bean。如果有多個bean符合條件,則拋出錯誤。
- constructor:這個方式類似于byType, 但是要提供給構造器參數,如果沒有確定的帶參數的構造器參數類型,將會拋出異常。
- autodetect:首先嘗試使用constructor來自動裝配,如果無法工作,則使用byType方式。
Q:自動裝配的局限性?
- 重寫: 你仍需用 <constructor-arg>和 <property> 配置來定義依賴,意味著總要重寫自動裝配。
- 基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String字符串,和類。
- 模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配。
4、Spring注解
Q:什么是基于Java的Spring注解配置? 給一些注解的例子?
基于Java的配置,允許你在少量的Java注解的幫助下,進行你的大部分Spring配置而非通過XML文件。
@Configuration:用來標記類可以當做一個<beans></beans>的定義,被Spring IOC容器使用。
@Bean注解:表示此方法將要返回一個對象,作為一個bean注冊進Spring應用上下文。
Q:怎樣開啟注解裝配?
注解裝配在默認情況下是不開啟的,為了使用注解裝配,我們必須在Spring配置文件中配置 <context:annotation-config/>元素。
Q:@Required 注解
這個注解表明bean的屬性必須在配置的時候設置,通過一個bean定義的顯式的屬性值或通過自動裝配,若@Required注解的bean屬性未被設置,容器將拋出BeanInitializationException。
Q:@Autowired 注解
@Autowired 注解提供了更細粒度的控制,包括在何處以及如何完成自動裝配。它的用法和@Required一樣,修飾setter方法、構造器、屬性或者具有任意名稱和/或多個參數的PN方法。
Q:@Qualifier 注解
當有多個相同類型的bean卻只有一個需要自動裝配時,將@Qualifier 注解和@Autowire 注解結合使用可以消除這種混淆。
原理:指定需要裝配的確切的bean的name屬性,此時相當于按照name進行裝配。
Q:@AutoWired和@Resource的區別
@AutoWired默認以類型進行查找,@Resource默認以名稱進行查找?
@AutoWired(required=false) ? ?+ ? @Qualifier("user") ? ?== ? @Resource(name="user")
5、Spring數據訪問
Q:在Spring框架中如何更有效地使用JDBC
使用SpringJDBC 框架,資源管理和錯誤處理的代價都會被減輕。所以開發者只需寫statements 和 queries從數據存取數據,JDBC也可以在Spring框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate。
PS:詳解見Spring JdbcTemplate詳解
Q:JdbcTemplate
JdbcTemplate?類提供了很多便利的方法解決諸如把數據庫數據轉變成基本數據類型或對象,執行寫好的或可調用的數據庫操作語句,提供自定義的數據錯誤處理。?
Q:Spring對DAO的支持
Spring對數據訪問對象(DAO)的支持旨在簡化它和數據訪問技術如JDBC,Hibernate or JDO 結合使用。這使我們可以方便切換持久層。編碼時也不用擔心會捕獲每種技術特有的異常
Q:解釋對象/關系映射集成模塊?
Spring 通過提供ORM模塊,支持我們在直接JDBC之上使用一個對象/關系映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS SQL Maps。Spring的事務管理同樣支持以上所有ORM框架及JDBC。
Q:Spring支持的ORM
PS:ORM即對象關系映射,通過使用描述對象和數據庫之間映射的元數據,將面向對象語言程序中的對象自動持久化到關系數據庫中。
JSpring支持以下ORM:
- Hibernate
- iBatis
- JPA (Java Persistence API)
- TopLink
- JDO (Java Data Objects)
- OJB
Q:Spring支持的事務管理類型
Spring支持兩種類型的事務管理:
- 編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。
- 聲明式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用注解和XML配置來管理事務。
Q:Spring框架的事務管理有哪些優點?
- 它為不同的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。
- 它為編程式事務管理提供了一套簡單的API而不是一些復雜的事務API
- 它支持聲明式事務管理。
- 它和Spring各種數據訪問抽象層很好得集成。
Q:你更傾向用那種事務管理類型?
大多數Spring框架的用戶選擇聲明式事務管理,因為它對應用代碼的影響最小,因此更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優于編程式事務管理,雖然比編程式事務管理(這種方式允許你通過代碼控制事務)少了一點靈活性。
6、Spring面向切面編程(AOP)
Q:Spring中AOP名詞解釋
JoinPoint(連接點):指目標對象中,所有可以增強的方法。Spring只支持方法連接點。
Pointcut(切入點):指目標對象中,已經被增強的方法。調用這幾個方法之前、之后或者拋出異常時干點什么,那么就用切入點來定義這幾個方法。
Advice(通知/增強) :增強方法的代碼、想要的功能。
Target(目標對象):被代理對象,被通知的對象,被增強的類對象。
Weaving(織入):將通知應用到連接點形成切入點的過程。
Proxy(代理):將通知織入到目標對象之后形成的代理對象
Aspect(切面):切入點+通知————通知(Advice)說明了干什么的內容(即方法體代碼)和什么時候干(什么時候通過方法名中的before,after,around等就能知道),二切入點說明了在哪干(指定到底是哪個方法),切點表達式等定義。
Q:Aspect 切面?
AOP核心就是切面,它將多個類的通用行為封裝成可重用的模塊,該模塊含有一組API提供橫切功能。比如,一個日志模塊可以被稱作日志的AOP切面。根據需求的不同,一個應用程序可以有若干切面。在Spring AOP中,切面通過帶有@Aspect注解的類實現。
Q:在Spring AOP 中,關注點和橫切關注的區別是什么?
關注點是應用中一個模塊的行為,一個關注點可能會被定義成一個我們想實現的一個功能。橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,并影響整個應用,比如日志,安全和數據傳輸,幾乎應用的每個模塊都需要的功能。因此這些都屬于橫切關注點。
Q:連接點
連接點代表一個應用程序的某個位置,在這個位置我們可以插入一個AOP切面,它實際上是個應用程序執行Spring AOP的位置。
Q:通知
通知是個在方法執行前或執行后要做的動作,實際上是程序執行時要通過SpringAOP框架觸發的代碼段。
Spring切面可以應用五種類型的通知:
- before:前置通知,在一個方法執行前被調用。
- after: 在方法執行之后調用的通知,無論方法執行是否成功。
- after-returning: 僅當方法成功完成后執行的通知。
- after-throwing: 在方法拋出異常退出時執行的通知。
- around: 在方法執行之前和之后調用的通知。
Q:切點
切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。
Q:什么是引入?
引入允許我們在已存在的類中增加新的方法和屬性。
Q:什么是目標對象?
被一個或者多個切面所通知的對象。它通常是一個代理對象。也指被通知(advised)對象。
Q:什么是代理?
代理是通知目標對象后創建的對象。從客戶端的角度看,代理對象和目標對象是一樣的。
Q:什么是織入。什么是織入應用的不同點?
織入是將切面和到其他應用類型或對象連接或創建一個被通知對象的過程。
織入可以在編譯時,加載時,或運行時完成。
Q:解釋基于XML Schema方式的切面實現
在這種情況下,切面由常規類以及基于XML的配置實現。
Q:解釋基于注解的切面實現
在這種情況下(基于@AspectJ的實現),涉及到的切面聲明的風格與帶有java5標注的普通java類一致。
7、Spring 的MVC
Q:什么是Spring的MVC框架?
Spring 配備構建Web 應用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反轉把業務對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數和業務對象綁定。
Q:DispatcherServlet
Spring的MVC框架是圍繞DispatcherServlet來設計的,它用來處理所有的HTTP請求和響應。
Q:WebApplicationContext
WebApplicationContext 繼承了ApplicationContext 并增加了一些WEB應用必備的特有功能,它不同于一般的ApplicationContext ,因為它能處理主題,并找到被關聯的servlet。
Q:什么是Spring MVC框架的控制器?
控制器提供一個訪問應用程序的行為,此行為通常通過服務接口實現??刂破鹘馕鲇脩糨斎氩⑵滢D換為一個由視圖呈現給用戶的模型。Spring用一個非常抽象的方式實現了一個控制層,允許用戶創建多種用途的控制器。
Q:@Controller 注解
該注解表明該類扮演控制器的角色,Spring不需要你繼承任何其他控制器基類或引用Servlet API。
Q:@RequestMapping 注解
該注解是用來映射一個URL到一個類或一個特定的方處理法上。
轉載于:https://www.cnblogs.com/riches/p/11577415.html
總結
以上是生活随笔為你收集整理的Spring学习(十)Spring常见面试题汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 匿名函数练习
- 下一篇: gradle idea java ssm