java框架:超詳細Spring知識點匯總

1spring框架概述

1.1什么是spring

lSpring是一個開源框架,Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架赏参,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來枣氧。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個組件抄谐,同時為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情瞧栗。然而斯稳,Spring的用途不僅限于服務(wù)器端的開發(fā)海铆。從簡單性迹恐、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益卧斟。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)殴边。簡單來說憎茂,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。

l輕量級:與EJB(enterprise javabean ,企業(yè)級javabean)對比锤岸,依賴資源少竖幔,銷毀的資源少。

l分層: 一站式是偷,每一個層都提供的解決方案

web層:struts拳氢,spring-MVC

service層:spring

dao層:hibernate,mybatis 蛋铆, jdbcTemplate

1.2spring由來

lSpring 是java平臺上的一個開源應(yīng)用框架馋评。它的第一個版本是由Rod Johnson寫出來的。Rod在他的Expert One-On-One Java EE Design and Development(Java企業(yè)應(yīng)用設(shè)計與開發(fā)的專家一對一)一書中首次發(fā)布了這個框架.

小編是一個有著5年工作經(jīng)驗的java程序員刺啦,對于java留特,自己有做資料的整合,一個完整學(xué)習(xí)java的路線玛瘸,學(xué)習(xí)資料和工具蜕青,相信這里有很多學(xué)習(xí)java的小伙伴,我創(chuàng)立了一個2000人學(xué)習(xí)扣群糊渊,479121291右核。每晚都有java的直播課程。無論是初級還是進階的小伙伴小編我都歡迎渺绒!

1.3spring核心

lSpring的核心是控制反轉(zhuǎn)(IOC: inversion of control)和面向切面(AOP: aspect oriented program)

1.4spring優(yōu)點

l方便解耦蒙兰,簡化開發(fā)(高內(nèi)聚低耦合)

?Spring就是一個大工廠(容器),可以將所有對象創(chuàng)建和依賴關(guān)系維護芒篷,交給Spring管理

?spring工廠是用于生成bean

lAOP編程的支持

?Spring提供面向切面編程搜变,可以方便的實現(xiàn)對程序進行權(quán)限攔截、運行監(jiān)控等功能

l聲明式事務(wù)的支持

?只需要通過配置就可以完成對事務(wù)的管理针炉,而無需手動編程

l方便程序的測試

?Spring對Junit4支持挠他,可以通過注解方便的測試Spring程序

l方便集成各種優(yōu)秀框架

?Spring不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對各種優(yōu)秀框架(如:Struts篡帕、Hibernate殖侵、MyBatis、Quartz等)的直接支持

l降低JavaEE API的使用難度

?Spring 對JavaEE開發(fā)中非常難用的一些API(JDBC镰烧、JavaMail拢军、遠程調(diào)用等),都提供了封裝怔鳖,使這些API應(yīng)用難度大大降低

1.5spring體系結(jié)構(gòu)

Spring框架整體被分為五個模塊:核心容器(core container), 面向切面編程(aop), 數(shù)據(jù)訪問(date access), web, test.

Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模塊保持不變

Spring的jar包大約20個,每個都有相應(yīng)的功能,一個jar還可能依賴了若干其他jar,所以搞清楚它們之間的關(guān)系,配置maven依賴就可以簡潔明了.

1.5.1 core

core部分包含4個模塊

spring-core:依賴注入IoC與DI的最基本實現(xiàn)

spring-beans:Bean工廠與bean的裝配

spring-context:spring的context上下文即IoC容器

spring-expression:spring表達式語言

它們的完整依賴關(guān)系

因為spring-core依賴了commons-logging茉唉,而其他模塊都依賴了spring-core,所以整個spring框架都依賴了commons-logging,如果有自己的日志實現(xiàn)如log4j度陆,可以排除對commons-logging的依賴艾凯,沒有日志實現(xiàn)而排除了commons-logging依賴,編譯報錯

1.5.2 aop

aop部分包含4個模塊

spring-aop:面向切面編程

spring-aspects:集成AspectJ

spring-instrument:提供一些類級的工具支持和ClassLoader級的實現(xiàn)懂傀,用于服務(wù)器

spring-instrument-tomcat:針對tomcat的instrument實現(xiàn)(包含了spring的tomcat設(shè)備代理)

