最新100道大廠高頻spring面試題附答案

簡介

這里是由多位互聯(lián)網(wǎng)大廠架構(gòu)師面試整理的出現(xiàn)頻率最高的spring相關(guān)面試題五辽,并為大家整理了完整的答案办斑,趕緊收藏起來吧!

100道spring高頻面試題

Spring概覽

1、Spring是什么幸斥?

Spring是一個企業(yè)級Java開發(fā)框架匹摇。Spring框架的核心特性可用于開發(fā)任何Java應(yīng)用程序,但也有一些擴(kuò)展用于在Java EE平臺上構(gòu)建web應(yīng)用程序甲葬。Spring框架的目標(biāo)是通過基于POJO的模型来惧,使Java EE開發(fā)更加簡單。

2演顾、Spring框架的好處供搀?

輕量級:Spring框架是輕量級的,最基礎(chǔ)的版本大約只有2MB钠至。

控制反轉(zhuǎn)(IOC):通過控制反轉(zhuǎn)技術(shù)葛虐,實(shí)現(xiàn)了解耦合。對象給出它們的依賴棉钧,而不是創(chuàng)建或查找依賴的對象屿脐。

面向切面(AOP):Spring支持面向切面的編程,并將應(yīng)用程序業(yè)務(wù)邏輯與系統(tǒng)服務(wù)分離宪卿。

MVC框架:Spring的WEB框架是一個設(shè)計(jì)良好的web MVC框架的诵,它為web框架提供了一個很棒的替代方案。

容器:Spring包含并管理對象的生命周期和配置佑钾。

事務(wù)管理:Spring提供了一個一致性的事務(wù)管理接口西疤,可以收縮到本地事務(wù),也可以擴(kuò)展到全局事務(wù)(JTA)休溶。

異常處理:Spring提供了方便的API來將具體技術(shù)的異常(由JDBC代赁、Hibernate或JDO拋出)轉(zhuǎn)換為一致的unchecked 異常扰她。

3、Spring有哪些模塊芭碍?

Spring大約有20個模塊徒役,包括核心容器、Data Access/Integration窖壕、Web, AOP , Instrumentation 和Test忧勿。

??Spring框架最核心的是Spring Core Container它包含以下模塊:

Core

Bean

Context

Expression Language

??Data Access/Integration,提供與數(shù)據(jù)庫交互的支持瞻讽。它包含以下模塊:

JDBC

Object-Relational Mapping (ORM)

Java Messaging Service (JMS)

Object XML Mappers (OXM)

Transaction Management

??Web鸳吸,提供創(chuàng)建web應(yīng)用程序的支持。它包含以下模塊:

Web

Web-MVC

Web-Socket

Web-Portlet

??Test,支持使用JUnit和TestNG進(jìn)行測試卸夕。

??Messaging,提供對STOMP的支持婆瓜。它還支持用于路由和處理來自WebSocket客戶端的STOMP消息的注釋編程模型快集。

??Aspects,提供與AspectJ集成的支持廉白。

4个初、解釋Core Container(Application context)模塊

這是最基本的Spring模塊,它提供Spring框架的基本功能猴蹂。BeanFactory是任何基于spring的應(yīng)用程序的核心院溺。Spring框架是基于這個模塊的,它構(gòu)建了Spring容器磅轻。

5珍逸、BeanFactory實(shí)現(xiàn)實(shí)例

BeanFactory是工廠模式的實(shí)現(xiàn),它使用控制反轉(zhuǎn)來將程序的配置和依賴項(xiàng)與實(shí)際的業(yè)務(wù)代碼分開聋溜。

6谆膳、XMLBeanFactory

最常用的是org.springframework.beans.factory.xml.XmlBeanFactory,它根據(jù)XML文件的定義加載對應(yīng)的bean撮躁。這個容器從XML文件中讀取配置元數(shù)據(jù)漱病,并使用它創(chuàng)建完全配置化的應(yīng)用程序。

7把曼、解釋AOP模塊

AOP模塊用于為支持Spring應(yīng)用程序面向切面的開發(fā)杨帽。AOP聯(lián)盟提供了很多支持,這樣就確保了Spring和其他AOP框架的共通性嗤军。本模塊還將元數(shù)據(jù)編程引入Spring注盈。

8、解釋JDBC抽象和DAO模塊

使用JDBC抽象和DAO模塊叙赚,我們可以確保保持?jǐn)?shù)據(jù)庫代碼的整潔和簡單当凡,并避免數(shù)據(jù)庫資源關(guān)閉而導(dǎo)致的問題山害。它在多個數(shù)據(jù)庫服務(wù)器給出的異常之上提供了一層統(tǒng)一的異常。它還利用Spring的AOP模塊為Spring應(yīng)用程序中的對象提供事務(wù)管理服務(wù)沿量。

9浪慌、解釋對象/關(guān)系映射集成模塊

Spring還通過提供ORM模塊,支持直接在JDBC上使用對象/關(guān)系映射(ORM)工具朴则。Spring支持集成幾個流行的ORM框架中权纤,包括Hibernate、JDO和iBATIS SQL Maps乌妒。Spring的事務(wù)管理同樣支持這些ORM框架和JDBC汹想。

10、解釋Spring web模塊

Spring web模塊基于applicationcontext模塊撤蚊,提供了一個適合基于web的應(yīng)用程序的上下文古掏。此模塊還支持多種面向web的任務(wù),例如隱式地處理文件上傳請求侦啸,以及將請求參數(shù)編程綁定到業(yè)務(wù)對象槽唾。還包含與Jakarta Struts的集成。

11光涂、解釋Spring MVC模塊

Spring提供了MVC框架庞萍,用于構(gòu)建web應(yīng)用程序。Spring可以很簡單與其他MVC框架集成忘闻,但是Spring的MVC框架是一個更好的選擇钝计,因?yàn)樗褂肐OC將控制層邏輯與業(yè)務(wù)對象完全分離。使用Spring MVC齐佳,你可以聲明性地將請求參數(shù)綁定到業(yè)務(wù)對象私恬。

