国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

32 道 Spring 常見面試題!萬(wàn)字總結(jié)!

共 24570字,需瀏覽 50分鐘

 ·

2022-07-31 11:48

你好,我是 Guide。昨晚,我對(duì) JavaGuide 上的 Spring 面試題部分的內(nèi)容進(jìn)行了重構(gòu)完善,公眾號(hào)同步一下最新更新,希望能夠幫助你。

你也可以在網(wǎng)站(javaguide.cn)上在線閱讀,閱讀體驗(yàn)會(huì)更好!

Spring 基礎(chǔ)

什么是 Spring 框架?

Spring 是一款開源的輕量級(jí) Java 開發(fā)框架,旨在提高開發(fā)人員的開發(fā)效率以及系統(tǒng)的可維護(hù)性。

我們一般說(shuō) Spring 框架指的都是 Spring Framework,它是很多模塊的集合,使用這些模塊可以很方便地協(xié)助我們進(jìn)行開發(fā),比如說(shuō) Spring 支持 IoC(Inverse of Control:控制反轉(zhuǎn)) 和 AOP(Aspect-Oriented Programming:面向切面編程)、可以很方便地對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)、可以很方便地集成第三方組件(電子郵件,任務(wù),調(diào)度,緩存等等)、對(duì)單元測(cè)試支持比較好、支持 RESTful Java 應(yīng)用程序的開發(fā)。

Spring 最核心的思想就是不重新造輪子,開箱即用,提高開發(fā)效率。

Spring 翻譯過(guò)來(lái)就是春天的意思,可見其目標(biāo)和使命就是為 Java 程序員帶來(lái)春天?。「袆?dòng)!

?? 多提一嘴 :語(yǔ)言的流行通常需要一個(gè)殺手級(jí)的應(yīng)用,Spring 就是 Java 生態(tài)的一個(gè)殺手級(jí)的應(yīng)用框架。

Spring 提供的核心功能主要是 IoC 和 AOP。學(xué)習(xí) Spring ,一定要把 IoC 和 AOP 的核心思想搞懂!

  • Spring 官網(wǎng):https://spring.io/
  • Github 地址:https://github.com/spring-projects/spring-framework

Spring 包含的模塊有哪些?

Spring4.x 版本

Spring4.x主要模塊

Spring5.x 版本

Spring5.x主要模塊

Spring5.x 版本中 Web 模塊的 Portlet 組件已經(jīng)被廢棄掉,同時(shí)增加了用于異步響應(yīng)式處理的 WebFlux 組件。

Spring 各個(gè)模塊的依賴關(guān)系如下:

Spring 各個(gè)模塊的依賴關(guān)系

Core Container

Spring 框架的核心模塊,也可以說(shuō)是基礎(chǔ)模塊,主要提供 IoC 依賴注入功能的支持。Spring 其他所有的功能基本都需要依賴于該模塊,我們從上面那張 Spring 各個(gè)模塊的依賴關(guān)系圖就可以看出來(lái)。

  • spring-core :Spring 框架基本的核心工具類。
  • spring-beans :提供對(duì) bean 的創(chuàng)建、配置和管理等功能的支持。
  • spring-context :提供對(duì)國(guó)際化、事件傳播、資源加載等功能的支持。
  • spring-expression :提供對(duì)表達(dá)式語(yǔ)言(Spring Expression Language) SpEL 的支持,只依賴于 core 模塊,不依賴于其他模塊,可以單獨(dú)使用。

AOP

  • spring-aspects :該模塊為與 AspectJ 的集成提供支持。
  • spring-aop :提供了面向切面的編程實(shí)現(xiàn)。
  • spring-instrument :提供了為 JVM 添加代理(agent)的功能。具體來(lái)講,它為 Tomcat 提供了一個(gè)織入代理,能夠?yàn)?Tomcat 傳遞類文 件,就像這些文件是被類加載器加載的一樣。沒(méi)有理解也沒(méi)關(guān)系,這個(gè)模塊的使用場(chǎng)景非常有限。

Data Access/Integration

  • spring-jdbc :提供了對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的抽象 JDBC。不同的數(shù)據(jù)庫(kù)都有自己獨(dú)立的 API 用于操作數(shù)據(jù)庫(kù),而 Java 程序只需要和 JDBC API 交互,這樣就屏蔽了數(shù)據(jù)庫(kù)的影響。
  • spring-tx :提供對(duì)事務(wù)的支持。
  • spring-orm :提供對(duì) Hibernate、JPA 、iBatis 等 ORM 框架的支持。
  • spring-oxm :提供一個(gè)抽象層支撐 OXM(Object-to-XML-Mapping),例如:JAXB、Castor、XMLBeans、JiBX 和 XStream 等。
  • spring-jms : 消息服務(wù)。自 Spring Framework 4.1 以后,它還提供了對(duì) spring-messaging 模塊的繼承。

Spring Web

  • spring-web :對(duì) Web 功能的實(shí)現(xiàn)提供一些最基礎(chǔ)的支持。
  • spring-webmvc :提供對(duì) Spring MVC 的實(shí)現(xiàn)。
  • spring-websocket :提供了對(duì) WebSocket 的支持,WebSocket 可以讓客戶端和服務(wù)端進(jìn)行雙向通信。
  • spring-webflux :提供對(duì) WebFlux 的支持。WebFlux 是 Spring Framework 5.0 中引入的新的響應(yīng)式框架。與 Spring MVC 不同,它不需要 Servlet API,是完全異步。

Messaging

spring-messaging 是從 Spring4.0 開始新加入的一個(gè)模塊,主要職責(zé)是為 Spring 框架集成一些基礎(chǔ)的報(bào)文傳送應(yīng)用。

Spring Test

Spring 團(tuán)隊(duì)提倡測(cè)試驅(qū)動(dòng)開發(fā)(TDD)。有了控制反轉(zhuǎn) (IoC)的幫助,單元測(cè)試和集成測(cè)試變得更簡(jiǎn)單。

Spring 的測(cè)試模塊對(duì) JUnit(單元測(cè)試框架)、TestNG(類似 JUnit)、Mockito(主要用來(lái) Mock 對(duì)象)、PowerMock(解決 Mockito 的問(wèn)題比如無(wú)法模擬 final, static, private 方法)等等常用的測(cè)試框架支持的都比較好。

Spring,Spring MVC,Spring Boot 之間什么關(guān)系?

很多人對(duì) Spring,Spring MVC,Spring Boot 這三者傻傻分不清楚!這里簡(jiǎn)單介紹一下這三者,其實(shí)很簡(jiǎn)單,沒(méi)有什么高深的東西。

Spring 包含了多個(gè)功能模塊(上面剛剛提高過(guò)),其中最重要的是 Spring-Core(主要提供 IoC 依賴注入功能的支持) 模塊, Spring 中的其他模塊(比如 Spring MVC)的功能實(shí)現(xiàn)基本都需要依賴于該模塊。

下圖對(duì)應(yīng)的是 Spring4.x 版本。目前最新的 5.x 版本中 Web 模塊的 Portlet 組件已經(jīng)被廢棄掉,同時(shí)增加了用于異步響應(yīng)式處理的 WebFlux 組件。

Spring主要模塊

Spring MVC 是 Spring 中的一個(gè)很重要的模塊,主要賦予 Spring 快速構(gòu)建 MVC 架構(gòu)的 Web 程序的能力。MVC 是模型(Model)、視圖(View)、控制器(Controller)的簡(jiǎn)寫,其核心思想是通過(guò)將業(yè)務(wù)邏輯、數(shù)據(jù)、顯示分離來(lái)組織代碼。

使用 Spring 進(jìn)行開發(fā)各種配置過(guò)于麻煩比如開啟某些 Spring 特性時(shí),需要用 XML 或 Java 進(jìn)行顯式配置。于是,Spring Boot 誕生了!

Spring 旨在簡(jiǎn)化 J2EE 企業(yè)應(yīng)用程序開發(fā)。Spring Boot 旨在簡(jiǎn)化 Spring 開發(fā)(減少配置文件,開箱即用!)。

Spring Boot 只是簡(jiǎn)化了配置,如果你需要構(gòu)建 MVC 架構(gòu)的 Web 程序,你還是需要使用 Spring MVC 作為 MVC 框架,只是說(shuō) Spring Boot 幫你簡(jiǎn)化了 Spring MVC 的很多配置,真正做到開箱即用!

Spring IoC

談?wù)勛约簩?duì)于 Spring IoC 的了解

IoC(Inverse of Control:控制反轉(zhuǎn)) 是一種設(shè)計(jì)思想,而不是一個(gè)具體的技術(shù)實(shí)現(xiàn)。IoC 的思想就是將原本在程序中手動(dòng)創(chuàng)建對(duì)象的控制權(quán),交由 Spring 框架來(lái)管理。不過(guò), IoC 并非 Spring 特有,在其他語(yǔ)言中也有應(yīng)用。

