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

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

共 24159字,需瀏覽 49分鐘

 ·

2022-08-02 22:35

Spring 基礎(chǔ)

什么是 Spring 框架?

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

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

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

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

?? 多提一嘴 :語言的流行通常需要一個(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 框架的核心模塊,也可以說是基礎(chǔ)模塊,主要提供 IoC 依賴注入功能的支持。Spring 其他所有的功能基本都需要依賴于該模塊,我們從上面那張 Spring 各個(gè)模塊的依賴關(guān)系圖就可以看出來。

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

AOP

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

Data Access/Integration

  • spring-jdbc :提供了對(duì)數(shù)據(jù)庫訪問的抽象 JDBC。不同的數(shù)據(jù)庫都有自己獨(dú)立的 API 用于操作數(shù)據(jù)庫,而 Java 程序只需要和 JDBC API 交互,這樣就屏蔽了數(shù)據(jù)庫的影響。
  • 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è)試變得更簡單。

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

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

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

Spring 包含了多個(gè)功能模塊(上面剛剛提高過),其中最重要的是 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)的簡寫,其核心思想是通過將業(yè)務(wù)邏輯、數(shù)據(jù)、顯示分離來組織代碼。

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

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

Spring Boot 只是簡化了配置,如果你需要構(gòu)建 MVC 架構(gòu)的 Web 程序,你還是需要使用 Spring MVC 作為 MVC 框架,只是說 Spring Boot 幫你簡化了 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 框架來管理。不過, IoC 并非 Spring 特有,在其他語言中也有應(yīng)用。

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

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

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

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

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

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

相關(guān)閱讀:

什么是 Spring Bean?

簡單來說,Bean 代指的就是那些被 IoC 容器所管理的對(duì)象。

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

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

下圖簡單地展示了 IoC 容器如何使用配置元數(shù)據(jù)來管理對(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ù)庫相關(guān)操作。
  • @Service : 對(duì)應(yīng)服務(wù)層,主要涉及一些復(fù)雜的邏輯,需要用到 Dao 層。
  • @Controller : 對(duì)應(yīng) Spring MVC 控制層,主要用戶接受用戶請(qǐng)求并調(diào)用 Service 層返回?cái)?shù)據(jù)給前端頁面。

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

  • @Component 注解作用于類,而@Bean注解作用于方法。
  • @Component通常是通過類路徑掃描來自動(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),而且很多地方我們只能通過 @Bean 注解來注冊(cè) bean。比如當(dāng)我們引用第三方庫中的類需要裝配到 Spring容器時(shí),則只能通過 @Bean來實(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è)例子是通過 @Component 無法實(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)行匹配),也就是說會(huì)優(yōu)先根據(jù)接口類型去匹配并注入 Bean (接口的實(shí)現(xiàn)類)。

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

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

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

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

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

我們還是建議通過 @Qualifier 注解來顯示指定名稱而不是依賴變量的名稱。

@Resource屬于 JDK 提供的注解,默認(rèn)注入方式為 byName。如果無法通過名稱匹配到對(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 都無法匹配到 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é)一下:

  • @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都需要通過名稱才能正確匹配到對(duì)應(yīng)的 Bean。Autowired 可以通過 @Qualifier 注解來顯示指定名稱,@Resource可以通過 name 屬性來顯示指定名稱。

Bean 的作用域有哪些?

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

  • singleton : IoC 容器中只有唯一的 bean 實(shí)例。Spring 中的 bean 默認(rèn)都是單例的,是對(duì)單例設(shè)計(jì)模式的應(yīng)用。
  • prototype : 每次獲取都會(huì)創(chuàng)建一個(gè)新的 bean 實(shí)例。也就是說,連續(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)用可用) : 每一次來自新 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 的線程安全問題了解嗎?

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

常見的有兩種解決辦法:

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