12、Spring配置文件

Spring配置文件是一個XML文件炼吴。這個文件包含類信息践付,并說明這些類是如何配置和相互調(diào)用的。

13缺厉、如何才能有多個Spring配置文件永高?

web.xml contextConfigLocation:你可以通過ContextConfigLocation元素將多個配置文件全部加載到Web應(yīng)用程序上下文中。假設(shè)你正在編寫一個web應(yīng)用程序提针,已經(jīng)有了主應(yīng)用程序上下文命爬。你只需在下一個上下文的聲明之間留出一些空白。

applicationContext.xml導(dǎo)入resource:你可以添加你的主applicationContext.xml至web.xml文件辐脖,然后在主上下文中使用import語句饲宛。

14、ApplicationContext有哪些常見實(shí)現(xiàn)嗜价?

FileSystemXmlApplicationContext容器從XML文件加載bean的定義艇抠。XML bean配置文件的完整路徑必須提供給構(gòu)造函數(shù)幕庐。

ClassPathXmlApplicationContext容器也從XML文件加載bean的定義。這里家淤,你需要正確設(shè)置classpath因?yàn)檫@個容器將在classpath里找bean配置异剥。

WebXmlApplicationContext容器從web應(yīng)用程序中加載包含所有bean定義的XML文件。

15絮重、Bean Factory和ApplicationContext有什么區(qū)別冤寿?

Application contexts提供一種方法處理文本消息,一個通常的做法是加載文件資源(比如鏡像)青伤,它們可以向注冊為監(jiān)聽器的bean發(fā)布事件督怜。另外,在容器或容器內(nèi)的對象上執(zhí)行的那些不得不由bean工廠以程序化方式處理的操作狠角,可以在Application contexts中以聲明的方式處理号杠。Application contexts實(shí)現(xiàn)了MessageSource接口,該接口的實(shí)現(xiàn)以可插拔的方式提供獲取本地化消息的方法丰歌。

16姨蟋、Spring框架的一些最佳實(shí)踐是什么?

可見 20 個Spring框架實(shí)踐 动遭,

17芬探、使用Spring框架的方式有哪些神得?

可以這樣使用Spring框架:

用于編寫web應(yīng)用程序

提供Restful服務(wù)

保護(hù)你的web應(yīng)用程序

聯(lián)通數(shù)據(jù)庫

處理長時間運(yùn)行的作業(yè)

處理你必須要用的外部資源和系統(tǒng)

用于測試

用于獨(dú)立的java項(xiàng)目

將應(yīng)用程序轉(zhuǎn)換為可執(zhí)行文件

將社交媒體集成到應(yīng)用程序中

18厘惦、我們?nèi)绾问褂肧pring創(chuàng)建restful web服務(wù)來返回JSON響應(yīng)結(jié)果?

只要Jackson2在classpath中哩簿,SpringBoor程序中的任何Spring @RestController修飾的控制器默認(rèn)都返回json格式結(jié)果宵蕉。

19、Spring vs Spring MVC vs Spring Boot?

Spring:Spring最重要的特性是依賴注入或控制反轉(zhuǎn)节榜。

Spring MVC :是一個完全面向HTTP的MVC框架羡玛,由Spring框架管理并基于servlet。

SpringBoot:是一個用于快速配置的應(yīng)用框架宗苍,它提供現(xiàn)成的配置稼稿,以便構(gòu)建Spring應(yīng)用。

20唁情、一個Spring大概是什么樣子根时?

接口:定義了一些方法的接口矛绘。

Bean類:它包含屬性、setter和getter方法谋右、其它方法等等。

Spring AOP:提供關(guān)注橫切面的功能补箍。

XML配置文件:包含類的信息以及如何配置它們改执。

客戶程序:調(diào)用方法啸蜜。

依賴注入

21、Spring的IOC容器是什么辈挂?

Spring IOC負(fù)責(zé)創(chuàng)建對象衬横,使用依賴注入(dependency injection,DI)管理它們呢岗,將對象集中起來冕香,配置對象,管理對象的整個生命周期后豫。

22悉尾、IOC的好處有哪些?

IOC或依賴注入最小化應(yīng)用程序代碼量挫酿。

它使測試應(yīng)用程序變得容易构眯,因?yàn)閱卧獪y試中不需要單例或JNDI查找機(jī)制。

以最小的代價和最少的干擾來促進(jìn)松耦合早龟。

IOC容器支持快速實(shí)例化和懶加載惫霸。

23、Spirng中有多少種IOC容器葱弟?

BeanFactory:BeanFactory本質(zhì)上只不過是高層級的工廠接口壹店,它能夠維護(hù)不同bean及其依賴項(xiàng)的注冊表。BeanFactory使你能夠讀取bean定義并使用bean工廠調(diào)用它們芝加。

ApplicationContext:ApplicationContext是Spring應(yīng)用程序中的核心接口硅卢,用于向應(yīng)用程序提供配置信息。它在運(yùn)行時是只讀的藏杖,但如果需要并且應(yīng)用支持的話将塑,可以重新加載。許多類實(shí)現(xiàn)了ApplicationContext接口蝌麸,允許多種配置項(xiàng)和應(yīng)用類型点寥。

24、BeanFactory和ApplicationContext比較

Application Context:

Bean實(shí)例化/裝配

BeanPostProcessor自動注冊

BeanFactoryPostProcessor自動注冊

方便的消息源訪問(針對i18n)

ApplicationEvent發(fā)布

BeanFactory:

Bean實(shí)例化/裝配

25来吩、什么是Spring中的依賴注入敢辩?

依賴注入是控制反轉(zhuǎn)(IOC)的一個方面,是一個通用的概念弟疆,它有很多種表達(dá)的方式戚长。這個概念意思你不創(chuàng)建你的對象,但描述他們應(yīng)該如何創(chuàng)建兽间。你不會在代碼中直接將組件和服務(wù)耦合在一起历葛,而是描述配置文件中的哪些組件需要哪些服務(wù)。然后由一個容器(IOC容器)負(fù)責(zé)將它們關(guān)聯(lián)起來。