為什么叫控制反轉(zhuǎn)?

  • 控制 :指的是對(duì)象創(chuàng)建(實(shí)例化、管理)的權(quán)力
  • 反轉(zhuǎn) :控制權(quán)交給外部環(huán)境(Spring 框架、IoC 容器)

將對(duì)象之間的相互依賴關(guān)系交給 IoC 容器來(lái)管理,并由 IoC 容器完成對(duì)象的注入。這樣可以很大程度上簡(jiǎn)化應(yīng)用的開發(fā),把應(yīng)用從復(fù)雜的依賴關(guān)系中解放出來(lái)。IoC 容器就像是一個(gè)工廠一樣,當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)對(duì)象的時(shí)候,只需要配置好配置文件/注解即可,完全不用考慮對(duì)象是如何被創(chuàng)建出來(lái)的。

在實(shí)際項(xiàng)目中一個(gè) Service 類可能依賴了很多其他的類,假如我們需要實(shí)例化這個(gè) Service,你可能要每次都要搞清這個(gè) Service 所有底層類的構(gòu)造函數(shù),這可能會(huì)把人逼瘋。如果利用 IoC 的話,你只需要配置好,然后在需要的地方引用就行了,這大大增加了項(xiàng)目的可維護(hù)性且降低了開發(fā)難度。

在 Spring 中, IoC 容器是 Spring 用來(lái)實(shí)現(xiàn) IoC 的載體, IoC 容器實(shí)際上就是個(gè) Map(key,value),Map 中存放的是各種對(duì)象。

Spring 時(shí)代我們一般通過(guò) XML 文件來(lái)配置 Bean,后來(lái)開發(fā)人員覺(jué)得 XML 文件來(lái)配置不太好,于是 SpringBoot 注解配置就慢慢開始流行起來(lái)。

相關(guān)閱讀:

什么是 Spring Bean?

簡(jiǎn)單來(lái)說(shuō),Bean 代指的就是那些被 IoC 容器所管理的對(duì)象。

我們需要告訴 IoC 容器幫助我們管理哪些對(duì)象,這個(gè)是通過(guò)配置元數(shù)據(jù)來(lái)定義的。配置元數(shù)據(jù)可以是 XML 文件、注解或者 Java 配置類。

<!-- Constructor-arg with 'value' attribute -->
<bean id="..." class="...">
   <constructor-arg value="..."/>
</bean>

下圖簡(jiǎn)單地展示了 IoC 容器如何使用配置元數(shù)據(jù)來(lái)管理對(duì)象。

org.springframework.beansorg.springframework.context 這兩個(gè)包是 IoC 實(shí)現(xiàn)的基礎(chǔ),如果想要研究 IoC 相關(guān)的源碼的話,可以去看看

將一個(gè)類聲明為 Bean 的注解有哪些?

  • @Component :通用的注解,可標(biāo)注任意類為 Spring 組件。如果一個(gè) Bean 不知道屬于哪個(gè)層,可以使用@Component 注解標(biāo)注。
  • @Repository : 對(duì)應(yīng)持久層即 Dao 層,主要用于數(shù)據(jù)庫(kù)相關(guān)操作。
  • @Service : 對(duì)應(yīng)服務(wù)層,主要涉及一些復(fù)雜的邏輯,需要用到 Dao 層。
  • @Controller : 對(duì)應(yīng) Spring MVC 控制層,主要用戶接受用戶請(qǐng)求并調(diào)用 Service 層返回?cái)?shù)據(jù)給前端頁(yè)面。

@Component 和 @Bean 的區(qū)別是什么?

  • @Component 注解作用于類,而@Bean注解作用于方法。
  • @Component通常是通過(guò)類路徑掃描來(lái)自動(dòng)偵測(cè)以及自動(dòng)裝配到 Spring 容器中(我們可以使用 @ComponentScan 注解定義要掃描的路徑從中找出標(biāo)識(shí)了需要裝配的類自動(dòng)裝配到 Spring 的 bean 容器中)。@Bean 注解通常是我們?cè)跇?biāo)有該注解的方法中定義產(chǎn)生這個(gè) bean,@Bean告訴了 Spring 這是某個(gè)類的實(shí)例,當(dāng)我需要用它的時(shí)候還給我。
  • @Bean 注解比 @Component 注解的自定義性更強(qiáng),而且很多地方我們只能通過(guò) @Bean 注解來(lái)注冊(cè) bean。比如當(dāng)我們引用第三方庫(kù)中的類需要裝配到 Spring容器時(shí),則只能通過(guò) @Bean來(lái)實(shí)現(xiàn)。

@Bean注解使用示例:

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }

}

上面的代碼相當(dāng)于下面的 xml 配置

<beans>
    <bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

下面這個(gè)例子是通過(guò) @Component 無(wú)法實(shí)現(xiàn)的。

@Bean
public OneService getService(status) {
    case (status)  {
        when 1:
                return new serviceImpl1();
        when 2:
                return new serviceImpl2();
        when 3:
                return new serviceImpl3();
    }
}

注入 Bean 的注解有哪些?

Spring 內(nèi)置的 @Autowired 以及 JDK 內(nèi)置的 @Resource@Inject 都可以用于注入 Bean。

AnnotaionPackageSource
@Autowiredorg.springframework.bean.factorySpring 2.5+
@Resourcejavax.annotationJava JSR-250
@Injectjavax.injectJava JSR-330

@Autowired@Resource使用的比較多一些。

@Autowired 和 @Resource 的區(qū)別是什么?

Autowired 屬于 Spring 內(nèi)置的注解,默認(rèn)的注入方式為byType(根據(jù)類型進(jìn)行匹配),也就是說(shuō)會(huì)優(yōu)先根據(jù)接口類型去匹配并注入 Bean (接口的實(shí)現(xiàn)類)。

這會(huì)有什么問(wèn)題呢? 當(dāng)一個(gè)接口存在多個(gè)實(shí)現(xiàn)類的話,byType這種方式就無(wú)法正確注入對(duì)象了,因?yàn)檫@個(gè)時(shí)候 Spring 會(huì)同時(shí)找到多個(gè)滿足條件的選擇,默認(rèn)情況下它自己不知道選擇哪一個(gè)。

這種情況下,注入方式會(huì)變?yōu)?byName(根據(jù)名稱進(jìn)行匹配),這個(gè)名稱通常就是類名(首字母小寫)。就比如說(shuō)下面代碼中的 smsService 就是我這里所說(shuō)的名稱,這樣應(yīng)該比較好理解了吧。

// smsService 就是我們上面所說(shuō)的名稱
@Autowired
private SmsService smsService;

舉個(gè)例子,SmsService 接口有兩個(gè)實(shí)現(xiàn)類: SmsServiceImpl1SmsServiceImpl2,且它們都已經(jīng)被 Spring 容器所管理。

// 報(bào)錯(cuò),byName 和 byType 都無(wú)法匹配到 bean
@Autowired
private SmsService smsService;
// 正確注入 SmsServiceImpl1 對(duì)象對(duì)應(yīng)的 bean
@Autowired
private SmsService smsServiceImpl1;
// 正確注入  SmsServiceImpl1 對(duì)象對(duì)應(yīng)的 bean
// smsServiceImpl1 就是我們上面所說(shuō)的名稱
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;

我們還是建議通過(guò) @Qualifier 注解來(lái)顯示指定名稱而不是依賴變量的名稱。

@Resource屬于 JDK 提供的注解,默認(rèn)注入方式為 byName。如果無(wú)法通過(guò)名稱匹配到對(duì)應(yīng)的 Bean 的話,注入方式會(huì)變?yōu)?code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #2980B9;background: ECF0F1;">byType。

@Resource 有兩個(gè)比較重要且日常開發(fā)常用的屬性:name(名稱)、type(類型)。

public @interface Resource {
    String name() default "";
    Class<?> type() default Object.class;
}

如果僅指定 name 屬性則注入方式為byName,如果僅指定type屬性則注入方式為byType,如果同時(shí)指定nametype屬性(不建議這么做)則注入方式為byType+byName。

// 報(bào)錯(cuò),byName 和 byType 都無(wú)法匹配到 bean
@Resource
private SmsService smsService;
// 正確注入 SmsServiceImpl1 對(duì)象對(duì)應(yīng)的 bean
@Resource
private SmsService smsServiceImpl1;
// 正確注入 SmsServiceImpl1 對(duì)象對(duì)應(yīng)的 bean(比較推薦這種方式)
@Resource(name = "smsServiceImpl1")
private SmsService smsService;

簡(jiǎn)單總結(jié)一下:

  • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
  • Autowired 默認(rèn)的注入方式為byType(根據(jù)類型進(jìn)行匹配),@Resource默認(rèn)注入方式為 byName(根據(jù)名稱進(jìn)行匹配)。
  • 當(dāng)一個(gè)接口存在多個(gè)實(shí)現(xiàn)類的情況下,@Autowired@Resource都需要通過(guò)名稱才能正確匹配到對(duì)應(yīng)的 Bean。Autowired 可以通過(guò) @Qualifier 注解來(lái)顯示指定名稱,@Resource可以通過(guò) name 屬性來(lái)顯示指定名稱。