它們的完整依賴關(guān)系

1.5.3 data access

data access部分包含5個模塊

spring-jdbc:jdbc的支持

spring-tx:事務(wù)控制

spring-orm:對象關(guān)系映射趾诗,集成orm框架

spring-oxm:對象xml映射

spring-jms:java消息服務(wù)

它們的完整依賴關(guān)系

1.5.4 web

web包含4個模塊

spring-web:基礎(chǔ)web功能,如文件上傳

spring-webmvc:mvc實現(xiàn)

spring-webmvc-portlet:基于portlet的mvc實現(xiàn)

spring-websocket:為web應(yīng)用提供的高效通信工具

它們的依賴關(guān)系

1.5.5 test

test部分只有一個模塊蹬蚁,我將spring-context-support也放在這里

spring-test:spring測試恃泪,提供junit與mock測試功能

spring-context-support:spring額外支持包,比如郵件服務(wù)犀斋、視圖解析等

它們的依賴關(guān)系

1.5.6 spring4新增

Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模塊保持不變.

spring-websocket:為web應(yīng)用提供的高效通信工具

spring-messaging:用于構(gòu)建基于消息的應(yīng)用程序

它們的依賴關(guān)系

2Demo1:xml方式配置IOC

2.1什么是IOC

Inversion of control(控制反轉(zhuǎn)), 從字面上來理解: 當(dāng)一個對象創(chuàng)建時, 它所依賴的對象由外部傳遞給他, 而非自己去創(chuàng)建所依賴的對象(比如通過new操作). 因此,也可以說在對象如何獲取他所依賴的對象這件事情上, 控制權(quán)反轉(zhuǎn)了.

2.2導(dǎo)入jar

l4 1(4個核心jar commons-logging依賴)

如果使用maven管理,只需要配置context

lSpring的jar結(jié)構(gòu)(字節(jié)碼.文檔.源碼)

https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework

2.3搭建項目的基本結(jié)構(gòu)

2.4創(chuàng)建配置文件

l文件名: 任意, 官方推薦使用 applicationContext.xml

l文件位置: 任意, 官方推薦放在classpath(src)下(這個叫做約定大于配置)

l配置文件內(nèi)容: 引入schema約束,配置bean

基本的IOC功能只需要引入beans約束.

約束文件的位置:

spring-framework-4.1.6.RELEASEdocsspring-framework-referencehtml\xsd-config.html

2.5測試

加載配置文件創(chuàng)建ApplicationContext上下文對象

從上下文中獲取對象

2.6IOC的底層原理

lXml解析

l工廠設(shè)計模式

l單例模式

l反射

2.7Bean實例化的三種方式

2.7.1 使用類的無參構(gòu)造函數(shù)創(chuàng)建對象(常用!重要!)

如果類中沒有顯示聲明構(gòu)造函數(shù),系統(tǒng)會為該類提供一個默認的構(gòu)造函數(shù),開發(fā)者為一個類提供了構(gòu)造函數(shù),系統(tǒng)將不再為該類提供構(gòu)造函數(shù).

如果創(chuàng)建了有參的構(gòu)造函數(shù),沒有顯示聲明無參空構(gòu)造,會拋出異常

2.7.2 使用靜態(tài)工廠創(chuàng)建對象

l需要創(chuàng)建一個工廠類,并提供一個靜態(tài)方法返回目標類的對象

lXml文件配置bean的時候class屬性需要指向工廠類的路徑,同時需要指定factory-method屬性,屬性值為工廠的靜態(tài)方法

2.7.3 使用實例工廠創(chuàng)建對象

創(chuàng)建實例工廠類,提供一個非靜態(tài)的方法返回目標類的對象

配置實例工廠bean

配置目標類bean, 配置factory-bean屬性,值指向工廠bean的id;配置factory-method屬性,值為工廠類中的get方法

2.8Bean標簽的常用屬性

lid : 給實例對象取一個名字,通過這個名字來標識一個對象,該屬性值不能包含特殊符號,一般使用首字母小寫的類名

lname(不推薦使用): 功能和id一樣,但是可以包含特殊符號,是為了整合struts框架遺留的,現(xiàn)在基本不用

lclass : 指定配置對象所在類的全限定名:包名 類名