26恤溶、緊耦合和松耦合有什么區(qū)別乓诽?

緊耦合:

緊密耦合是指類之間高度依賴。

松耦合:

松耦合是通過促進(jìn)單一職責(zé)和關(guān)注點(diǎn)分離的設(shè)計(jì)來實(shí)現(xiàn)的咒程。

27鸠天、IOC(依賴注入)有哪些不同類型?

構(gòu)造方法注入:基于構(gòu)造方法的依賴注入是在容器調(diào)用一個帶有多個參數(shù)的類構(gòu)造方法時完成的帐姻,每個參數(shù)都表示對其他類的依賴稠集。

Setter注入:Setter注入是由容器在調(diào)用無參數(shù)構(gòu)造方法或無參數(shù)靜態(tài)工廠方法實(shí)例化Bean后調(diào)用Bean的Setter方法來實(shí)現(xiàn)的。

28饥瓷、你建議使用構(gòu)造方法注入還是Setter注入剥纷?

可以同時使用構(gòu)造方法注入和Setter注入。最好的解決方案是對強(qiáng)制依賴項(xiàng)使用構(gòu)造方法注入呢铆,對可選依賴項(xiàng)使用setter方法注入晦鞋。

Spring Beans

29、Spring beans是什么棺克?

Spring bean是構(gòu)成Spring應(yīng)用程序主干的Java對象悠垛。它們由springioc容器實(shí)例化、組裝和管理娜谊。這些bean是使用提供給容器的配置元數(shù)據(jù)創(chuàng)建的确买,例如,XML中形式定義纱皆。

spring框架中定義的bean是單例bean湾趾。bean標(biāo)記中有一個名為“singleton”的屬性,如果指定為true抹剩,則bean為單例撑帖;如果設(shè)置為false蓉坎,則bean將成為prototype bean澳眷。默認(rèn)設(shè)置為true。所以蛉艾,spring框架中的所有bean默認(rèn)都是單例bean钳踊。

30、Spring bean定義包含什么勿侯?

Spring bean的定義包含容器如何創(chuàng)建Bean拓瞪、其生命周期及其依賴關(guān)系所需的所有配置元數(shù)據(jù)。

31助琐、如何向Spring容器提供配置元數(shù)據(jù)祭埂?

向Spring容器提供配置元數(shù)據(jù)有三種重要方法:

基于XML的配置文件

基于注解的配置

基于Java的配置

32、怎么定義bean的作用域?

在Spring中定義時蛆橡,我們還可以為bean聲明一個作用域舌界。它可以通過bean定義中的scope屬性來定義。例如泰演,當(dāng)Spring每次需要生成一個新的bean實(shí)例時呻拌,這個bean的scope屬性就是prototype。另一方面睦焕,當(dāng)Spring每次需要時都必須返回同一個bean實(shí)例時藐握,bean scope屬性必須設(shè)置為singleton。

33垃喊、說明Sprig支持的bean作用域

singleton:Spring將bean定義的范圍限定為每個Spring IOC容器只有一個單實(shí)例猾普。

prototype:單個bean定義有任意數(shù)量的對象實(shí)例。

request:作用域?yàn)橐淮蝖ttp請求本谜,該作用域僅在基于web的Spring ApplicationContext情形下有效抬闷。

session:作用域?yàn)镠TTP Session,該作用域僅在基于web的Spring ApplicationContext情形下有效耕突。

global-session:作用域?yàn)槿值腍TTP session笤成。該作用域也是僅在基于web的Spring ApplicationContext情形下有效。

默認(rèn)的作用域是singleton眷茁。

34炕泳、單例作用域是線程安全的嗎?

不上祈,單例bean在Spring框架中不是線程安全的培遵。

35、解釋Spring Bean的聲明周期

Spring容器 從XML 文件中讀取bean的定義登刺,并實(shí)例化bean籽腕。

Spring填充bean定義(DI)中指定的所有屬性。

如果bean實(shí)現(xiàn)了BeanNameAware接口纸俭,spring會將bean的id傳遞給setBeanName()方法皇耗。

如果有任何BeanBeanPostProcessor與該bean關(guān)聯(lián),Spring將調(diào)用postProcesserBeforeInitialization()方法揍很。

如果bean實(shí)現(xiàn)了IntializingBean郎楼,則調(diào)用其afterPropertySet()方法。如果bean聲明了init方法窒悔,則調(diào)用指定的init方法呜袁。

如果有任何與bean關(guān)聯(lián)的beanPostProcessor,則將調(diào)用它們的postProcessAfterInitialization()方法简珠。

如果bean實(shí)現(xiàn)l了DisposableBean阶界,它將調(diào)用destroy()方法。

36、有哪些重要的bean生命周期方法膘融?你能重寫它們嗎芜抒?

有兩個重要的生命周期方法。

第一個是setup托启,當(dāng)bean加載到容器中時調(diào)用它宅倒。第二個方法是teardown方法,當(dāng)bean從容器中卸載時調(diào)用該方法屯耸。

bean標(biāo)簽有兩個重要的屬性(init-method和destroy-method)拐迁,可以用它們定義自己的自定義初始化和銷毀方法。還有相應(yīng)的注解(@PostConstruct和@PreDestroy)疗绣。

37线召、Spring的內(nèi)部bean是什么?

當(dāng)一個bean僅被用作另一個bean的屬性時多矮,它能被聲明為一個內(nèi)部bean缓淹,為了定義內(nèi)部bean,在Spring 的 基于XML的 配置元數(shù)據(jù)中塔逃,可以在 < property/ >或 < constructor-arg/ > 元素內(nèi)使用< bean/ > 元素讯壶,內(nèi)部bean通常是匿名的,它們的作用域一般是prototype湾盗。