Bean 的作用域有哪些?

Spring 中 Bean 的作用域通常有下面幾種:

  • singleton : IoC 容器中只有唯一的 bean 實(shí)例。Spring 中的 bean 默認(rèn)都是單例的,是對(duì)單例設(shè)計(jì)模式的應(yīng)用。
  • prototype : 每次獲取都會(huì)創(chuàng)建一個(gè)新的 bean 實(shí)例。也就是說(shuō),連續(xù) getBean() 兩次,得到的是不同的 Bean 實(shí)例。
  • request (僅 Web 應(yīng)用可用): 每一次 HTTP 請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的 bean(請(qǐng)求 bean),該 bean 僅在當(dāng)前 HTTP request 內(nèi)有效。
  • session (僅 Web 應(yīng)用可用) : 每一次來(lái)自新 session 的 HTTP 請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的 bean(會(huì)話 bean),該 bean 僅在當(dāng)前 HTTP session 內(nèi)有效。
  • application/global-session (僅 Web 應(yīng)用可用):每個(gè) Web 應(yīng)用在啟動(dòng)時(shí)創(chuàng)建一個(gè) Bean(應(yīng)用 Bean),,該 bean 僅在當(dāng)前應(yīng)用啟動(dòng)時(shí)間內(nèi)有效。
  • websocket (僅 Web 應(yīng)用可用):每一次 WebSocket 會(huì)話產(chǎn)生一個(gè)新的 bean。

如何配置 bean 的作用域呢?

xml 方式:

<bean id="..." class="..." scope="singleton"></bean>

注解方式:

@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {
    return new Person();
}

單例 Bean 的線程安全問(wèn)題了解嗎?

大部分時(shí)候我們并沒(méi)有在項(xiàng)目中使用多線程,所以很少有人會(huì)關(guān)注這個(gè)問(wèn)題。單例 Bean 存在線程問(wèn)題,主要是因?yàn)楫?dāng)多個(gè)線程操作同一個(gè)對(duì)象的時(shí)候是存在資源競(jìng)爭(zhēng)的。

常見的有兩種解決辦法:

  1. 在 Bean 中盡量避免定義可變的成員變量。
  2. 在類中定義一個(gè) ThreadLocal 成員變量,將需要的可變成員變量保存在 ThreadLocal 中(推薦的一種方式)。

不過(guò),大部分 Bean 實(shí)際都是無(wú)狀態(tài)(沒(méi)有實(shí)例變量)的(比如 Dao、Service),這種情況下, Bean 是線程安全的。

Bean 的生命周期了解么?

下面的內(nèi)容整理自:https://yemengying.com/2016/07/14/spring-bean-life-cycle/ ,除了這篇文章,再推薦一篇很不錯(cuò)的文章 :https://www.cnblogs.com/zrtqsk/p/3735273.html 。

  • Bean 容器找到配置文件中 Spring Bean 的定義。
  • Bean 容器利用 Java Reflection API 創(chuàng)建一個(gè) Bean 的實(shí)例。
  • 如果涉及到一些屬性值 利用 set()方法設(shè)置一些屬性值。
  • 如果 Bean 實(shí)現(xiàn)了 BeanNameAware 接口,調(diào)用 setBeanName()方法,傳入 Bean 的名字。
  • 如果 Bean 實(shí)現(xiàn)了 BeanClassLoaderAware 接口,調(diào)用 setBeanClassLoader()方法,傳入 ClassLoader對(duì)象的實(shí)例。
  • 如果 Bean 實(shí)現(xiàn)了 BeanFactoryAware 接口,調(diào)用 setBeanFactory()方法,傳入 BeanFactory對(duì)象的實(shí)例。
  • 與上面的類似,如果實(shí)現(xiàn)了其他 *.Aware接口,就調(diào)用相應(yīng)的方法。
  • 如果有和加載這個(gè) Bean 的 Spring 容器相關(guān)的 BeanPostProcessor 對(duì)象,執(zhí)行postProcessBeforeInitialization() 方法
  • 如果 Bean 實(shí)現(xiàn)了InitializingBean接口,執(zhí)行afterPropertiesSet()方法。
  • 如果 Bean 在配置文件中的定義包含 init-method 屬性,執(zhí)行指定的方法。
  • 如果有和加載這個(gè) Bean 的 Spring 容器相關(guān)的 BeanPostProcessor 對(duì)象,執(zhí)行postProcessAfterInitialization() 方法
  • 當(dāng)要銷毀 Bean 的時(shí)候,如果 Bean 實(shí)現(xiàn)了 DisposableBean 接口,執(zhí)行 destroy() 方法。
  • 當(dāng)要銷毀 Bean 的時(shí)候,如果 Bean 在配置文件中的定義包含 destroy-method 屬性,執(zhí)行指定的方法。

圖示:

Spring Bean 生命周期

與之比較類似的中文版本:

Spring Bean 生命周期

Spring AoP

談?wù)勛约簩?duì)于 AOP 的了解

AOP(Aspect-Oriented Programming:面向切面編程)能夠?qū)⒛切┡c業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任(例如事務(wù)處理、日志管理、權(quán)限控制等)封裝起來(lái),便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來(lái)的可拓展性和可維護(hù)性。

Spring AOP 就是基于動(dòng)態(tài)代理的,如果要代理的對(duì)象,實(shí)現(xiàn)了某個(gè)接口,那么 Spring AOP 會(huì)使用 JDK Proxy,去創(chuàng)建代理對(duì)象,而對(duì)于沒(méi)有實(shí)現(xiàn)接口的對(duì)象,就無(wú)法使用 JDK Proxy 去進(jìn)行代理了,這時(shí)候 Spring AOP 會(huì)使用 Cglib 生成一個(gè)被代理對(duì)象的子類來(lái)作為代理,如下圖所示:

SpringAOPProcess

當(dāng)然你也可以使用 AspectJ !Spring AOP 已經(jīng)集成了 AspectJ ,AspectJ 應(yīng)該算的上是 Java 生態(tài)系統(tǒng)中最完整的 AOP 框架了。

AOP 切面編程設(shè)計(jì)到的一些專業(yè)術(shù)語(yǔ):

術(shù)語(yǔ)含義
目標(biāo)(Target)被通知的對(duì)象
代理(Proxy)向目標(biāo)對(duì)象應(yīng)用通知之后創(chuàng)建的代理對(duì)象
連接點(diǎn)(JoinPoint)目標(biāo)對(duì)象的所屬類中,定義的所有方法均為連接點(diǎn)
切入點(diǎn)(Pointcut)被切面攔截 / 增強(qiáng)的連接點(diǎn)(切入點(diǎn)一定是連接點(diǎn),連接點(diǎn)不一定是切入點(diǎn))
通知(Advice)增強(qiáng)的邏輯 / 代碼,也即攔截到目標(biāo)對(duì)象的連接點(diǎn)之后要做的事情
切面(Aspect)切入點(diǎn)(Pointcut)+通知(Advice)
Weaving(織入)將通知應(yīng)用到目標(biāo)對(duì)象,進(jìn)而生成代理對(duì)象的過(guò)程動(dòng)作

Spring AOP 和 AspectJ AOP 有什么區(qū)別?

Spring AOP 屬于運(yùn)行時(shí)增強(qiáng),而 AspectJ 是編譯時(shí)增強(qiáng)。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字節(jié)碼操作(Bytecode Manipulation)。

Spring AOP 已經(jīng)集成了 AspectJ ,AspectJ 應(yīng)該算的上是 Java 生態(tài)系統(tǒng)中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加強(qiáng)大,但是 Spring AOP 相對(duì)來(lái)說(shuō)更簡(jiǎn)單,

如果我們的切面比較少,那么兩者性能差異不大。但是,當(dāng)切面太多的話,最好選擇 AspectJ ,它比 Spring AOP 快很多。

AspectJ 定義的通知類型有哪些?

  • Before(前置通知):目標(biāo)對(duì)象的方法調(diào)用之前觸發(fā)
  • After (后置通知):目標(biāo)對(duì)象的方法調(diào)用之后觸發(fā)
  • AfterReturning(返回通知):目標(biāo)對(duì)象的方法調(diào)用完成,在返回結(jié)果值之后觸發(fā)
  • AfterThrowing(異常通知) :目標(biāo)對(duì)象的方法運(yùn)行中拋出 / 觸發(fā)異常后觸發(fā)。AfterReturning 和 AfterThrowing 兩者互斥。如果方法調(diào)用成功無(wú)異常,則會(huì)有返回值;如果方法拋出了異常,則不會(huì)有返回值。
  • Around:(環(huán)繞通知)編程式控制目標(biāo)對(duì)象的方法調(diào)用。環(huán)繞通知是所有通知類型中可操作范圍最大的一種,因?yàn)樗梢灾苯幽玫侥繕?biāo)對(duì)象,以及要執(zhí)行的方法,所以環(huán)繞通知可以任意的在目標(biāo)對(duì)象的方法調(diào)用前后搞事,甚至不調(diào)用目標(biāo)對(duì)象的方法