不過,大部分 Bean 實(shí)際都是無狀態(tà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ù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任(例如事務(wù)處理、日志管理、權(quán)限控制等)封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護(hù)性。

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

SpringAOPProcess

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

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

術(shù)語含義
目標(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ì)象的過程動(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ì)來說更簡單,

如果我們的切面比較少,那么兩者性能差異不大。但是,當(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)用成功無異常,則會(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

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

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

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

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

Model 1 時(shí)代

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

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

mvc-mode1

Model 2 時(shí)代

學(xué)過 Servlet 并做過相關(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ù),只是用來展示。
  • Controller:處理用戶請(qǐng)求都發(fā)送給 ,返回?cái)?shù)據(jù)給 JSP 并展示給用戶。

Model2 模式下還存在很多問題,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 使用更加簡單和方便,開發(fā)效率更高,并且 Spring MVC 運(yùn)行速度更快。

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

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 工作原理的圖解我沒有自己畫,直接圖省事在網(wǎng)上找了一個(gè)非常清晰直觀的,原出處不明。

流程說明(重要):

  1. 客戶端(瀏覽器)發(fā)送請(qǐng)求, DispatcherServlet攔截請(qǐng)求。
  2. DispatcherServlet 根據(jù)請(qǐng)求信息調(diào)用 HandlerMappingHandlerMapping 根據(jù) uri 去匹配查找能處理的 Handler(也就是我們平常說的 Controller 控制器) ,并會(huì)將請(qǐng)求涉及到的攔截器和 Handler 一起封裝。
  3. DispatcherServlet 調(diào)用 HandlerAdapter適配執(zhí)行 Handler 。
  4. Handler 完成對(duì)用戶請(qǐng)求的處理后,會(huì)返回一個(gè) ModelAndView 對(duì)象給DispatcherServlet,ModelAndView 顧名思義,包含了數(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);
   }
  }
    // 不為空說明有方法處理異常
  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ù)問題。

當(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)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。

2.TransactionDefinition.PROPAGATION_REQUIRES_NEW

創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說不管外部方法是否開啟事務(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ù)來運(yùn)行;如果當(dāng)前沒有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED

4.TransactionDefinition.PROPAGATION_MANDATORY

如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(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)用來說是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性。

當(dāng) @Transactional 注解作用于類上時(shí),該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時(shí),我們也可以在方法級(jí)別使用該標(biāo)注來覆蓋類級(jí)別的定義。如果類或者方法加了這個(gè)注解,那么這個(gè)類里面的方法拋出異常,就會(huì)回滾,數(shù)據(jù)庫里面的數(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ù)庫中非持久化一個(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ù)庫存儲(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ù)庫操作的具體行為比如某條記錄是誰創(chuàng)建的、什么時(shí)間創(chuàng)建的、最后修改人是誰、最后修改時(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)求訪問權(quán)限的方法?

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

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

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

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

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ù)庫中保存的密碼
    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ā)過程中,突然發(fā)現(xiàn)現(xiàn)有的加密算法無法滿足我們的需求,需要更換成另外一個(gè)加密算法,這個(gè)時(shí)候應(yīng)該怎么辦呢?

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