38伏蚊、如何在Spring中注入Java集合?

Spring提供以下幾種集合的配置元素:

類型用于注入一列值格粪,允許有相同的值躏吊。

類型用于注入一組值,不允許有相同的值帐萎。

<map style="box-sizing: border-box; outline: 0px; overflow-wrap: break-word;">類型用于注入一組鍵值對比伏,鍵和值都可以為任意類型。</map>

類型用于注入一組鍵值對疆导,鍵和值都只能為String類型赁项。

39、什么是Spring Bean裝配是鬼?

裝配肤舞,或bean 裝配是指在Spring 容器中把bean組裝到一起紫新,前提是容器需要知道bean的依賴關(guān)系均蜜,如何通過依賴注入來把它們裝配到一起。

40芒率、什么是Bean自動裝配囤耳?

Spring 容器能夠自動裝配 自動關(guān)聯(lián) 的bean,這意味著,通過檢查BeanFactory的內(nèi)容充择,而不使用

41德玫、解釋不同類型的自動裝配

自動裝配有五種模式,可用于指示Spring容器使用autowiring進(jìn)行依賴注入:

no:默認(rèn)的方式是不進(jìn)行自動裝配椎麦,通過顯式設(shè)置ref 屬性來進(jìn)行裝配宰僧。

byName:通過參數(shù)名 自動裝配,Spring容器在配置文件中發(fā)現(xiàn)bean的autowire屬性被設(shè)置成byname观挎,之后容器試圖匹配琴儿、裝配和該bean的屬性具有相同名字的bean。

byType:過參數(shù)類型自動裝配嘁捷,Spring容器在配置文件中發(fā)現(xiàn)bean的autowire屬性被設(shè)置成byType造成,之后容器試圖匹配、裝配和該bean的屬性具有相同類型的bean雄嚣。如果有多個bean符合條件晒屎,則拋出異常。

constructor:這個方式類似于byType缓升, 但是要提供構(gòu)造器參數(shù)鼓鲁,如果沒有確定的帶參數(shù)的構(gòu)造器參數(shù)類型,將會拋出異常港谊。

autodetect:首先嘗試使用constructor來自動裝配坐桩,如果不行,則使用byType方式封锉。

42绵跷、自動注入有限制嗎?

自動注入的限制:

重寫: 你仍可以用 < constructor-arg >和 < property > 配置來定義依賴成福,這些配置將始終覆蓋自動注入碾局。

基本數(shù)據(jù)類型:不能自動裝配簡單的屬性,如基本數(shù)據(jù)類型奴艾、字符串和類净当。

模糊特性:自動裝配不如顯式裝配精確,如果有可能盡量使用顯示裝配蕴潦。

43像啼、你能在Spring中注入null和空字符串嗎?

是的潭苞,可以忽冻。

Spring注解

44、有哪些重要的Spring注解此疹?

我在項(xiàng)目中使用的一些Spring注解:

@Component:用于指示類是組件僧诚。這些類用于自動注入遮婶,并在使用基于注解的配置時配置為bean。

@Controller:是一種特定類型的組件湖笨,用于MVC應(yīng)用程序旗扑,主要與@RequestMapping注解一起使用。

@Repository:用于表示組件用作存儲庫和存儲/檢索/搜索數(shù)據(jù)的操作慈省。我們可以將此注解應(yīng)用于DAO實(shí)現(xiàn)類臀防。

@Service:用于指示類是服務(wù)層。

@Required:此注解簡單地說明作用的bean屬性必須在配置時通過bean定義中的顯式屬性值或通過自動注入填充边败。如果作用的bean屬性未填充清钥,容器將拋出BeanInitializationException。

@ResponseBody:用于將對象作為response放闺,通常用于將XML或JSON數(shù)據(jù)作為response發(fā)送祟昭。

@PathVariable:用于將動態(tài)值從URI映射到處理方法參數(shù)。

@Autowired:對自動注入的位置和方式提供了更細(xì)粒度的控制怖侦。它可以用于在setter方法上自動注入bean篡悟。就像@Required 注解一樣,修飾setter方法匾寝、構(gòu)造器搬葬、屬性或者具有任意名稱和/或多個參數(shù)的PN方法。

@Qualifier:當(dāng)有多個相同類型的bean并且只需要將一個bean自動注入時艳悔,@Qualifier注解與@Autowired注釋一起使用急凰,通過指定將連接哪個bean來消除歧義。

@Scope:配置Spring bean的作用域猜年。

@Configuration:表示Spring IOC容器可以將該類用作bean定義的源抡锈。

@ComponentScan:應(yīng)用此注解時,將掃描包下的所有可用類乔外。

@Bean:對于基于java的配置床三,用@Bean注解修飾的方法將返回一個在Spring應(yīng)用程序上下文中注冊為Bean的對象。

用于配置切面和通知杨幼、@Aspect撇簿、@Before、@After差购、@Around四瘫、@Pointcut等的AspectJ注解。

45欲逃、@RequestParam注解的作用是什么找蜜?

spring中的@RequestParam注解將查詢字符串的參數(shù)值綁定到控制器的方法參數(shù)。

46暖夭、注解@Primary的重要性

當(dāng)有多個相同數(shù)據(jù)類型的bean時锹杈,開發(fā)人員Spring的@Primary注解撵孤,它會自動為特定bean提供更高的優(yōu)先級迈着。這個注解可以用在任何直接或間接用@Component注解修飾的類上竭望,也可以用在用@Bean注解修飾的方法上。

47裕菠、XML配置和注解之間有什么區(qū)別咬清?

注解的優(yōu)點(diǎn):

所有信息都在一個文件中

當(dāng)類更改了,不用修改xml配置文件

xml配置的優(yōu)點(diǎn):

POJO及其行為之間更清晰地分離

當(dāng)你不知道哪個POJO負(fù)責(zé)該行為時奴潘,更容易找到該P(yáng)OJO

48旧烧、@SpringBootApplication的作用是什么?