多個(gè)切面的執(zhí)行順序如何控制?

1、通常使用@Order 注解直接定義切面順序

// 值越小優(yōu)先級(jí)越高
@Order(3)
@Component
@Aspect
public class LoggingAspect implements Ordered {

2、實(shí)現(xiàn)Ordered 接口重寫 getOrder 方法。

@Component
@Aspect
public class LoggingAspect implements Ordered {

    // ....

    @Override
    public int getOrder() {
        // 返回值越小優(yōu)先級(jí)越高
        return 1;
    }
}

Spring MVC

說(shuō)說(shuō)自己對(duì)于 Spring MVC 了解?

MVC 是模型(Model)、視圖(View)、控制器(Controller)的簡(jiǎn)寫,其核心思想是通過(guò)將業(yè)務(wù)邏輯、數(shù)據(jù)、顯示分離來(lái)組織代碼。

網(wǎng)上有很多人說(shuō) MVC 不是設(shè)計(jì)模式,只是軟件設(shè)計(jì)規(guī)范,我個(gè)人更傾向于 MVC 同樣是眾多設(shè)計(jì)模式中的一種。**java-design-patterns** 項(xiàng)目中就有關(guān)于 MVC 的相關(guān)介紹。

想要真正理解 Spring MVC,我們先來(lái)看看 Model 1 和 Model 2 這兩個(gè)沒(méi)有 Spring MVC 的時(shí)代。

Model 1 時(shí)代

很多學(xué) Java 后端比較晚的朋友可能并沒(méi)有接觸過(guò) Model 1 時(shí)代下的 JavaWeb 應(yīng)用開發(fā)。在 Model1 模式下,整個(gè) Web 應(yīng)用幾乎全部用 JSP 頁(yè)面組成,只用少量的 JavaBean 來(lái)處理數(shù)據(jù)庫(kù)連接、訪問(wèn)等操作。

這個(gè)模式下 JSP 即是控制層(Controller)又是表現(xiàn)層(View)。顯而易見,這種模式存在很多問(wèn)題。比如控制邏輯和表現(xiàn)邏輯混雜在一起,導(dǎo)致代碼重用率極低;再比如前端和后端相互依賴,難以進(jìn)行測(cè)試維護(hù)并且開發(fā)效率極低。

mvc-mode1

Model 2 時(shí)代

學(xué)過(guò) Servlet 并做過(guò)相關(guān) Demo 的朋友應(yīng)該了解“Java Bean(Model)+ JSP(View)+Servlet(Controller) ”這種開發(fā)模式,這就是早期的 JavaWeb MVC 開發(fā)模式。

  • Model:系統(tǒng)涉及的數(shù)據(jù),也就是 dao 和 bean。
  • View:展示模型中的數(shù)據(jù),只是用來(lái)展示。
  • Controller:處理用戶請(qǐng)求都發(fā)送給 ,返回?cái)?shù)據(jù)給 JSP 并展示給用戶。

Model2 模式下還存在很多問(wèn)題,Model2 的抽象和封裝程度還遠(yuǎn)遠(yuǎn)不夠,使用 Model2 進(jìn)行開發(fā)時(shí)不可避免地會(huì)重復(fù)造輪子,這就大大降低了程序的可維護(hù)性和復(fù)用性。

于是,很多 JavaWeb 開發(fā)相關(guān)的 MVC 框架應(yīng)運(yùn)而生比如 Struts2,但是 Struts2 比較笨重。

Spring MVC 時(shí)代

隨著 Spring 輕量級(jí)開發(fā)框架的流行,Spring 生態(tài)圈出現(xiàn)了 Spring MVC 框架, Spring MVC 是當(dāng)前最優(yōu)秀的 MVC 框架。相比于 Struts2 , Spring MVC 使用更加簡(jiǎn)單和方便,開發(fā)效率更高,并且 Spring MVC 運(yùn)行速度更快。

MVC 是一種設(shè)計(jì)模式,Spring MVC 是一款很優(yōu)秀的 MVC 框架。Spring MVC 可以幫助我們進(jìn)行更簡(jiǎn)潔的 Web 層的開發(fā),并且它天生與 Spring 框架集成。Spring MVC 下我們一般把后端項(xiàng)目分為 Service 層(處理業(yè)務(wù))、Dao 層(數(shù)據(jù)庫(kù)操作)、Entity 層(實(shí)體類)、Controller 層(控制層,返回?cái)?shù)據(jù)給前臺(tái)頁(yè)面)。

Spring MVC 的核心組件有哪些?

記住了下面這些組件,也就記住了 SpringMVC 的工作原理。

  • DispatcherServlet核心的中央處理器,負(fù)責(zé)接收請(qǐng)求、分發(fā),并給予客戶端響應(yīng)。
  • HandlerMapping處理器映射器,根據(jù) uri 去匹配查找能處理的 Handler ,并會(huì)將請(qǐng)求涉及到的攔截器和 Handler 一起封裝。
  • HandlerAdapter處理器適配器,根據(jù) HandlerMapping 找到的 Handler ,適配執(zhí)行對(duì)應(yīng)的 Handler
  • Handler請(qǐng)求處理器,處理實(shí)際請(qǐng)求的處理器。
  • ViewResolver視圖解析器,根據(jù) Handler 返回的邏輯視圖 / 視圖,解析并渲染真正的視圖,并傳遞給 DispatcherServlet 響應(yīng)客戶端

SpringMVC 工作原理了解嗎?

Spring MVC 原理如下圖所示:

SpringMVC 工作原理的圖解我沒(méi)有自己畫,直接圖省事在網(wǎng)上找了一個(gè)非常清晰直觀的,原出處不明。

流程說(shuō)明(重要):

  1. 客戶端(瀏覽器)發(fā)送請(qǐng)求, DispatcherServlet攔截請(qǐng)求。
  2. DispatcherServlet 根據(jù)請(qǐng)求信息調(diào)用 HandlerMappingHandlerMapping 根據(jù) uri 去匹配查找能處理的 Handler(也就是我們平常說(shuō)的 Controller 控制器) ,并會(huì)將請(qǐng)求涉及到的攔截器和 Handler 一起封裝。
  3. DispatcherServlet 調(diào)用 HandlerAdapter適配執(zhí)行 Handler
  4. Handler 完成對(duì)用戶請(qǐng)求的處理后,會(huì)返回一個(gè) ModelAndView 對(duì)象給DispatcherServletModelAndView 顧名思義,包含了數(shù)據(jù)模型以及相應(yīng)的視圖的信息。Model 是返回的數(shù)據(jù)對(duì)象,View 是個(gè)邏輯上的 View。
  5. ViewResolver 會(huì)根據(jù)邏輯 View 查找實(shí)際的 View
  6. DispaterServlet 把返回的 Model 傳給 View(視圖渲染)。
  7. View 返回給請(qǐng)求者(瀏覽器)

統(tǒng)一異常處理怎么做?

推薦使用注解的方式統(tǒng)一異常處理,具體會(huì)使用到 @ControllerAdvice + @ExceptionHandler 這兩個(gè)注解 。

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

    @ExceptionHandler(BaseException.class)
    public ResponseEntity<?> handleAppException(BaseException exHttpServletRequest request
{
      //......
    }

    @ExceptionHandler(value = ResourceNotFoundException.class)
    public ResponseEntity<ErrorReponsehandleResourceNotFoundException(ResourceNotFoundException exHttpServletRequest request
{
      //......
    }
}

這種異常處理方式下,會(huì)給所有或者指定的 Controller 織入異常處理的邏輯(AOP),當(dāng) Controller 中的方法拋出異常的時(shí)候,由被@ExceptionHandler 注解修飾的方法進(jìn)行處理。

ExceptionHandlerMethodResolvergetMappedMethod 方法決定了異常具體被哪個(gè)被 @ExceptionHandler 注解修飾的方法處理異常。

@Nullable
 private Method getMappedMethod(Class<? extends Throwable> exceptionType) {
  List<Class<? extends Throwable>> matches = new ArrayList<>();
    //找到可以處理的所有異常信息。mappedMethods 中存放了異常和處理異常的方法的對(duì)應(yīng)關(guān)系
  for (Class<? extends Throwable> mappedException : this.mappedMethods.keySet()) {
   if (mappedException.isAssignableFrom(exceptionType)) {
    matches.add(mappedException);
   }
  }
    // 不為空說(shuō)明有方法處理異常
  if (!matches.isEmpty()) {
      // 按照匹配程度從小到大排序
   matches.sort(new ExceptionDepthComparator(exceptionType));
      // 返回處理異常的方法
   return this.mappedMethods.get(matches.get(0));
  }
  else {
   return null;
  }
 }

從源代碼看出:getMappedMethod()會(huì)首先找到可以匹配處理異常的所有方法信息,然后對(duì)其進(jìn)行從小到大的排序,最后取最小的那一個(gè)匹配的方法(即匹配度最高的那個(gè))。

Spring 框架中用到了哪些設(shè)計(jì)模式?

關(guān)于下面一些設(shè)計(jì)模式的詳細(xì)介紹,可以看筆主前段時(shí)間的原創(chuàng)文章《面試官:“談?wù)?Spring 中都用到了那些設(shè)計(jì)模式?”?!?/a> 。