lscope : 用于配置spring bean的作用域

singleton : 默認值,表示該對象的實例為單例(如果配置多個bean,則存在多個對象)

prototype : 多例

request: 創(chuàng)建對象并放到request作用域

session: 創(chuàng)建對象并放到session作用域

globalSession: 創(chuàng)建對象并放到globalSssion作用域

Init-method

Destroy-method

Lazy

3DI:依賴注入

3.1Dependency injection.

什么是依賴?

一個對象完成業(yè)務(wù)功能需要依賴另一個對象,比如service功能需要依賴于dao

什么是注入?

就是在獲取一個對象時,該對象所依賴的實例已經(jīng)

由spring替我們分配了

3.2屬性注入的兩種方式

set方法注入(重點掌握)

xml方式配置DI時,必須為屬性添加set方法,注解不需要

xml方式配置DI(基本類型):

xml方式配置DI(注入對象):

xml方式配置DI(復(fù)雜類型)

Xml配置文件:

名稱空間設(shè)置屬性值

Spring2.X以后提供了名稱空間p的屬性輸入方式

l第一步:引入p名稱空間

xmlns:p=''http://www.springframework.org/schema/p''

l第二步:使用p名稱空間

普通屬性: p:屬性名=””

對象類型屬性: p:屬性名-ref=””

SpEL的方式屬性注入

Spring3.X以后提供了SpEL的方式注入屬性

語法:

有參構(gòu)造函數(shù)注入(了解)

創(chuàng)建無參構(gòu)造函數(shù)

創(chuàng)建有參構(gòu)造函數(shù)

在xml文件中采用注入

4Demo2: 注解方式配置IOC

4.1導(dǎo)入jar

l4 1(4個核心jar commons-logging)

lspring-aop : 使用注解會使用到該jar

4.2創(chuàng)建類

4.3創(chuàng)建配置文件

l在demo1的基礎(chǔ)上添加context約束

l在applicationContext.xml中添加注解的配置(非常重要):

l屬性注解

如果bean的裝配使用xml,依賴的裝配使用注解,可以使用以下配置

該配置只會掃描屬性上的注解(通常是@Autowired)

4.4配置組件和DI

l在java類上添加@Component(“id”)注解(id可選),告訴spring這是一個組件,交由spring管理,這一步相當(dāng)于xml當(dāng)中的配置

l除了@Component以外還有其他幾個注解配置組件:

n@Controller

n@Service

n@Repository

l配置組件之后,如果未指定id,默認給對象配置一個類名首字母小寫的id,如果以顯式的配置了id,則默認的就不存在了

l如果有依賴,在依賴上添加@Autowired注解,使用該注解,沒有set方法也可以

l除了@Autowired,@Resource也可以用來裝配bean

@Autowired默認按類型進行裝配(該注解由spring提供),默認情況下必須要求依賴對象存在,如果要允許null值,可以設(shè)置required屬性為false,如:@Autowired(required=false);如果想要使用名稱裝配,可以結(jié)合使用@Qualifier,如:@Autowired@Qualifier(“name”);

@Resource(該注解由j2EE提供),默認按照名稱進行裝配,名稱可以通過name屬性進行指定,如果未指定name屬性,當(dāng)注解寫在字段上是,默認取字段名查找,當(dāng)找不到名稱匹配的bean時,才按照類型進行裝配.但是如果name屬性一旦指定,將只會按照名稱進行裝配

4.5測試

5AOP

5.1什么是AOP

lAOP全稱 aspect oriented program,中文名為面向切面編程.

lAOP的OOP的延續(xù),是spring框架中的一個熱點和優(yōu)勢,利用AOP可以對業(yè)務(wù)的各個部分進行隔離,從而使得業(yè)務(wù)邏輯各個部分之間的耦合度降低.提高代碼的復(fù)用性,同時提高開發(fā)效率

lAOP采取了橫向抽取的機制,取代了傳統(tǒng)縱向繼承體系的重復(fù)性代碼

l應(yīng)用場景:日志, 事務(wù)管理, 緩存, 性能檢測等

lSpring AOP 使用純java實現(xiàn),不需要專門的編譯過程和類加載器,在運行期通過動態(tài)代理的方式向目標類織入增強代碼