@SpringBootApplication 注解是在springboot1.2.0中引入的画髓,它支持自動配置特性掘剪。

此批注封裝了三種不同注解的作用:

@Configuration:允許開發(fā)人員顯式地注冊bean

@ComponentScan:啟用組件掃描,這樣控制器類和其他組件將被自動發(fā)現(xiàn)并注冊為Spring應(yīng)用程序上下文中的bean

@EnableAutoConfiguration:啟動SpringBoot的自動配置特性

此注解可以使用以下可選參數(shù):

exclude:從自動配置中排除的類列表

excludeNames:從自動配置中排除完全限定類名的列表

scanBasePackage:其中提供了掃描程序包的列表

scanBasePackageClasses:提供必須應(yīng)用于掃描的其他包中的類的列表

49奈虾、解釋@InitBinder夺谁?

此注解修飾在聲明日期格式的方法上,并且在整個類中肉微,使用定義的日期格式匾鸥。每當(dāng)綁定作用在日期字段@InitBinder注解中時,說明使用CustomDateEditor碉纳,而CustomDateEditor則使用@InitBinder中聲明的日期格式勿负。

50、定義@ControllerAdvice

有@ControllerAdvice注解的類可以顯式聲明為Spring bean劳曹,或者通過類路徑掃描自動注入奴愉。所有這樣的bean都是通過AnnotationAwareOrderComparator排序的,即基于@Order和Ordered铁孵,并在運(yùn)行時按該順序調(diào)用躁劣。對于處理異常,將使用匹配的異常處理程序方法在第一個通知上選擇一個@ExceptionHandler库菲。對于模型屬性和InitBinder初始化账忘,@ModelAttribute和@InitBinder方法也將遵循@ControllerAdvice順序。

51熙宇、我們可以將一個個對象作為控制器處理程序方法的響應(yīng)嗎鳖擒?

是的,我們可以使用@ResponseBody注解在restful web服務(wù)中發(fā)送基于JSON或XML的響應(yīng)烫止。

52蒋荚、解釋@ModelAttribute?

@ModelAttribute注解引用模型對象的屬性馆蠕,用于準(zhǔn)備模型數(shù)據(jù)期升。此注解將方法變量或模型對象綁定到命名的模型屬性惊奇。此注解接受一個可選值,該值表示模型屬性的名稱播赁。@ModelAttribute注解可以在參數(shù)級別或方法級別使用颂郎。在參數(shù)級別使用此注解是為了接受請求表單值,而在方法級別則是將默認(rèn)值分配給模型容为。

53乓序、@RequestMapping注解

@RequestMapping注解用于將web請求映射到處理程序類(即控制器)或處理程序方法上,它可以在方法級或類級使用坎背。如果開發(fā)人員在類級別使用@RequestMapping注釋替劈,它將作為方法級路徑的相對路徑。

54得滤、什么是spring中基于java的配置陨献?給出一注解示例

基于Java的配置選項(xiàng)使你能夠在不使用XML的情況下編寫大多數(shù)Spring配置,但是需要一些基于Java的注釋的幫助懂更。

一個例子是@Configuration注釋眨业,它表示spring IOC容器可以將該類用作bean定義的源。另一個例子是@Bean注解的方法膜蛔,該方法將返回一個對象坛猪,該對象應(yīng)在Spring應(yīng)用程序上下文中注冊為bean。

55皂股、什么是基于注解的容器配置墅茉?

XML配置之外的另一種選擇是基于注解的配置,它依賴字節(jié)碼元數(shù)據(jù)來裝配組件呜呐,而不是尖括號聲明就斤。開發(fā)人員不使用XML來描述bean裝配,而是通過在相關(guān)的類蘑辑、方法或字段聲明上使用注解將配置移動到組件類中洋机。

56、如何打開注解裝配洋魂?

默認(rèn)情況下绷旗,Spring容器中的注解裝配不會打開。為了使用基于注解的裝配副砍,我們必須在Spring配置文件中配置context:annotation-config/ 元素衔肢。

Spring 數(shù)據(jù)訪問

57、Spring JDBC API中有哪些類豁翎?

JdbcTemplate

SimpleJdbcTemplate

NamedParameterJdbcTemplate

SimpleJdbcInsert

SimpleJdbcCall

58角骤、如何在Spring框架中更高效地使用JDBC?

使用SpringJDBC 框架心剥,資源管理和錯誤處理的代價都會被減輕邦尊。所以開發(fā)者只需寫statements 和 queries從數(shù)據(jù)存取數(shù)據(jù)背桐,JDBC也可以在Spring框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate 蝉揍。

59链峭、JdbcTemplate

JdbcTemplate 類提供了很多便利的方法解決諸如把數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)變成基本數(shù)據(jù)類型或?qū)ο螅瑘?zhí)行寫好的或可調(diào)用的數(shù)據(jù)庫操作語句疑苫,提供自定義的數(shù)據(jù)錯誤處理熏版。

60纷责、如何通過spring JdbcTemplate獲取數(shù)據(jù)捍掺?

有兩個接口可用于從數(shù)據(jù)庫中獲取數(shù)據(jù):

ResultSetExtractor

RowMapper

61、NamedParameterJdbcTemplate的優(yōu)點(diǎn)是什么再膳?

NamedParameterJdbcTemplate是基于spring提供的JDBCTemplate構(gòu)建的挺勿,用于與數(shù)據(jù)庫的底層交互。它可以將SQL查詢參數(shù)作為鍵值對傳遞喂柒。因此不瓶,與索引或“?”相比灾杰,程序代碼的可讀性要高得多蚊丐,因此可以作為更好的標(biāo)識“?“”占位符方法艳吠。特別是在參數(shù)數(shù)目龐大的情況下麦备,后者更難跟蹤。

62昭娩、什么是SpringJDBCTemplate類以及如何使用它凛篙?