Spring 事務(wù)

Spring/SpringBoot 模塊下專門有一篇是講 Spring 事務(wù)的,總結(jié)的非常詳細(xì),通俗易懂。

Spring 管理事務(wù)的方式有幾種?

Spring 事務(wù)中哪幾種事務(wù)傳播行為?

事務(wù)傳播行為是為了解決業(yè)務(wù)層方法之間互相調(diào)用的事務(wù)問(wèn)題。

當(dāng)事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí),必須指定事務(wù)應(yīng)該如何傳播。例如:方法可能繼續(xù)在現(xiàn)有事務(wù)中運(yùn)行,也可能開啟一個(gè)新事務(wù),并在自己的事務(wù)中運(yùn)行。

正確的事務(wù)傳播行為可能的值如下:

1.TransactionDefinition.PROPAGATION_REQUIRED

使用的最多的一個(gè)事務(wù)傳播行為,我們平時(shí)經(jīng)常使用的@Transactional注解默認(rèn)使用就是這個(gè)事務(wù)傳播行為。如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。

2.TransactionDefinition.PROPAGATION_REQUIRES_NEW

創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說(shuō)不管外部方法是否開啟事務(wù),Propagation.REQUIRES_NEW修飾的內(nèi)部方法會(huì)新開啟自己的事務(wù),且開啟的事務(wù)相互獨(dú)立,互不干擾。

3.TransactionDefinition.PROPAGATION_NESTED

如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)行;如果當(dāng)前沒(méi)有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED

4.TransactionDefinition.PROPAGATION_MANDATORY

如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則拋出異常。(mandatory:強(qiáng)制性)

這個(gè)使用的很少。

若是錯(cuò)誤的配置以下 3 種事務(wù)傳播行為,事務(wù)將不會(huì)發(fā)生回滾:

Spring 事務(wù)中的隔離級(jí)別有哪幾種?

和事務(wù)傳播行為這塊一樣,為了方便使用,Spring 也相應(yīng)地定義了一個(gè)枚舉類:Isolation

public enum Isolation {

    DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),

    READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),

    READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),

    REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),

    SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);

    private final int value;

    Isolation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }

}

下面我依次對(duì)每一種事務(wù)隔離級(jí)別進(jìn)行介紹:

@Transactional(rollbackFor = Exception.class)注解了解嗎?

Exception 分為運(yùn)行時(shí)異常 RuntimeException 和非運(yùn)行時(shí)異常。事務(wù)管理對(duì)于企業(yè)應(yīng)用來(lái)說(shuō)是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性。

當(dāng) @Transactional 注解作用于類上時(shí),該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時(shí),我們也可以在方法級(jí)別使用該標(biāo)注來(lái)覆蓋類級(jí)別的定義。如果類或者方法加了這個(gè)注解,那么這個(gè)類里面的方法拋出異常,就會(huì)回滾,數(shù)據(jù)庫(kù)里面的數(shù)據(jù)也會(huì)回滾。

@Transactional 注解中如果不配置rollbackFor屬性,那么事務(wù)只會(huì)在遇到RuntimeException的時(shí)候才會(huì)回滾,加上 rollbackFor=Exception.class,可以讓事務(wù)在遇到非運(yùn)行時(shí)異常時(shí)也回滾。

Spring Data JPA

JPA 重要的是實(shí)戰(zhàn),這里僅對(duì)小部分知識(shí)點(diǎn)進(jìn)行總結(jié)。

如何使用 JPA 在數(shù)據(jù)庫(kù)中非持久化一個(gè)字段?

假如我們有下面一個(gè)類:

@Entity(name="USER")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private Long id;

    @Column(name="USER_NAME")
    private String userName;

    @Column(name="PASSWORD")
    private String password;

    private String secrect;

}

如果我們想讓secrect 這個(gè)字段不被持久化,也就是不被數(shù)據(jù)庫(kù)存儲(chǔ)怎么辦?我們可以采用下面幾種方法:

static String transient1; // not persistent because of static
final String transient2 = "Satish"// not persistent because of final
transient String transient3; // not persistent because of transient
@Transient
String transient4; // not persistent because of @Transient

一般使用后面兩種方式比較多,我個(gè)人使用注解的方式比較多。

JPA 的審計(jì)功能是做什么的?有什么用?

審計(jì)功能主要是幫助我們記錄數(shù)據(jù)庫(kù)操作的具體行為比如某條記錄是誰(shuí)創(chuàng)建的、什么時(shí)間創(chuàng)建的、最后修改人是誰(shuí)、最后修改時(shí)間是什么時(shí)候。

@Data
@AllArgsConstructor
@NoArgsConstructor
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public abstract class AbstractAuditBase 
{

    @CreatedDate
    @Column(updatable = false)
    @JsonIgnore
    private Instant createdAt;

    @LastModifiedDate
    @JsonIgnore
    private Instant updatedAt;

    @CreatedBy
    @Column(updatable = false)
    @JsonIgnore
    private String createdBy;

    @LastModifiedBy
    @JsonIgnore
    private String updatedBy;
}

實(shí)體之間的關(guān)聯(lián)關(guān)系注解有哪些?

利用 @ManyToOne@OneToMany 也可以表達(dá)多對(duì)多的關(guān)聯(lián)關(guān)系。

Spring Security

Spring Security 重要的是實(shí)戰(zhàn),這里僅對(duì)小部分知識(shí)點(diǎn)進(jìn)行總結(jié)。

有哪些控制請(qǐng)求訪問(wèn)權(quán)限的方法?

hasRole 和 hasAuthority 有區(qū)別嗎?

可以看看松哥的這篇文章:Spring Security 中的 hasRole 和 hasAuthority 有區(qū)別嗎?,介紹的比較詳細(xì)。

如何對(duì)密碼進(jìn)行加密?

如果我們需要保存密碼這類敏感數(shù)據(jù)到數(shù)據(jù)庫(kù)的話,需要先加密再保存。

Spring Security 提供了多種加密算法的實(shí)現(xiàn),開箱即用,非常方便。這些加密算法實(shí)現(xiàn)類的父類是 PasswordEncoder ,如果你想要自己實(shí)現(xiàn)一個(gè)加密算法的話,也需要繼承 PasswordEncoder。

PasswordEncoder 接口一共也就 3 個(gè)必須實(shí)現(xiàn)的方法。

public interface PasswordEncoder {
    // 加密也就是對(duì)原始密碼進(jìn)行編碼
    String encode(CharSequence var1);
    // 比對(duì)原始密碼和數(shù)據(jù)庫(kù)中保存的密碼
    boolean matches(CharSequence var1, String var2);
    // 判斷加密密碼是否需要再次進(jìn)行加密,默認(rèn)返回 false
    default boolean upgradeEncoding(String encodedPassword) {
        return false;
    }
}

官方推薦使用基于 bcrypt 強(qiáng)哈希函數(shù)的加密算法實(shí)現(xiàn)類。

如何優(yōu)雅更換系統(tǒng)使用的加密算法?

如果我們?cè)陂_發(fā)過(guò)程中,突然發(fā)現(xiàn)現(xiàn)有的加密算法無(wú)法滿足我們的需求,需要更換成另外一個(gè)加密算法,這個(gè)時(shí)候應(yīng)該怎么辦呢?

推薦的做法是通過(guò) DelegatingPasswordEncoder 兼容多種不同的密碼加密方案,以適應(yīng)不同的業(yè)務(wù)需求。

從名字也能看出來(lái),DelegatingPasswordEncoder 其實(shí)就是一個(gè)代理類,并非是一種全新的加密算法,它做的事情就是代理上面提到的加密算法實(shí)現(xiàn)類。在 Spring Security 5.0 之后,默認(rèn)就是基于 DelegatingPasswordEncoder 進(jìn)行密碼加密的。