從名字也能看出來,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················


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

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩人妻无码中文字幕| 人妻无码精品久久人妻成人| 色欲av在线| 中文字幕视频在线| a在线观看| 肉片无遮挡一区二区三区免费观看视频 | 日韩做爱网站| 人人摸人人看人人草| 免费观看一级毛一片| 日韩色情网| 熟妇熟女一区二区三区| 女生操逼网站| 色五月中文字幕| 亚洲无码一区二区在线观看| 最新一区二区三区| 亚洲午夜福利视频| 欧美肏逼网| 国产高清无码在线观看| 欧美性爱一区二区三区| 精品乱子伦一区二区三区免费播成| 欧美大屌视频| 麻豆国产91在线播放| 午夜福利不卡视频| 欧美色图网址| 日韩在线高清视频| 最近最火中文字幕mv歌词| 国产精品久久久久久无人区| 三级片亚洲| 拍真实国产伦偷精品| 亚洲无码一二三| 一区二区三区中文字幕| 国产精品毛片久久久久久久| 大黑逼网| 超碰人人搞| 性爱小说视频| 日日夜夜拍| 精品成人电影| 杨晨晨不雅视频| 在线啪| 日本中文字幕精品| 日韩不卡视频在线观看| 三级片在线观看视频| 日韩东京热中文字幕| 亚洲三级精品| 午夜视频免费| 在线成人免费视频| 黄色片在线免费观看| 午夜成人大片| 99er在线观看| 在线视频免费观看| 成人自拍偷拍视频| 国产欧美一级片| 在线观看免费视频a| 想要xx在线观看| 国产偷拍网站| 长泽梓黑人初解禁BDD07| 欧美三级视频在线| 9久9久9久9久女女女女| 亚洲福利视频网| 综合色网站| 91av| 欧美黄色激情视频网站| 蜜芽成人精品久久久视频| 牛牛精品视频| 久久99久久99精品免视看婷婷 | 蜜桃av秘一区二区三区| 黄色一级大片在线免费看国产| 黄色99| 人人摸人人艹| 欧美一区三区视频z| 欧美人成人无码| 男人天堂色男人| 日韩中文字幕熟妇人妻| 夜夜无码| 超碰在线观看免费| 亚洲成人一区| 日本99视频| 99久久99久久| 日韩操逼视频| 天天爽夜夜操| 翔田千里无码在线| 日本三级片视频不卡| 国产成人综合电影| 手机看片日韩| 欧美黑人操逼视频| 久草免费在线观看视频| 无码人妻一区二区一牛影视| 午夜精品18视频国产| 免费的av网站| 久操大香蕉| 亚洲AV无码成人网站国产网站| 黄色网页在线| 亚洲免费在线视频观看| 成人做爱免费看| 欧美中文网| 拍真实国产伦偷精品| 91香蕉| 亚洲男女啪啪视频| 草久在线视频| 夜夜躁狠狠躁| 亚洲成人久久久| 黄片免费视频| 国产一级AV免费观看| 91狠狠综合久久久| 黄色三极片| 91国语对白| 黄色3A片在线观看| 青草久久视频| 97中文字幕| 欧美一区免费| 成人在线视频免费| 国产精品人人人人| 日韩av免费在线观看| 亚洲成人电影AV| 国产在线视频一区二区| 无套免费视频欧美| 婷婷精品在线视频| 韩日一级17c| 99热热| 波多野结衣网址| 蜜臀久久精品久久久久| 91.xxxxx| 精品国产一级| 精品国产三级| 米奇狠狠干| 久久水蜜桃| 在线观看中文字幕一区| 九九成人视频| 蝌蚪窝在线视频免费观看| 欧美亚洲成人在线| 蜜桃精品一区二区| 久热精品视频在线观看| 日韩无码视频一区二区| 成年人观看视频| 99热这里是精品| 狠狠操av| 日韩欧美群交| 国产免费AV片在线无码免费看| 欧美成人中文字幕在线| 欧美午夜精品| 色骚综合| 精品中文字幕在线播放| 国产在线无码观看| 91大熟女91大腚女人| 水蜜桃网| 色色色五月婷婷| 一区二区三区高清无码| 北条麻妃青青久久| 亚洲色婷婷| 色片无码| 欧美一区二区三区激情| 91丨国产丨熟女熟女| 国产日韩在线播放| 婷婷五月在线视频| 在线免费看黄视频| 一级操逼黄色视频| 自拍乱伦| 一级片国产| 成人a毛片| 国产在线一| 亚洲福利影院| 成人做爰100部免费网站| 国产剧情一区二区| 欧美一区二区三区视频| 久久播视频| 国产性爱电影网| 一曲二曲三曲在线观看中文字| 午夜性爱福利视频| 人妻中文无码| 老熟妇搡BBBB搡BBBB| 日韩va亚洲va欧美va高清| 最近中文字幕| 国产无码AV| 日本AI高清无码在线观看网址| 亚洲国产天堂| 浮力影院av| 天堂一区| 超碰九九| 亚洲人成人无码.www粉色| 一区二区三区免费| 99精品丰满人妻无码| 午夜免费网站| 日韩一级视频| 亚洲免费黄色电影| 99视频在线精品| 亚洲AV无码成人网站国产网站| 天天综合国产| 不卡在线| 免费高清无码视频在线观看| 日韩成人网站| 亚洲有码在线| 男女操逼视频网站| 91福利影院| 高清无码视频在线观看| 西西444WWW无码大胆| 亚洲无码一卡二卡| 国产波霸爆乳一区二区| 人人妻人人爽| 久久无码一区二区三区| 国产口爆在线观看| 国产精品国产三级国产| 午夜成人大片| 最好看的2019中文在线大全电影| 欧美一級黃色A片免費看| 日韩精品成人免费观看视频| 黄色片在线视频| 久久草| 国产三级片在线视频| 女生操逼网站| 日本人妻中出| 国产黄色三级片| 中文字幕国产在线| 欧美一级久久| 4438成人网站| 久久艹精品视频| 成人性生活片| 国产青草视频在线观看| 草逼免费视频| 亚洲最大的成人网站| 男女乱伦视频| 激情综合网五月婷婷| 亚洲日韩乱码在线| 欧美色道| 大香蕉在线伊| 一区二区三区网站| 精品无码AV一区二区三区| 欧美性BBwBBwBBwHD| 91高清视频| 国产一级操逼视频| av影片在线播放| 台湾无码精品| 亚洲网站免费观看| 日韩人妻无码中文字幕| 唐山熟女工棚嗷嗷叫| 综合天堂网| 五月激情久久| 亚洲欧美第一页| 9i看片成人免费视频| 国产视频福利| 国产精品国产三级片| 五月激情六月婷婷| 超碰天天| 高清无码毛片| 成年人免费看视频| 亚洲A片一区二区三区电影网| 亚洲精品成人视频| 欧美精品一区二区三区使用方法| 午夜精品18视频国产| 蜜桃av无码一区三区| 中文字幕在线观看不卡| 国产乱子伦真实精品| 亚洲国精产品| 日韩性AV| 国产A片精品| 成人免费视频网站| 欧洲成人在线视频| 伊人成人网站| 天天干天天日天天干天天日| 无码白浆| AⅤ中文字幕在线免费观看| 操逼视频在线免费看| 亚洲AV无码一区东京热久久| 国产三级| 狼友视频免费在线观看| 国产资源在线观看| 人人做人人爽| 亚洲男同Gay一区二区| 成片免费观看视频大全| AV网站入口| 大香蕉日| 影音先锋天堂| 高清无码一区二区在线| 91成人看片| 亚洲系列| 日韩无码精品一区| 天堂在线中文| 精品福利一区二区三区| 国产成人精品无码区在线| 成人无码免费| 久久99精品久久久久| 成人黄色AV| 免费黄色成人网站| 人人操狠狠操| 人妻无码专区| 欧美撸一撸| 午夜AV福利| 久久久久久av| 亚洲无码高清免费| 毛片毛片毛片毛片毛片毛片| 午夜精品18码视频国产17c| 久久久成人影片| 青青草综合网| 91av在线免费播放| 午夜福利免费| 麻豆免费版在线观看| 18禁一区二区| 国产av天堂| 黄色片在线视频| 少妇白洁视频| 午夜无码鲁丝片午夜精品一区二区| 大香蕉在线啪啪| 永久免费黄色| 国产尤物在线观看| 99久久国| 人人爽网站| 视频一区18| 国产高清AV| 五月天婷婷黄色| 成人香蕉网| 综合黄色| 午夜无码精品一区二区三区99午| 99精品欲| 国产成人无码免费| 无码免费视频| 北条麻妃一区二区三区在线播放| 中文字字幕在线中文乱码| 欧美一级高清片免费一级a| 2018天天干天天操| 亚州AV在线| 午夜福利影片| 中韩AV在线免费观看| 欧亚免费视频| A片在线免费观看| 91视频网站免费| 免费无码视频在线观看| 视频一二三区| 另类罕见稀奇videos| 亚洲在线视频网站| 欧美一级特黄A片免费看| 亚洲国产精品一区二区三区| sm在线观看| 国产精品一麻了麻了| 毛茸茸BBBBBB毛茸茸| 青青草视频在线观看| 岛国AV免费在线| 日韩一级a片| 亚洲国产成人久久| www欧美| 久久成人影音先锋| 91女人18毛片水多的意思| 亚洲中文免费| 人妻久久久| 九色av| 日本亚洲黄色视频| 国产91黄色| 黄色片视频在线观看| 欧美XXXXBBBB| 国产一级a毛一级a毛观看视频网站 | 欧美人妻少妇| 日韩av综合| 69人妻人人澡人人爽人人精品| 北条麻妃九九九精品视频免费观看| 91成人电影在线| 综合激情av| 福利网站在线观看| 一级a黄色片| AV在线免费观看网站| 婷婷激情六月| 欧美一级免费| 成人做爰100片免费着| 韩国精品一区二区| 国产日韩一区二区三免费高清| 亚洲骚逼| 在线视频内射| 国产福利91精品一区二区三区| 操逼123首页| 香蕉综合网| 翔田千里无码播放| 人人操超碰| 黄色视频免费国产| 亚洲女与黑人正在播放| 婷婷综合素质二区| 国产老熟女高潮毛片A片仙踪林| 超碰在线观看免费| 尤物av在线| 亚洲AV电影网| 五月激情久久| 日批视频网站| 无码免费高清视频| 在线观看A片| 午夜福利国产| 无套内射在线免费观看| 日韩欧美一| 丰满人妻一区二区三区精品高清 | 18禁黄网站| www.91AV| 亚洲午夜久久久之蝌蚪窝| 思思热视频在线观看| 精品视频在线免费| 在线免费看AV| 国产婬片lA片www777| 手机av在线| 成人欧美精品| 久久久久久久香蕉视频| 高清无码做爱视频| 精品吃奶一区二区三区视频| 中文字幕第83页| 欧美午夜激情视频| 日韩成人在线视频| Japanese在线观看| 丁香花在线高清完整版视频 | 国精产品一二三区| 无码成人AV在线看免费| 牛牛精品一区二区| 欧美自拍一区| 91小仙女jK白丝袜呻吟| 性爱91视频| 国产精品大香蕉| 免费无码av| 成人视频高清无码| 日本一区二区三区在线视频| 欧美插菊花综合网| 成人播放视频| 99国产精品99久久久久久粉嫩 | 国产高清色| 69AV网站| 欧美精产国品一二三产品在哪买| 国产精品V亚洲精品V日韩精品| 嫩草视频在线观看免费网站| 日韩高清无码专区| 日韩综合区| 中文字幕第4页| 久久久久麻豆V国产精华液好用吗 色噜噜狠狠一区二区三区牛牛影视 | av中文在线观看| 骚网站在线观看| 韩国三级AV| 日韩成人A片| 无码人妻AⅤ一区二区三区 | 伊人亚洲| 大香蕉96| 黄色免费福利视频| 色女人天堂| 亚洲免费成人网| 91麻豆精品国产91久久久久久久久 | 午夜网页| 黄色视频网站在线播放| 激情无码视频| 国产精品婷婷午夜在线观看| 在线成年人视频| 无码一道本| 青娱乐在线视频精品| 日韩特黄片| 国产熟妇婬乱一区二区| 爱操综合| 97色色婷婷五月天| 免费a在线观看| 欧美日P| 国产一级在线免费观看| 国产suv精品一区二区6| 老司机视频在线视频18| 极品在线视频| 清清草视频| 婷婷五月精品| 欧一美一婬一伦一区二区三区自慰国 | 影音先锋色资源站| 青青草视频在线观看| www.狠狠爱| 国产尤物在线观看| 北条麻妃无码| 久久精品一区二区三区蜜芽的特点| 丰满熟妇高潮呻吟无码| 黄色毛片,男人天堂| 无码人妻一区二区三区免费n鬼沢| 日韩免费高清无码视频| 中韩AV在线免费观看| 大香蕉官网| 欧美极品另类| 久久精品视频播放| 亚洲天堂在线免费观看| 国产精品久久无码| 亚洲精品无码更新| 国产精品免费久久影院| 18国产免费视频在线观看| 一本色道久久无码人妻精品69| 在线观看视频日韩| www.97色色| 黑人巨粗进入疼哭A片| 色97| 球AV在线| 亚洲色欲色欲www在线成人网| 欧美日韩在线视频一区| 成人无码高清在线观看| 特黄网站| 麻豆亚洲AV成人无码久久精品| 久草大香蕉视频| 久久中文字幕电影| 黑人久久| 精品国产久| 久久免费视频网站| 一本色道88久久加勒比精品| 熟女一区二区| 天堂一区二区三区18| 欧美成人综合色| 成人视频123| 伊人久久大| 国产97在线观看| 日韩加勒比在线| 色999在线播放视频| 日本精品二区| 91人妻人人爽人人澡人人爽| 欧美日韩北条麻妃视频在线观看| 免费中文资源在线观看| 精品偷拍视频| 天天视频国产| 免费观看黄色AV| 午夜成人福利视频| 91精品国产一区| 色婷婷一级A片AAA毛片| 亚洲va在线∨a天堂va欧美va| 国产无码区| 波多野结衣一级| 国产成人精品国内自产拍免费看| 青青草国产| 日韩av免费看| 99久久国产热无码精品免费| 人妻av一区二区三区| 青草久久久| 手机成人在线视频| 丰滿人妻-区二区三区| 亚洲精品一线| 久久久久久网| 国产靠逼视频| 97国产成人| 极品在线视频| 黄片视频在线观看| 毛片视频网站| 色婷婷精品视频| 伊人久久免费| 国产无码小视频| 精品无码免费视频| 日韩一a| 91久久国产综合久久91| 日本爱爱小视频| 一级片免费网站| 91.xxxx| 欧美一级无码| 2025最新国产精品每日更新| 在线无码免费观看| 巜痴漢電車~凌脔版2| 成人久久综合| 9一区二区三区| 4080yy午夜理论片成人| 免费黄色成人网站| 一区二区三区四区无码视频| 射死你天天日| 亚洲国产成人一区二区| 羞羞涩漫无码免费网站入口| 人妻无码A| av在线天堂| 日韩操操| 久久狼友| 丰满人妻一区二区三区四区54| 777米奇视频| 日韩精彩视频| 韩日一级17c| 天堂中文字幕在线观看| 久久e热| 婷婷五月丁香色| 青青草大香蕉伊人| 人妻熟女88AⅤ| 又粗又硬又爽18级A片| 人人人操| 久久黄网| 豆花视频成人精品视频| 先锋影音中文字幕| 可以免费看的黄色| xxxx色| 亚欧美日韩| 尤物一区二区| 欧美视频在线观看| 青青草精品| 中文字幕国产av| 高清无码视频观看| 国产A级视频| 国语精品自拍| 爽爽午国产浪潮AV性色www| 女人自慰网站在线观看| 欧美一卡二卡| 乱婬妺妺躁爽A片| 琪琪色视频| 少妇搡BBBB搡BBB搡造水多| 免费A在线| 日本午夜无码| 久久先锋| 五月黄片| 国产拍拍视频| 欧美爆操视频| 亚洲黄色AV| 亚洲一级黄| 欧美精品网站| 亚洲性视频| 六月天婷婷| 免费无码av| 69av在线观看视频| 亚洲人免费视频| 亚洲色图15| 操逼操逼操逼操逼操逼操逼| 亚洲啊V| 午夜精品久久久久久不卡8050 | 九色PORN视频成人蝌蚪自拍 | 免费无码蜜臀在线观看| 97干网| 人妻中文字幕av| 黄页免费无码| 韩国三级无码| 18成人毛片| 黄频美女日本免费| 亚洲字幕| 成人在线免费观看视频| 欧美精品久久久久久| 国产在线小电影| 天天撸天天干| 黄片免费看视频| aaa久久| 精品孕妇孕交无码专区| 91大香蕉视频| 成人AV一区二区三区| 91麻豆视频在线观看| 亚洲黄色在线观看视频| 91视频在线观看免费大全| 特级西西444www| 亚洲99热| 欧美性爱日韩| 午夜精品成人| 久久亚洲Aⅴ成人无码国产丝袜 | 翔田千里91| 五月天婷婷成人| 国产美女福利| 毛片网站视频| 国产精品久久久大香蕉| 18禁网站免费观看| 精品视频免费在线观看| 欧美精品一级| 国产有码在线观看| 婷婷丁香花| 四虎午夜福利| 中文字幕成人网站中文字幕| 色五月天激情| 尤物看片| 欧美老妇XX| 亚洲中文字幕第一| 国产精品亚洲一区| 激情婷婷亚洲| 亚洲天堂AV2025| 成人久操| 久久久久久久久久久亚洲| 久色婷婷在线| 亚洲一级婬片A片AAAA网址| 51成人免费| 91丨人妻丨国产| 无码成人在线观看| 西西444大胆无码视频| 五月丁香花婷婷| 免费黄片无码| 亚洲精品三级在线观看| 裸体黄色一极大片| 亚洲色婷婷五月| 亚洲精品国产精品乱码不卡√香蕉| 黄色免费高清视频| 免费成人国产| 性满足BBwBBWBBw| www.777熟女人妻| 免费视频在线观看黄| 亚洲色综合网| 看免费黄色录像| 97人操| 亚洲第一成网站| 青青草网站在线观看| 2018中文字幕第一页| 91影音先锋| 国产黄片一区二区| 91在线无码精品在线看| 亚洲AV播放| 中文资源在线a中文| 色射网| 国产日韩欧美综合在线| 性插视频| 中文字幕免费高清在线观看| 69黄色视频| 91色色色| 无码一级片| 久热久| 久久永久免费精品人妻专区| 日本一区二区三| 日韩免费Av| 黄色一级片免费在线观看| 欧美性受XXXX黑人XYX性爽一| 五月婷婷视频在线观看| 日本免费色视频| 免费日韩无码| 色五月在线视频| 亚洲怡春院| 无码成人av| 亚洲激情综合网| 免费人妻视频| 国产成人精品AV| 国产高清做爱| 亚洲人妻电影一区| 熟妇高潮一区二区高潮| 日韩无码2024| 欧美污视频在线观看| 国产精品永久久久久久久久久| 日韩黄| 中文字幕乱码中文字幕| 久久久久久久91| 国产美女自拍视频| 无码人妻一区二区| 黄色激情五月天| 日韩另类| 91一区二区在线播放精品| 国产亚洲视频免费观看| 久精久久| 国产三级片无码| JULIA超乳JULIA无码| 特逼视频| 日韩精品五区| 色婷婷精品国产一区二区三区| 日逼视频| 手机AV免费| 欧美a片在线看| 亚洲第一成人网址| 欧美成人高清无码| 九九精品在线观看| 熟女视频网站| 欧美三级网| 免费AV网站| 日本高清视频www| 中文字幕一区二区三区人妻电影 | 躁BBB躁BBB躁BBBBBB日视频| 国产无码AV成在线| 成人在线毛片| 大香蕉精品在线视频| 国产在线拍揄自揄拍无码福利| 自拍偷拍网站| 亚洲欧美日韩黑料吃瓜在线观看| 成人影片亚洲| 免费在线观看黄色网址| 日韩在线你懂的| 性生活黄色视频| 亚洲视频中文字幕| 1024在线视频| 久久午夜无码鲁丝片午夜精品偷窥 | 日韩无码电影| 2026国产精品视频| 国产夫妻精品| A片免费网站| 人人妻人人操人人爽| 日本久久婷婷| 久久无码人妻精品一区二区三区| 极品少妇久久久| 日本高清无码在线观看| 亚洲成人av在线观看| 国产熟妇搡BBBB搡BBBB毛片 | 2018天天日天天操| www免费视频在线观看播放| 五月天一区二区| 婷婷五月天在线播放| 国产成人免费| 俺去吔| 日韩欧美高清无码| 国产又猛又黄又爽| 天天综合网久久综合网| 少妇搡BBBB搡BBB搡澳门| 日韩无码网站| 成人性生交大片免费看小芳| 色婷婷一二三精品A片| 麻豆精品一区| 色哟哟一区二区三区| 99热大香蕉| 中国人妻HDbute熟睡| 国产在线拍揄自揄拍无码男男| 欧美日韩在线看| 日韩欧美高清第一期| 亚洲一级二级三级| 九九九九AV| 日韩av免费在线| 欧美综合第一页| 三级三级久久三级久久18| 国产AV福利| 啪啪A片| 天天操天天日天天射| 无码秘人妻一区二区三-百度| 色婷婷电影| 国产精品欧美综合在线| 无码人妻一区二区三区三| 三级91| 高清无码自拍| 四虎av| 亚洲av无码精品| 中文字幕av一区| 亚洲成人AⅤ| 91无码在线观看| 在线看片AV| 色中色AV| 亚洲av网址| 欧美乱码| 黄网国产手机在线观看| 亚洲四房播| 国产精品高潮呻吟久久| av中文字幕网| 蜜桃在线视频| 五月天色婷婷丁香| 色欲网址| 亚洲性视频| 天天干天天日天天操| 日本天堂网在线观看| 丰满人妻一区二区三区四区54| 中出在线| 狠狠的操| 日韩在线观看免| 日本中文在线观看| 亚洲日韩中文无码| 日韩美毛片| 国产主播专区| 日韩a片在线观看| 天天做天天爱| 欧美一级黄片免费看| 午夜免费无码| 久久国产综合| 黄片免费大全| 亚洲性爱大全| 久草资源在线观看| 91麻豆精品传媒国产| 美国无码黄片| 国产精品成| 国产AV资源网| 欧美精品性爱| 成人毛片一区二区三区| 久久偷看各类wc女厕嘘嘘偷窃| 黄色小视频免费观看| 日本久久久久久久久视频在线观看 | 中文字幕永久在线| 无码av高清| 午夜操逼网| 自拍超碰| 日本精品三级| 天堂资源在线观看| 超碰99在线观看| 九九久久国产精品| 在线无码中文字幕| 东京热av在线| 色呦呦一欧美| 香蕉视频啪啪啪| 爱爱成人视频| 久久一级片| 日韩在线综合网| 91丨露脸丨熟女抽搐| 五月激情综合网| 成人综合激情| 草草影院国产第一页| 欧美大香蕉网| 日本色情网| 成人免费精品| 青青草成人在线| 四川妇搡BBBB搡BBBB| 日韩一级片免费| 亚洲欧美动漫| 一区二区三区小视频| 欧美AⅤ在线| 欧美成人精品AAA| 1024手机在线视频| 人妻福利导航| 亚洲日韩中文字幕| 婷婷黄色网| 亚洲成年视频| 中文字幕有码视频| 永久免费黄色视频网站| 天堂网在线观看| 波多野结衣不卡| 黄色A片网址| 蜜臀精品一区二区三区| 亚洲va在线va天堂va偷拍| 内射网站在线观看| 91精品丝袜久久久久久久久粉嫩| 久久免费精品| 日韩无码你懂的| 国内精品卡一卡二卡三| 黄色视频在线免费看| 先锋影音AV资源站| 日韩肏屄视频| 撸撸操在线视频观看只有精品| 探花极品无套大学生| 国产XXXXX| 2019狠狠操| 中国免费XXXX18| 五月丁香啪| 九色丨蝌蚪丨老版熟女| 色色爱爱| 黄色在线欣赏| 夜夜嗨Av禁果Av粉嫩AV懂色Av| 日本少妇无码| 天天天天色| 可以在线观看的AV| 日韩高清在线| 六十路老熟女码视频| 99国产精品免费视频观看8| 黄色大片AV| 男人天堂免费视频| 国产做受91| 欧洲AV片|