JdbcTemplate類執(zhí)行SQL查詢、update語句和存儲過程調(diào)用栏渺,對結(jié)果集執(zhí)行迭代呛梆,并提取返回的參數(shù)值。它隱式處理資源的創(chuàng)建和釋放磕诊,從而避免諸如忘記關(guān)閉連接之類的錯誤填物。它還捕獲JDBC異常并進(jìn)行包裝。

63霎终、 JDBC和Spring JDBC有什么區(qū)別滞磺?

Spring JDBC在JDBC的頂層提供數(shù)據(jù)操作:

1、定義連接參數(shù)

2神僵、打開連接

3雁刷、指定語句

4、準(zhǔn)備并執(zhí)行語句

5保礼、設(shè)置循環(huán)以迭代結(jié)果(如果有)

6沛励、操作每個迭代

7责语、處理任何異常

8、處理事務(wù)

9目派、關(guān)閉連接

64坤候、Spring DAO支持

Spring中對數(shù)據(jù)訪問對象(DAO)的支持目的使人們更容易以一致的方式使用JDBC、Hibernate或JDO等數(shù)據(jù)訪問技術(shù)企蹭。這使我們可以相當(dāng)容易地在持久性技術(shù)之間切換白筹,也可以不必?fù)?dān)心捕捉每種技術(shù)特有的異常。

65谅摄、使用Spring訪問Hibernate有哪些方式徒河?

有兩種方式使用Spirng訪問Hibernate。

使用Hibernate模板和回調(diào)進(jìn)行控制反轉(zhuǎn)送漠。

擴(kuò)展HibernateDAOSupport并應(yīng)用AOP攔截器節(jié)點(diǎn)顽照。

66、Spring支持的ORM

Spring支持下面的ORM:

Hibernate

iBatis

JPA(Java持久化API)

TopLink

JDO (Java Data Objects)

OJB

67闽寡、如何使用HibernateDaoSupport集成Spring和Hibernate代兵?

用Spring的 SessionFactory 調(diào)用 LocalSessionFactory。集成過程分三步:

配置the Hibernate SessionFactory

繼承HibernateDaoSupport實(shí)現(xiàn)一個DAO

在AOP支持的事務(wù)中裝配

68爷狈、Spring支持的事務(wù)管理類型植影?

編程式事務(wù)管理:?這意味你通過編程的方式管理事務(wù),給你很大的靈活性涎永,但是難維護(hù)思币。

聲明式事務(wù)管理:?這意味著你可以將業(yè)務(wù)代碼和事務(wù)管理分離,你只需用注解和XML配置來管理事務(wù)土辩。

69支救、Spring框架的事務(wù)管理有哪些優(yōu)點(diǎn)?

它提供了跨不同事務(wù)api(如JTA拷淘、JDBC各墨、Hibernate、JPA和JDO)的一致編程模型启涯。

它為編程事務(wù)管理提供了比JTA等許多復(fù)雜事務(wù)API更簡單的API贬堵。

它支持聲明式事務(wù)管理。

它很好地集成了Spring的各種數(shù)據(jù)訪問抽象结洼。

70黎做、哪種事務(wù)管理類型更可取松忍?

大多數(shù)Spring框架的用戶選擇聲明式事務(wù)管理蒸殿,因?yàn)樗鼘?yīng)用代碼的影響最小,因此更符合一個無侵入的輕量級容器的思想。聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理宏所,雖然比編程式事務(wù)管理(這種方式允許你通過代碼控制事務(wù))少了一點(diǎn)靈活性酥艳。

Spring AOP

71、解釋AOP

面向切面編程爬骤,或AOP充石, 是一種編程技術(shù),允許程序模塊化橫向切割關(guān)注點(diǎn)霞玄,或橫切典型的責(zé)任劃分骤铃,如日志和事務(wù)管理糜芳。

72个从、AOP有哪些優(yōu)點(diǎn)脑沿?

a.它是非侵入性的

你的service/domain類被切面通知票渠,而無需在service/domain類中添加任何與spring aop相關(guān)的類或接口。

允許開發(fā)人員專注于業(yè)務(wù)代碼贰谣,而不是切點(diǎn)胀葱。

b.它是用純Java實(shí)現(xiàn)的

不需要特殊的編譯單元或特殊的類加載器

c.它使用Spring的IOC進(jìn)行依賴注入

切面可以配置為普通的spring bean。

d.與任何其他AOP框架一樣雅任,它將橫切關(guān)注點(diǎn)編織到類中,而不從這些類中調(diào)用橫切關(guān)注點(diǎn)咨跌。

e.集中或模塊化橫切關(guān)注點(diǎn)

易于維護(hù)和更改切面

改變需要在一處進(jìn)行沪么。

在你不希望有的類中有日志記錄,可以通過修改相應(yīng)切面(日志切面)中的切入點(diǎn)來輕松實(shí)現(xiàn)锌半。所以你只需要在一個地方做出改變禽车。

f.用于使用基于模式(XML配置)或@AspectJ基于注解的方式創(chuàng)建切面。

g.易于配置

73刊殉、AOP有哪些實(shí)現(xiàn)殉摔?

AOP實(shí)現(xiàn):

Spring AOP:

通過動態(tài)代理實(shí)現(xiàn)

它只支持方法級切入點(diǎn)

它是基于DTD的

Apache AspectJ:

通過aspectj java工具實(shí)現(xiàn)編譯時編織,是通過靜態(tài)代理實(shí)現(xiàn)的

它支持字段級切入點(diǎn)

它是基于模式和注解配置的

74记焊、AOP術(shù)語有哪些逸月?

切面

通知

切點(diǎn)

連接點(diǎn)

引入

目標(biāo)對象

AOP代理

織入

75、切面

AOP的核心結(jié)構(gòu)是切面遍膜,它將影響多個類的行為封裝到可重用的模塊中碗硬。提供了一組跨領(lǐng)域需求的ia模塊。例如瓢颅,一個日志模塊將被稱為AOP切面進(jìn)行日志記錄恩尾。根據(jù)需求,應(yīng)用程序可以有任意數(shù)量的切面挽懦。在spring aop中翰意,切面是使用帶有@Aspect注釋(@AspectJ樣式)注解的常規(guī)類來實(shí)現(xiàn)的。