參考

  • 《Spring 技術(shù)內(nèi)幕》
  • 《從零開始深入學(xué)習(xí) Spring》:https://juejin.cn/book/6857911863016390663
  • http://www.cnblogs.com/wmyskxz/p/8820371.html
  • https://www.journaldev.com/2696/spring-interview-questions-and-answers
  • https://www.edureka.co/blog/interview-questions/spring-interview-questions/
  • https://www.cnblogs.com/clwydjgs/p/9317849.html
  • https://howtodoinjava.com/interview-questions/top-spring-interview-questions-with-answers/
  • http://www.tomaszezula.com/2014/02/09/spring-series-part-5-component-vs-bean/
  • https://stackoverflow.com/questions/34172888/difference-between-bean-and-autowired

··················END················


近期文章精選 :

??《Java 面試指北》來(lái)啦!這是一份教你如何更高效地準(zhǔn)備面試的小冊(cè),涵蓋常見八股文(系統(tǒng)設(shè)計(jì)、常見框架、分布式、高并發(fā) ......)、優(yōu)質(zhì)面經(jīng)等內(nèi)容。

??如果本文對(duì)你有幫助的話,歡迎 點(diǎn)贊&在看&分享 ,這對(duì)我繼續(xù)分享&創(chuàng)作優(yōu)質(zhì)文章非常重要。非常感謝!