lAspectj 是一個基于java語言的AOP框架,從spring2.0開始,引入了對于Aspectj的支持

5.2AOP的專有名詞

ltarget : 目標類

ljoinpoint : 連接點是指所有可能織入通知的方法,理論上大部分方法都是連接點

lpointcut : 切入點, 已經(jīng)被增強(或者說織入通知)的方法

ladvice: 通知,增強的方法,比如日志,事務(wù)

laspect : 切面,是指advice和pointcut的結(jié)合

lweaving: 織入,將advice應(yīng)用到目標對象來創(chuàng)建新的代理對象的過程

6Demo3: xml方式配置AOP

6.1導(dǎo)入jar

l4 1(4個核心jar commons-logging)

lSpring的aop jar

nspring-aop > aopalliance(aop聯(lián)盟)

laspects的jar(集成aspectj)

nspring-aspects > aspectjweaver

6.2創(chuàng)建業(yè)務(wù)類和增強類

業(yè)務(wù)類:UserService

增強類:LogAspect

6.3創(chuàng)建配置文件

l添加約束:bean,aop

l配置bean

l配置aop:切點 切面

6.4測試

6.5通知的類型

lbefore:前置通知,在目標方法被調(diào)用之前調(diào)用通知功能

lafter:后置通知,在目標方法完成之后調(diào)用通知,不關(guān)心目標方法的輸出

lafter-returning:返回通知,在目標方法成功執(zhí)行之后調(diào)用通知

lafter-throwing:異常通知,在目標方法拋出異常之后執(zhí)行通知

laround:環(huán)繞通知,在調(diào)用前后都會執(zhí)行

n環(huán)繞通知接收一個參數(shù): ProceedingJoinPoint

6.6切入點表達式

lexpression=''execution(* service.UserService.addUser(..))''

[訪問修飾符] 方法返回類型 包名.類名.方法名(參數(shù))

訪問修飾符通常省略

l幾種常用寫法

7Demo4: 注解方式配置AOP

7.1導(dǎo)入jar

l4 1(4個核心jar commons-logging)

lSpring的aop jar

nspring-aop > aopalliance(aop聯(lián)盟)

laspects的jar(集成aspectj)

nspring-aspects > aspectjweaver

7.2創(chuàng)建業(yè)務(wù)類和增強類

業(yè)務(wù)類:UserService

增強類:LogAspect

7.3配置組件和切面

l創(chuàng)建配置文件

l引入約束:beans, aop, context

l配置組件的包掃描:

n

l配置開啟aop自動代理

n

l在組件上添加@Component注解

l在切面上添加@Aspect注解

l在通知類的方法上添加切入點表達式的注解

7.4測試

8JDBCTemplate

lSpring提供了用于操作JDBC的工具類,類似于DBUtils

lSpring對于不同持久化技術(shù)提供了不同的模板類

8.1回顧JDBC操作數(shù)據(jù)庫

1.加載驅(qū)動類

2.傳入?yún)?shù)信息獲取連接

3.通過連接獲取PrepareStatement對象

4.通過PrepareStatemen對象執(zhí)行sql語句

5.從ResultSet獲取結(jié)果集

8.2通過JDBCTemplate操作數(shù)據(jù)庫

8.2.1 導(dǎo)入jar

l4 1

lSpring-jdbc

lSpring-tx 事務(wù)包

lmysql.connector數(shù)據(jù)庫驅(qū)動包

8.2.2 創(chuàng)建DriverManagerDataSource對象,設(shè)置數(shù)據(jù)庫信息:驅(qū)動,數(shù)據(jù)庫地址,賬號,密碼

8.2.3 創(chuàng)建JdbcTemplate對象,設(shè)置數(shù)據(jù)源

8.2.4調(diào)用JdbcTemplate對象中的方法實現(xiàn)操作

l增(JdbcTemplate.update)

String sql = “insert into user values(null, ?, ?)”;

int row = jdbcTemplate.update(sql, “andy”, 50);

l刪(JdbcTemplate.update)

String sql = “delete from user where name=?”;

int row = jdbcTemplate.update(sql, “andy”);

l改(JdbcTemplate.update)

String sql = ''update user set age=? where name=?'';