76、連接點(diǎn)

連接點(diǎn)代表一個應(yīng)用程序的某個位置冀偶,在這個位置我們可以插入一個AOP切面虎囚,它實(shí)際上是個應(yīng)用程序執(zhí)行Spring AOP的位置。

77蔫磨、通知

通知是個在方法執(zhí)行前或執(zhí)行后要做的動作淘讥,實(shí)際上是程序執(zhí)行時要通過SpringAOP框架觸發(fā)的代碼段。

Spring切面可以應(yīng)用五種類型的通知:

before: 前置通知堤如,在一個方法執(zhí)行前被調(diào)用

after: 在方法執(zhí)行之后調(diào)用的通知蒲列,無論方法執(zhí)行是否成功

after-returning: 僅當(dāng)方法成功完成后執(zhí)行的通知

after-throwing: 在方法拋出異常退出時執(zhí)行的通知

around: 在方法執(zhí)行之前和之后調(diào)用的通知

78、切點(diǎn)

切入點(diǎn)是一個或一組連接點(diǎn)搀罢,通知將在這些位置執(zhí)行蝗岖。可以通過表達(dá)式或匹配的方式指明切入點(diǎn)榔至。

79抵赢、什么是引入?

引入允許我們在已存在的類中增加新的方法和屬性唧取。

80铅鲤、什么是目標(biāo)對象?

目標(biāo)對象是由一個或多個切面通知的對象枫弟。它將始終是一個代理對象邢享。它也被稱為通知(advised)對象。

81淡诗、什么是代理骇塘?

代理是通知目標(biāo)對象后創(chuàng)建的對象。從客戶端的角度看韩容,代理對象和目標(biāo)對象是一樣的款违。

82、有哪些不同類型的代理群凶?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Metadata autoproxying

83插爹、什么是織入。什么是織入應(yīng)用的不同點(diǎn)座掘?

織入是將切面和到其他應(yīng)用類型或?qū)ο筮B接或創(chuàng)建一個被通知對象的過程递惋。

織入可以在編譯時,加載時溢陪,或運(yùn)行時完成萍虽。

84、Spring AOP中關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)有什么區(qū)別?

關(guān)注點(diǎn)是我們希望在應(yīng)用程序的模塊中擁有的行為形真。關(guān)注點(diǎn)可以定義為我們想要實(shí)現(xiàn)的功能杉编。

橫切關(guān)注點(diǎn)是一個在整個應(yīng)用程序中都適用的關(guān)注點(diǎn)超全,它會影響整個應(yīng)用程序。例如邓馒,日志記錄嘶朱、安全性和數(shù)據(jù)傳輸是應(yīng)用程序中幾乎每個模塊都需要的關(guān)注點(diǎn),因此它們是橫切關(guān)注點(diǎn)光酣。

85疏遏、解釋基于XML Schema方式的切面實(shí)現(xiàn)

在這種情況下,切面由常規(guī)類以及基于XML的配置實(shí)現(xiàn)救军。

86财异、解釋基于注解的切面實(shí)現(xiàn)

在這種情況下(基于@AspectJ的實(shí)現(xiàn)),涉及到的切面聲明的風(fēng)格與帶有java5標(biāo)注的普通java類一致唱遭。

G.Spring Model View Controller (MVC)

87戳寸、什么是Spring MVC框架?

Spring 配備構(gòu)建Web 應(yīng)用的全功能MVC框架拷泽。Spring可以很便捷地和其他MVC框架集成疫鹊,如Struts,Spring 的MVC框架用控制反轉(zhuǎn)把業(yè)務(wù)對象和控制邏輯清晰地隔離司致。它也允許以聲明的方式把請求參數(shù)和業(yè)務(wù)對象綁定拆吆。

88、創(chuàng)建spring mvc應(yīng)用程序所需的最少配置是什么蚌吸?

為了創(chuàng)建一個簡單的Spring MVC應(yīng)用程序锈拨,我們需要做以下工作:

在項(xiàng)目中添加spring上下文和spring-webmvc依賴。在web.xml中配置DispatcherServlet來通過spring容器處理請求羹唠。

定義bean的spring bean配置文件,如果使用注解娄昆,那么必須在這里配置它佩微。我們還需要為視圖頁面配置視圖解析器。

定義用于處理客戶端請求的請求映射的控制器類萌焰。

89哺眯、說出Spring MVC請求處理的主要流程?

瀏覽器向DispatcherServlet發(fā)送請求

DispatcherServlet獲取HanderMapping并找到適當(dāng)?shù)目刂破?/p>

控制器執(zhí)行請求并將數(shù)據(jù)放入模型中扒俯,并將視圖名稱返回給DispatcherServlet奶卓。

DispatcherServlet通過視圖名稱和ViewResolver映射到對應(yīng)的視圖。

90撼玄、DispatcherServlet

Spring的MVC框架是圍繞DispatcherServlet來設(shè)計(jì)的夺姑,它用來處理所有的HTTP請求和響應(yīng)。

91掌猛、WebApplicationContext

WebApplicationContext 繼承了ApplicationContext 并增加了一些WEB應(yīng)用必備的特有功能盏浙,它不同于一般的ApplicationContext ,因?yàn)樗芴幚碇黝},并找到被關(guān)聯(lián)的servlet废膘。

92竹海、 Spring MVC中的控制器是什么?

控制器提供一個訪問應(yīng)用程序的行為丐黄,此行為通常通過服務(wù)接口實(shí)現(xiàn)斋配。控制器解析用戶輸入并將其轉(zhuǎn)換為一個由視圖呈現(xiàn)給用戶的模型灌闺。Spring用一個非常抽象的方式實(shí)現(xiàn)了一個控制層许起,允許用戶創(chuàng)建多種用途的控制器。