瀏覽 61
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 色播五月天| 日韩av免费在线| 色中色AV| 亚洲AV无码成人专区| 成人黄色视频网站在线观看| 视色影院| 白浆AV| 国产成人AⅤ| 亚洲人成电影| 天天天天天天天天干| 欧洲无码一区二区三区| 99操99| anwuye官方网站| 国产夫妻精品| 国产乱码一区二区三区四区在线| 日本欧美久久久久免费播放网| 91东热激情| 伊人666| 日本黄色片视频| 欧洲亚洲免费视频| 婷婷丁香激情| 欧美色综合| 国产三级成人| 国产一级a毛一级a毛观看视频网站www.jn | 成人免费无码A片免费| 国产中文字字幕乱码无限| 人人做人人做人人做,人人做全句下一 | 午色婷婷国产无码| 超碰在线观看免费版| 中文字幕北条麻妃在线| www.一区二区| 狠狠地操| 国语精品自拍| 国产女人在线视频| 五月天黄色片| 亚洲三级在线视频| 西西特级无码444www| 日韩操B| 亚洲网站免费在线观看| 成人网站www污污污网站公司| 视频二区中文字幕| 九九久久精品| AⅤ视频在线观看| 日韩欧美高清无码| 欧美va在线| 蜜臀网在线| 中文字幕网在线| 国产黄色片在线免费观看| 亚洲精品视频免费看| 日韩黄色电影在线| 人人妻人人爱人人| 欧美三级一级| 免费无码毛片| 中出欧美亚洲| 国产一级a毛一级做a爱| 亚洲av网站| AV观看免费| 日韩bbbb| 天天干天天日天天干| 成人蜜臀AV| 亚洲精品伦理| 91成人一区| 三级片视频网站| 俺也来俺也去WWW色| 男女av免费| 91黄色电影| 日韩中文字幕一区二区三区| 蜜芽成人精品久久久视频| 躁BBB躁BBB躁BBBBB乃| 亚洲成人黄色电影| 日韩日韩日韩日韩| 亚洲欧美精品AAAAAA片| 91丨九色丨蝌蚪丨成人| 99国产在线| 国产熟女自拍| 日韩免费高清在线视频| 波多野结衣在线精品| 欧美在线视频免费观看| 九九九国产| 99久久婷婷国产综合| 亚洲精品一区二区三区无码电影 | 九九九热精品| 98无码人妻精品一区二区三区| 日韩精品中文无码| 五月婷婷网站| 国产乱子伦-区二区三区| 翔田千里中文字幕无码| 极品一线天小嫩嫩真紧| 九九热精品视频在线播放| AV无码精品| 91久久久青青青青草| 中文国产字幕| www.爆操| 操逼视频免费看| 开心色播五月| 夜夜操夜夜骑| 秋霞福利网| 欧美射图| 色九九九九| 人人妻人人摸| 四虎成人精品永久免费AV九九| 色婷婷国产精品| www.婷婷五月天| 韩国色情中文字幕| 亚洲欧美色图| 中文字幕亚洲专区| 夜夜爽天天爽| 大香蕉伊人丁香五月| 99热这里只有精品7| 国产AV一级| 色情片在线播放| 激情内射网站| 南京搡BBBB搡BBBB| 天天舔九色婷婷| 免费视频一区二区三区四区| 91麻豆福利在线观看| 91探花在线播放| 色男人色天堂| 久久久偷拍视频| 91精品免费视频| 99久久99久久99久久久99国产| 天天透天天干| 中文在线永久免费观看| 水蜜桃视频网站在线观看| 天天爱综合| 欧美一级A片高清免费播放| 久久b| 成人AA片| 国产99久久久精品| 精品乱子伦一区二区三区免费播放 | 国产A片视频| 特黄视频在线观看| 豆花视频logo进入官网| 欧美怕怕| 人人做人人操| 免费一级A片| 日韩高清区| 欧美精品性爱| 欧美一级日韩| 中文字幕综合网| 久久8| 91国产爽黄在线相亲| 91aV视频| 欧美精品99久久久| 欧美女人日逼视频| 午夜国产视频| 自拍偷拍| 狼人色影院| 2021国产视频| 成人av小说网站| 黄色成人网址| 亚洲国产精品成人va在线观看| 天天操网址| 99久久99久久99久久久99国产| 天天干视频在线| 日本高清中文字幕| 国产精品热| 天天操人人射| 亚洲人成在线观看| 噜噜噜在线视频| 国产九九九| 激情免费视频| 狠狠干,狠狠操| 日韩人妻无码一区二区三区| 国产精品久久久久久最猛| 东京热在线免费观看| 中文字幕五月天| 水果派AV| 国产亚洲成人综合| 夫妻成人免费看片一区二区| 中国无码视频| 苏妲己一级婬片A片| 91人妻无码成人精品一区二区| 成人影片在线观看18| 青春草在线观看视频| 永久免费AV无码| 欧美日韩三级| 一级一A片一a免费看| 亚洲91无码精品一区在线播放| 国产激情网站| 97AV人妻无码视频二区| 日本特黄一级| 国产精品欧美7777777| 青青草原成人视频| 久久视频一二| 黄页网站免费观看| 国产愉拍91九色国产愉拍| 中文免费高清在线观看视频| 成人看片黄a免费看视频| 嫩BBB搡BBB搡BBB四川| 欧美A级视频| 中文解说AⅤ水果派| 午夜免费无码视频| 中文字幕视频一区| 国产精品视频网站| 午夜成人无码视频| 99在线精品视频| 一级二级三级无码| 国产人妖av| 视频一区中文字幕| 国产亚洲精品码| 东北奇淫老老妇| 国产一级婬女AAAA片季秀英| 亚洲无码999| 中文四区| 精品乱子伦一区二区三区毛| 国产伦子伦一级A片免费看小说| 国产伦子伦一级A片在线| 91视频美女| 午夜免费福利| www国产精品| WWW.99热| 色天堂色男人| 能看的AV网站| 国产探花自拍| 国产A片精品| 亚洲精品内射| 亚洲视频一区二区三区四区娇小视频在线观看视频 | 国产女主播在线观看| 少妇厨房愉情理伦BD在线观| 偷拍视频网站北条麻妃| 中文字幕一区二区三区精华液| 东方AV在线免费观看| 色欲AV秘无码一区二区三区| 中文无码久久| 欧美A级视频| 波多野成人无码精品视频| 大香蕉综合久久| 蜜桃人妻| www.zaixianshipin| 无码福利| jizz国产精品| 人人干国产| 91麻豆国产视频| 大香蕉av一区二区三区在线观看 | 亚洲无码一区二区三区蜜桃| 欧美性爱在线| 午夜精品无码| 99久久久国产精品无码| 国产精品污www在线观看| 69色色| 三级高清无码视频| xxx国产精品| 国产成人视频在线观看| 无码视频网| 欧美三级美国一级| 国产91视频在线观看| 免费无码国产在线| 性猛交╳XXX乱大交| 免费一区二区三区四区| 免费看A| 五月天开心网| 国产精品成人一区二区| 日韩欧美中文字幕公布| av天天操| AV无码资源| 色AV高清| 在线无码免费| 91蝌蚪丨人妻丨丝袜| 毛片在线观看网站| 狠狠操狠狠操狠狠操| 亚洲激情内射| 大香蕉伊人精品| 北条麻妃三区| 国产精品囯产三级囯产AV野外| 久久艹精品视频| 四虎在线视频观看96| AAAA毛片视频| 99视频在线| 五月丁香综合| 日韩免费av| 久草综合视频| 国产三级片在线视频| 北条麻妃无码播放| 91无码在线视频| 91国语又粗又大对白| 日韩欧美在中文| 亚洲专区区免费| 天天操超碰| 免费看污网站| 大荫蒂精品另类| 在线日韩一区二区| 99久久国产视频| 又大又长又粗91| 91黄色在线视频| 人妻精品一二三| 91一区| 婷婷欧美| 中文字幕av在线播放| 久久人人操| 亚洲黄色电影在线观看| 中文字幕无码在线| 91精品国久久久久久无码一区二区三区| 国产亲子乱A片免费视频| 日韩一级黄色视频| 午夜精品久久久久久久99老熟妇| 日韩人妻丰满无码区A片| 欧美日本国产| 日本处女性高潮喷水视频| 人妻被午夜福利AV| 熟女人妻一区二区三区| 欧美精品18videosex性欧美| 黄色自拍视频| 午夜成人免费福利| 欧美三级视频在线| 美女高潮网站| 国产女同在线观看| 人妻少妇精品视频一区二区三区 | 欧美日韩黄色极品| 亚洲一级a片| 韩国gogogo高清在线完整版| 丰满人妻一区二区三区四区不卡| 日韩无码黄| 午夜天堂精品久久久| 蜜桃av秘无码一区三| 91社成人影院| 中文字幕在线视频免费观看| 亚洲视频在线免费播放| 亚洲午夜视频在线观看| 天天拍天天干| 黄色视频在线观看亚洲一区二区三区免费 | 婷婷五月综合在线| 91色婷婷综合久久中文字幕二区| 免费在线观看黄色视频网站| 成年人在线观看视频| 日本久久高清| 欧美福利电影| 色婷婷狠| 色色激情五月天| 人人干天天干| 中文乱伦视频| 国产精品秘麻豆果冻传媒潘甜甜丶 | 激情久久综合| 二区三区免费| 91视频在线免费看| 亚洲影院在线观看| 欧美A级视频| 久久久久久无码日韩欧美电影| 国精产品一区二区三区在线观看| 少妇人妻在线| 草草影院第一页| JiZZjiZZ亚洲成熟熟妇| 色婷婷丁香五月天| 加勒比黑人和翔田千里在线播放| 一级a爱视频| 国产精品v欧美精品v日韩| 欧美A黄片| 久久婷婷综合网| 日韩av一区二区三区| 老骚老B老太太BBW| 亚洲蜜桃av一区| 男人的天堂色琪琪| 成年人黄色视频网站| 激情丁香婷婷| 中文丰满亲子伦| 精品一区二区三区蜜桃臀www| 日韩中文字幕一区二区| 色小说在线| 大香蕉在线伊| 色久综合| 成人五月天黄色电影| 精品黄色视频| 国产精品tv| 尤物视频在线观看| 亚洲视频入口| 无码无码一区二区三区| AV资源站| 亚洲综合社区在线| www.一级片| 国产69精品久久久久久| 2021无码| 四虎无码丰满人妻| 国产久久性爱| 麻豆高清无码| 欧美操B视频| 2019中文字幕mv第三季歌词| 亚洲午夜久久久久久久久| www.日韩欧美| 天堂VA蜜桃一区二区三区| 亚洲四房播| 日韩AV一级| 怡红院男人天堂| 色94色.欧美.setu| 婷婷无码成人精品俺来俺去| 大黑人荫蒂BBBBBBBBB| 免费在线a| 揄拍成人国产精品视频| 无码在线网站| 亚洲黄色成人网站| 午夜福利AV电影| 成人在线A片| 中文字幕有码在线观看| 操B图| jizz国产精品| 亚洲成人精品少妇| 婷婷色视频| 99精品免费| 北条麻妃99精彩视频| 日本黄色A片免费看| 日日干天天射| 五月婷婷日韩| 五月天精品| 狠狠久| 黄色a在线| 欧美日韩精品一区| 激情婷婷| 欧美操逼电影| 丰满少妇在线观看网站| 日本久久婷婷| 日本精品人妻| 国产熟妇搡BBBB搡BBBB毛片| 久久久久99精品成人片直播| 亚洲图片欧美另类| 日韩中文性受视频| 高清无码在线免费观看视频| 日韩精品人妻一区二区| 99热精品2| 在线午夜福利| 日韩91在线视频| XXXXⅩHD亚洲人HD| 久久久久久久| 性爱一区| 大香蕉人人| 日韩资源站| 欧美三级大片| 国产一区免费观看| 亚洲免费成人视频| 青草伊人av| 欧美亚洲图区| 国产又爽又黄A片免费观看| 欧美精品秘一区二区三区蜜臀| 人人妻人人骑| 俺来也听听婷婷| 午夜视频福利| 日韩無码专区| 色女人天堂| 亚洲黄色在线播放| 欧美午夜福利在线观看| 中文字幕无码Av在线看| 男人操女人视频网站| 日批国产| 黄片免费无码| 国产成人高潮毛片| 亚洲AV秘无码一区在线| jizzjizz欧美| 亚洲成人中文字幕在线| 91麻豆精品国产91久久久吃药| 国产精品色婷婷99久久精品| 亚洲三级黄色| 国产精品扒开腿| 一级a片免费观看| 无码av网| 高清无码在线观看18| AV高清无码在线观看| 黄色电影A片| 内射网站在线看| 国产高清在线视频| 中文字幕高清| 日本伊人在线综合视频| 亚洲在线大香蕉| 欧美久久国产精品| 一本色道久久综合狠狠躁的推荐| 先锋影音一区| 骚逼AV| 成人黄色录像| 肏逼网| 嫰BBB槡BBBB槡BBBB| 嫖中国站街老熟女HD| 夜夜操天天操| 亚洲精品成人网站| 天天操天天日天天干| 麻豆成人精品国产免费| 夜夜骚| 日韩无码www| 国产成人免费观看视频| 久久五月天婷婷| 日本黄色视频大全| 久久精品亚洲| www.俺也去| 99精品一区二区| 97久久久| 免费性爱网站| 狼人伊人综合| 99精品丰满人妻无码| 国产精品男女| 中文字幕无码av| 中文无码字幕在线| AV大全在线免费观看| AV天堂亚洲| 亚洲无码AV一区二区| 亚洲精品中文字幕在线| 中文字幕国产av| 婷婷五月丁香在线| 一区二区三区四区五区六区高清无吗视频 | 久久精品久| 少妇白浆| 无码久久久| 成人网址大全| 精品无码一区二区三区四区五区| 制服丝袜乱伦| 国产第一夜| 色哟哟一区二区三区四区| 久久99精品视频| 欧美日韩在线看| 日韩潮喷| 亚洲操操操| 91黑人| a免费视频在线观看| 亚洲黄色AV| 亚洲无码精品久久| 久久视频免费在线观看| 亚洲精品性爱| 欧美在线综合| 亚洲精品国偷拍自产在线观看蜜桃 | 日韩AV乱伦| 成人黄色在线观看视频| 九九九国产| 99热超碰在线| 在线观看视频无码| 国产成人精品一区二区三区四区| 狠狠狠操| 91在线无码精品秘蜜桃入口| 国产又粗又猛又爽又黄91精品| 性欧美一区二区| 97一区二区| 色片在线| 色欲五月天| 亚洲无码中文字幕视频| 中文字幕在线观看福利视频| 91新视频| 精品免费在线观看| 一区二区三区日本| 狠狠色噜噜狠狠狠7777米奇网| 五月天黄色电影| 亚洲无码av在线播放| 色资源站| 中文字幕av一区| 色大香蕉伊人| 成人一级精品| 蜜桃av秘无码一区二区三区| 美女91视频| 久久国产一区二区三区| 一级黄在线观看| 五月亚洲六月婷婷| 欧美日韩中文字幕无码| 亚洲人在线| 最新黄色av| 九九精品免费视频| 小黄片高清无码| 免费操逼| 婷婷99| 蜜桃av在线| 国产三级片在线观看视频| 91精品婷婷国产综合| 另类视频区| 黄色在线欣赏| 影音先锋成人AV| 亚洲黄视频| 亚洲专区中文字幕| 黄色高清无码视频| 亚洲色操| 国精产品一二三区| 日本欧美中文字幕| 国内免费毛片| 日韩成人视屏| 亚洲精品成人| 操操操操操操| 三级网址在线观看| 伊人青青操| A片在线免费播放| 亚洲三级视频| 狠狠狠操| 无码av在线观看| 操逼五月天| HEZ-502搭讪绝品人妻系列| 七六十路の高齢熟妇无码| 色色激情五月天| 国产视频高清无码| 久久久久亚洲AV无码网影音先锋| 97免费视频在线观看| 国产性受XXXXXYX性爽| 国产一级黄色毛片| 一区二区精品视频| 91麻豆国产福利精品| 亚洲国产操逼| 91操美女视频| 国产免费一区二区三区免费视频| 香蕉婷婷亚洲丁香| 国产乱伦不卡| 午夜无码在线观看视频| 欧美性猛交一区二区三区| 伊人大香蕉在线| 不卡一区| 成人毛片网站| 人人摸人人| 开心四房播播第四婷婷| 国产Av婬乱麻豆| 成人做爰100片免费-百度| 日本三级片视频不卡| 欧美国产在线观看综合| 日本三级片在线| 91大神免费在线观看| 成人午夜大片| 午夜成人福利视频在线观看 | 国产成人综合亚洲| 国产高清黑人| 亚洲色综合网| 人人妻人人澡人人DⅤD| 国产女人18水真多18精品| 清清草在线视频| 99热精品免费观看| 高清无码在线视频观看| 18禁污网站| 最新中文字幕在线观看视频| 91精品久久久久久久久久| 九九色网| 国产综合久久久7777777| 91视频久久久| 自慰精品| 江苏妇搡BBBB搡BBBB| 性爱视频网址| 欧美成人A片在线观看| 亚洲Japanese办公室制服| 国产无码成人电影| 色婷婷亚洲色| 国产亚洲欧美日韩高清| 久久精品视频免费看| 免费在线观看一区| 天堂色色| 三级国产AV| 中文字幕在线网址| 亚洲超碰在线| 豆花成人视频| 欧美精产国品一二三区| 午夜3D动漫AV| 日韩va亚洲va欧美va高清 | 一级性爱视频| 久久人妻无码中文字幕系列| 人妻无码精品久久人妻成人 | 久久婷婷五月天| 人妻公日日澡久久久| 国产日韩欧美久久| 蜜桃视频日韩| 国产一区二区三区在线观看免费视频免费视频免费视频 | 亚洲无码三级| 婷婷丁香五月激情一区综合网 | 日本高清免费视频| 日韩美女久久| 中文字幕在线免费播放| 免费v片在线观看| 91精品国产综合久久久蜜臀酒店| 99国产视频| 国产精品3| 97色吧| 日韩AV一级| 麻豆视频国产| 操逼综合| 中字一区人妻水多多| 色婷婷欧美| 色就是色欧美成人网| 在线观看视频无码| 牛牛影视av老牛影视av| 日本不卡一区二区三区| 国产色五月视频| 免费看黄色A片| 色老板在线观看视频| 91成人情欲影视网| 东北嫖老熟女一区二区视频网站| 黄片网址| 337P粉嫩大胆噜噜噜55569| 午夜网页| 国产成人免费在线视频| 欧美成人大片| 欧美一区二区三曲的| 亚洲婷婷五月| 五月丁香视频在线| 精品无码一区二区三区蜜桃李宗瑞 | 欧美视频综合| 精品1区2区| 亚洲AV网址| 高清无码视频免费观看| 中文字幕在线观看亚洲| 欧美亚洲国产精品| 精品国产va久久久久久久| 亚洲AV无码成人精品久久久 | 亚洲黄色Av| 伊人一区二区三区| 成人自拍偷拍| 精品国产免费无码久久噜噜噜AV | 欧美91熟| 成人毛片av| 久热官网| 4080yy午夜理论片成人| 麻豆精品国产传媒| 伊人激情五月天| 久久人妻无码中文字幕系列| 日韩三级在线播放| 五月婷丁香| 午夜五月天| 四虎在线免费视频| 九九福利视频| 久久亚洲中文字幕乱码| 爱爱视频免费网站| 六月丁香网| 国产又粗又长又硬黄色一级片| 9I成人免费版视频| 欧美综合精品| 丰臀肥逼高清视频电影播放| 少妇做爱特级AAA| 午夜成人小电影| 日本黄色视频电影| 日韩99在线| 尤物AV| 91九色麻豆| 欧洲肥胖BBBBBBBBBB| 毛片学生妹| 欧美性BBB槡BBB槡BBB| 91人妻人人操| 黄色视频网站在线播放| 精品麻豆| 91小仙女jK白丝袜呻吟| 大鸡吧草逼| 69成人免费视频| 成人激情视频A极| 美女天天日| 四川w搡BBB搡wBBB搡| 狠狠搞狠狠操| 亚洲av| 六月丁香久久| 成人精品一区二区区别解析| 91无码人妻一区二区三区| 91精品丝袜久久久久久| 国产99re| 欧美日韩精品在线观看| 成人AV中文字幕| 男女日逼视频| 成人av免费观看| a国产| 久久另类TS人妖一区二区免费| 国产高清一区二区三区| 亚洲激情综合视频| 男女啪啪网| 骚骚网站| 在线看片你懂的| 日本人妻在线播放| 亚洲熟女一区| 亚洲精品一区二区三区新线路| 老鸭窝av免费入口在线观看| 黄色片在线观看视频| 中文字幕精品在线免费视频观看视频| av影片在线播放| 日韩欧美在线播放| 337P粉嫩大胆噜噜噜55569| 插逼综合网| 91亚洲免费视频| 蜜桃视频| 伊人网av| 久久肏屄视频| 日韩AV中文| 黄色片基地| 蜜桃Av噜噜一区二区三| 怕怕怕视频| 伊人久久免费视频| 9l人人澡人人妻人人精品| 麻豆网站| 在线观看AV资源| 亚洲无码在线播放| 中文字幕天天在线| 一级黄色电影网| 嫩BBB搡BBB搡BBB四川| 日韩欧美在线视频观看| 天天日天天干天天草| 北条麻妃久久| 91羞羞| 操逼三级视频| 97午夜福利| 青娱乐国产精品一区二区| 91探花视频精选在线播放| 欧美多人| 三级视频在线播放| 可以在线观看的AV| 五月亚洲六月婷婷| 欧美亚洲激情| 成人影视在线免费观看| 91丨人妻丨国产丨丝袜| 一级黄色操逼视频| 99久操| 日韩免费一区| 日本黄色电影在线观看| 成人午夜精品福利免费| 18禁网站免费| 亚洲无码免费网站| 亚洲无码中文字幕在线观看| 操在线视频| 午夜成人免费福利| 亚洲综合中文| 69式荫蒂被添全过程| 热无码av| 大香蕉官网| 三级在线网| 北条麻妃99精彩视频| ThePorn日本无码| 亚洲免费AV在线| 无码中文字幕高清| 91人妻在线视频| 永久免费AV| 国产无遮挡又黄又爽在线观看 | 亚洲精品中文字幕无码| 在线观看视频亚洲| 亚洲精品无码在线播放| 欧美成人精品AAA| 日韩一级片在线播放| 精品秘一区性综合三区| 人妻一区二区三区| 超碰一级片| 99精品视频免费在线观看| 精品无码一| 操逼影片| 欧美囗交大荫蒂免费| 国产精品国内自产| 亚洲AV无码成人精品| 特级婬片A片AAA毛片AA做头| 中文字幕在线观看网| 日本精品视频| 日韩午夜成人电影| 日本一级黄色A片| 中文字幕无码精品三级在线欧美| 波多野结衣黄色视频| 中文字幕日韩电影| 久久艹伊人| 安徽妇搡BBBB搡BBB| 天堂资源| 操屄免费视频| 国产亚洲91| 五月婷婷五月丁香| 久久久久人妻| 西西888WWW大胆无码| 蜜桃视频在线入口www| 91网站在线观看视频| 日韩av中文字幕在线播放| 黄色福利视频| 翔田千里一区二区三区| 麻豆AV在线播放| 婷婷成人在线| 成人区色情综合小说| 农村A片婬片AAA毛片| 黑人无码AV黑人天堂无码AV| 亚洲中文字幕2019| 中文字幕日韩美| 人人爽亚洲AV人人爽AV人人片| av在线无码| 亚洲无码一本道| 亚洲AV播放| 亚洲AV无码乱码国产精品黑人| 中文成人在线| 蜜桃视频在线观看18| 水果派AV| 欧美成人手机在线| 91狠狠色丁香婷婷综合久久精品 | 激情小视频国产在线播放| 中文字幕在线免费观看视频| 国产成人无码在线| www九九热| 亚洲乱码一区二区三区| 久久精品视频免费看| 亚洲精品天堂无码| 国产96在线亚洲| 无码日逼| 精品人妻一区二区三区-国产精品| 无码人妻精品一区二区三区蜜臀百度 | AV四虎| 午夜偷拍视频| 九九热日本| 日韩一级爱爱| 吴梦梦《女教师时间暂停》 | 天天天天天天天天操| 人人看人人插| 免费观看黄色在线视频| 大香蕉在线视频75| 一区二区操逼| 91熟女视频| 精品视频在线免费观看| 嘿嘿午夜| 18国产免费视频在线观看| Chinese搡老女人| 国产精品国产三级国产AⅤ原创| 久久夜色精品国产噜噜亚洲AV| 四虎影成人精品A片| 91亚洲一区| 超碰永久| 在线免费黄色网址| 岛国av片| 日韩成人黄色视频| 人人肏肏人人| 日韩综合色视频导航| 五月婷婷中文字幕| 欧美在线中文字幕| 三级乱伦| 欧美黄色一级视频| 欧美在线一区二区三区|