int row = jdbcTemplate.update(sql, 18, ''jiayu'');

l查1(查詢返回某一個指定類型的值)

jdbcTemplate.queryForObject( String sql, Class requireType)

比如 select count(*) from user,返回值是int, 則第二個參數(shù)傳Integer.class

l查2(查詢一個對象)

jdbcTemplate.queryForObject(String sql, RowMapper rowMapper, Object ...args)

調(diào)用該方法,需要注意的是該方法需要傳入一個RowMapper類型的對象,spring只提供了接口,需要自己手動去實現(xiàn),寫法相當(dāng)于jdbc獲取結(jié)果當(dāng)中while(resultSet.next()){}循環(huán)體內(nèi)的部分

l查3(查詢一個對象集合)

jdbcTemplate.query(String sql, RowMapper )

8.3以配置方式注入dataSource和jdbcTemplate

9Spring的事務(wù)管理

9.1什么是事務(wù)

一組對于數(shù)據(jù)庫的操作,是最小的數(shù)據(jù)庫操作單元.要么都成功,有么都不執(zhí)行.

Mysql是支持事務(wù)的

Mysql是事務(wù)是自動提交的.

在mysql的jdbc當(dāng)中進行事務(wù)管理:

1.手動開啟事務(wù)

2.手動提交事務(wù)

3.回滾

9.2事務(wù)的特性(ACID)

原子性: 一個事務(wù)單元里面的多個數(shù)據(jù)庫操作,不可分割

隔離性: 一個事務(wù)操作不能影響其他事務(wù)

一致性:

持久性:

9.3并發(fā)事務(wù)下可能出現(xiàn)的問題

臟讀: 是一個事務(wù)讀到了另一個事務(wù)沒有提交的數(shù)據(jù)

不可重復(fù)讀: 針對的是記錄的修改操作

幻讀: 針對的是數(shù)據(jù)增刪操作

9.4解決方法:設(shè)置數(shù)據(jù)的隔離級別

讀未提交: 一個問題都沒解決

讀已提交: 解決了臟讀的問題

可重復(fù)讀: 解決了不可重復(fù)讀和臟讀的問題

串行化: 解決了所有問題..

數(shù)據(jù)庫是有默認的隔離級別的:

Mysql : 可重復(fù)讀

Oracle: 讀已提交

9.5JDBC當(dāng)中的事務(wù)處理

開啟事務(wù)

Connection.setAutoCommit(false)

提交事務(wù)

Connection.commit()

事務(wù)回滾

Connection.rollback()

9.6Spring當(dāng)中的事務(wù)處理

平臺事務(wù)管理器:

PlatformTransactionManager

9.7三種事務(wù)處理方案

1.編程式事務(wù)

2.聲明式事務(wù)

2.1 xml方式配置事務(wù)

2.2注解方式配置事務(wù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悟泵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闪水,更是在濱河造成了極大的恐慌糕非,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件球榆,死亡現(xiàn)場離奇詭異朽肥,居然都是意外死亡,警方通過查閱死者的電腦和手機持钉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門衡招,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人每强,你說我怎么就攤上這事始腾。” “怎么了空执?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵浪箭,是天一觀的道長。 經(jīng)常有香客問我辨绊,道長奶栖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任门坷,我火速辦了婚禮宣鄙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘默蚌。我一直安慰自己冻晤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布绸吸。 她就那樣靜靜地躺著鼻弧,像睡著了一般设江。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上温数,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音蜻势,去河邊找鬼撑刺。 笑死,一個胖子當(dāng)著我的面吹牛握玛,可吹牛的內(nèi)容都是我干的够傍。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼挠铲,長吁一口氣:“原來是場噩夢啊……” “哼冕屯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拂苹,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤安聘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓢棒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浴韭,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年脯宿,在試婚紗的時候發(fā)現(xiàn)自己被綠了念颈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡连霉,死狀恐怖榴芳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跺撼,我是刑警寧澤窟感,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站歉井,受9級特大地震影響肌括,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酣难,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一谍夭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憨募,春花似錦紧索、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晚缩。三九已至,卻和暖如春媳危,著一層夾襖步出監(jiān)牢的瞬間荞彼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工待笑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸣皂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓暮蹂,卻偏偏與公主長得像寞缝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仰泻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容