93菩鲜、你如何將spring mvc框架與MVC架構(gòu)聯(lián)系起來园细?

SpringMVC框架:

Spring框架是一個開源的web應(yīng)用程序框架和Java平臺的控制反轉(zhuǎn)容器。

MVC架構(gòu):

MVC(Model-View-Controller接校,簡稱MVC)是一種用于開發(fā)web應(yīng)用程序的軟件設(shè)計(jì)模式.

94猛频、Spring MVC中的ViewResolver是什么?

Spring提供了ViewResolver蛛勉,它使你能夠在瀏覽器中渲染模型鹿寻,而無需將綁定到特定的視圖技術(shù)。例如诽凌,Spring允許您使用jsp毡熏、Velocity模板和XSLT視圖。對Spring處理視圖的方式很重要的兩個接口是ViewResolver和View侣诵。ViewResolver提供視圖名稱和實(shí)際視圖之間的映射痢法。View接口處理請求的準(zhǔn)備工作,并將請求移交給某一個視圖技術(shù)杜顺。

95财搁、MultipartResolver是什么?怎么使用躬络?

spring mvc通過MultipartResolver提供多請求支持尖奔。MultipartResolver解析入站多請求。你可以通過在DispatcherServlet應(yīng)用程序上下文中注冊MultipartResolver bean來啟用多請求支持穷当。

96提茁、如何在spring mvc應(yīng)用程序中上傳文件?

Spring為通過MultipartResolver接口為上傳文件提供了內(nèi)置支持馁菜。該字段還有一個驗(yàn)證器茴扁,用于檢查上載的文件的大小是否大于零。最后只需要一個簡單的視圖火邓,其中包含一個帶有上載文件選項(xiàng)的表單丹弱。

97德撬、Spring Web MVC怎么校驗(yàn)數(shù)據(jù)?

這里有三種方式去 提供校驗(yàn) :使用注解躲胳、手動校驗(yàn)蜓洪、或者兩者混合。

98坯苹、什么是springmvc攔截器以及如何使用它隆檀?

Spring的處理程序映射機(jī)制包括處理程序攔截器,當(dāng)你希望將特定功能應(yīng)用于某些請求時粹湃,例如恐仑,檢查用戶主題時,這些攔截器非常有用为鳄。攔截器必須實(shí)現(xiàn)org.springframework.web.servlet包的HandlerInterceptor裳仆。此接口定義了三種方法:

preHandle:在執(zhí)行實(shí)際處理程序之前調(diào)用。

postHandle:在執(zhí)行完實(shí)際程序之后調(diào)用孤钦。

afterCompletion:在完成請求后調(diào)用歧斟。

擴(kuò)展

99、Spring Security是什么偏形?

Spring security 是Spring框架中最重要的模塊之一静袖。它使開發(fā)人員能夠以一種可管理的方式輕松地集成安全特性。在下面的示例中俊扭,我們將展示如何在springmvc應(yīng)用程序中實(shí)現(xiàn)Spring安全性队橙。

100、為什么要用SpringBoot?

以下是使用SpringBoot的一些好處:

自動配置萨惑,使用基于類路徑和應(yīng)用程序上下文的智能默認(rèn)值捐康,當(dāng)然也可以根據(jù)需要重寫它們以滿足開發(fā)人員的需求。

創(chuàng)建Spring Boot Starter 項(xiàng)目時咒钟,可以選擇選擇需要的功能吹由,Spring Boot將為你管理依賴關(guān)系。

SpringBoot項(xiàng)目可以打包成jar文件朱嘴。可以使用Java-jar命令從命令行將應(yīng)用程序作為獨(dú)立的Java應(yīng)用程序運(yùn)行粗合。

在開發(fā)web應(yīng)用程序時萍嬉,springboot會配置一個嵌入式Tomcat服務(wù)器,以便它可以作為獨(dú)立的應(yīng)用程序運(yùn)行隙疚。(Tomcat是默認(rèn)的壤追,當(dāng)然你也可以配置Jetty或Undertow)

SpringBoot包括許多有用的非功能特性(例如安全和健康檢查)。


結(jié)尾

以上就是從各個大廠整理的最新Spring面試題了供屉,如果對您有幫助記得點(diǎn)贊+收藏哦行冰,感謝您的支持溺蕉!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悼做,隨后出現(xiàn)的幾起案子疯特,更是在濱河造成了極大的恐慌,老刑警劉巖肛走,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漓雅,死亡現(xiàn)場離奇詭異,居然都是意外死亡朽色,警方通過查閱死者的電腦和手機(jī)邻吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葫男,“玉大人抱冷,你說我怎么就攤上這事∩液郑” “怎么了旺遮?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長利职。 經(jīng)常有香客問我趣效,道長,這世上最難降的妖魔是什么猪贪? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任跷敬,我火速辦了婚禮,結(jié)果婚禮上热押,老公的妹妹穿的比我還像新娘西傀。我一直安慰自己,他們只是感情好桶癣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布拥褂。 她就那樣靜靜地躺著,像睡著了一般牙寞。 火紅的嫁衣襯著肌膚如雪饺鹃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天间雀,我揣著相機(jī)與錄音悔详,去河邊找鬼。 笑死惹挟,一個胖子當(dāng)著我的面吹牛茄螃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播连锯,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼归苍,長吁一口氣:“原來是場噩夢啊……” “哼用狱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拼弃,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤夏伊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肴敛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體署海,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年医男,在試婚紗的時候發(fā)現(xiàn)自己被綠了砸狞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡镀梭,死狀恐怖刀森,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情报账,我是刑警寧澤研底,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站透罢,受9級特大地震影響榜晦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜羽圃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一乾胶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朽寞,春花似錦识窿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肘迎,卻和暖如春甥温,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妓布。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工窿侈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秋茫。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像乃秀,于是被迫代替她去往敵國和親肛著。 傳聞我的和親對象是個殘疾皇子圆兵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359