偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java最全面試題之Spring篇

開(kāi)發(fā) 后端
大家好,我是Java最全面試題庫(kù)的提褲姐,今天這篇是JavaEE面試題系列的第三篇,主要總結(jié)了Spring相關(guān)的問(wèn)題。

[[336521]]

開(kāi)篇介紹

大家好,我是Java最全面試題庫(kù)的提褲姐,今天這篇是JavaEE面試題系列的第三篇,主要總結(jié)了Spring相關(guān)的問(wèn)題,在后續(xù),會(huì)沿著第一篇開(kāi)篇的知識(shí)線路一直總結(jié)下去,做到日更!如果我能做到百日百更,希望你也可以跟著百日百刷,一百天養(yǎng)成一個(gè)好習(xí)慣。

談?wù)勀銓?duì) Spring 的理解?

Spring 是一個(gè)開(kāi)源框架,為簡(jiǎn)化企業(yè)級(jí)應(yīng)用開(kāi)發(fā)而生。Spring 可以是使簡(jiǎn)單的 JavaBean 實(shí)現(xiàn)以前只有 EJB 才能實(shí)現(xiàn)的功能。Spring 是一個(gè) IOC 和 AOP 容器框架。

Spring 容器的主要核心是:

  •  控制反轉(zhuǎn)(IOC),傳統(tǒng)的 java 開(kāi)發(fā)模式中,當(dāng)需要一個(gè)對(duì)象時(shí),我們會(huì)自己使用 new 或者 getInstance 等直接或者間接調(diào)用構(gòu)造方法創(chuàng)建一個(gè)對(duì)象。而在 spring 開(kāi)發(fā)模式中,spring 容器使用了工廠模式為我們創(chuàng)建了所需要的對(duì)象,不需要我們自己創(chuàng)建了,直接調(diào)用 spring 提供的對(duì)象就可以了,這是控制反轉(zhuǎn)的思想。
  •  依賴(lài)注入(DI),spring 使用 javaBean 對(duì)象的 set 方法或者帶參數(shù)的構(gòu)造方法為我們?cè)趧?chuàng)建所需對(duì)象時(shí)將其屬性自動(dòng)設(shè)置所需要的值的過(guò)程,就是依賴(lài)注入的思想。
  •  面向切面編程(AOP),在面向?qū)ο缶幊蹋╫op)思想中,我們將事物縱向抽成一個(gè)個(gè)的對(duì)象。而在面向切面編程中,我們將一個(gè)個(gè)的對(duì)象某些類(lèi)似的方面橫向抽成一個(gè)切面,對(duì)這個(gè)切面進(jìn)行一些如權(quán)限控制、事物管理,記錄日志等。公用操作處理的過(guò)程就是面向切面編程的思想。AOP 底層是動(dòng)態(tài)代理,如果是接口采用 JDK 動(dòng)態(tài)代理,如果是類(lèi)采用CGLIB 方式實(shí)現(xiàn)動(dòng)態(tài)代理。

Spring 中的設(shè)計(jì)模式有哪些?

工廠模式:

BeanFactory就是簡(jiǎn)單工廠模式的體現(xiàn),用來(lái)創(chuàng)建對(duì)象的實(shí)例;

單例模式:

Bean默認(rèn)為單例模式。

代理模式:

Spring的AOP功能用到了JDK的動(dòng)態(tài)代理和CGLIB字節(jié)碼生成技術(shù);

模板方法:

用來(lái)解決代碼重復(fù)的問(wèn)題。比如. RestTemplate, JmsTemplate, JpaTemplate。

觀察者模式:

定義對(duì)象鍵一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都會(huì)得到通知被制動(dòng)更新,如Spring中l(wèi)istener的實(shí)現(xiàn)ApplicationListener。

Spring 的常用注解?

@Required:該注解應(yīng)用于設(shè)值方法

@Autowired:該注解應(yīng)用于有值設(shè)值方法、非設(shè)值方法、構(gòu)造方法和變量。

@Qualifier:該注解和@Autowired 搭配使用,用于消除特定 bean 自動(dòng)裝配的歧義

Spring bean 的生命周期?

  •  bean 定義:在配置文件里面用<bean></bean>來(lái)進(jìn)行定義。
  •  bean 初始化:有兩種方式初始化:

①在配置文件中通過(guò)指定 init-method 屬性來(lái)完成

②實(shí)現(xiàn) org.springframwork.beans.factory.InitializingBean 接口

  •  bean 調(diào)用:有三種方式可以得到 bean 實(shí)例,并進(jìn)行調(diào)用
  •  bean 銷(xiāo)毀:銷(xiāo)毀有兩種方式

①使用配置文件指定的 destroy-method 屬性

②實(shí)現(xiàn) org.springframwork.bean.factory.DisposeableBean 接口

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

  •  編程式事務(wù),在代碼中硬編碼。
  •  聲明式事務(wù),在配置文件中配置

聲明式事務(wù)又分為:

①基于XML的聲明式事務(wù)

②基于注解的聲明式事務(wù)

Spring的事務(wù)傳播行為有哪些?

1、PROPAGATION_REQUIRED:如果當(dāng)前沒(méi)有事務(wù),就創(chuàng)建一個(gè)新事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù),該設(shè)置是最常用的設(shè)置。

2、PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù),如果當(dāng)前不存在事務(wù),就以非事務(wù)執(zhí)行。

3、PROPAGATION_MANDATORY:支持當(dāng)前事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù),如果當(dāng)前不存在事務(wù),就拋出異常。

4、PROPAGATION_REQUIRES_NEW:創(chuàng)建新事務(wù),無(wú)論當(dāng)前存不存在事務(wù),都創(chuàng)建新事務(wù)。

5、PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

6、PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

7、PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒(méi)有事務(wù),則按REQUIRED屬性執(zhí)行。

Spring事務(wù)的隔離級(jí)別?

1、ISOLATION_DEFAULT:這是個(gè) PlatfromTransactionManager 默認(rèn)的隔離級(jí)別,使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別。

2、ISOLATION_READ_UNCOMMITTED:讀未提交,允許另外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。

3、ISOLATION_READ_COMMITTED:讀已提交,保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另一事務(wù)讀取,而且能看到該事務(wù)對(duì)已有記錄的更新。

4、ISOLATION_REPEATABLE_READ:可重復(fù)讀,保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另一事務(wù)讀取,但是不能看到該事務(wù)對(duì)已有記錄的更新。

5、ISOLATION_SERIALIZABLE:一個(gè)事務(wù)在執(zhí)行的過(guò)程中完全看不到其他事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的更新。

Spring 的通知是什么?有哪幾種類(lèi)型?

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

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

  •  before:前置通知,在一個(gè)方法執(zhí)行前被調(diào)用。
  •  after: 在方法執(zhí)行之后調(diào)用的通知,無(wú)論方法執(zhí)行是否成功。
  •  after-returning: 僅當(dāng)方法成功完成后執(zhí)行的通知。
  •  after-throwing: 在方法拋出異常退出時(shí)執(zhí)行的通知。
  •  around: 在方法執(zhí)行之前和之后調(diào)用的通知。

什么是 Spring IOC?IOC的優(yōu)點(diǎn)是什么?

IOC :

控制反轉(zhuǎn),Spring IOC 負(fù)責(zé)創(chuàng)建對(duì)象,管理對(duì)象。通過(guò)依賴(lài)注入(DI),裝配對(duì)象,配置對(duì)象,并且管理這些對(duì)象的整個(gè)生命周期。

優(yōu)點(diǎn):

IOC 或 依賴(lài)注入把應(yīng)用的代碼量降到最低。它使應(yīng)用容易測(cè)試,單元測(cè)試不再需要單例和 JNDI 查找機(jī)制。最小的代價(jià)和最小的侵入性使松散耦合得以實(shí)現(xiàn)。IOC 容器支持加載服務(wù)時(shí)的餓漢式初始化和懶加載。

BeanFactory 與 AppliacationContext 有什么區(qū)別?

BeanFactory

基礎(chǔ)類(lèi)型的 IOC 容器,提供完成的 IOC 服務(wù)支持。如果沒(méi)有特殊指定,默認(rèn)采用延遲初始化策略。相對(duì)來(lái)說(shuō),容器啟動(dòng)初期速度較快,所需資源有限。

ApplicationContext

ApplicationContext 是在 BeanFactory 的基礎(chǔ)上構(gòu)建,是相對(duì)比較高級(jí)的容器實(shí)現(xiàn),除了 BeanFactory 的所有支持外,ApplicationContext 還提供了事件發(fā)布、國(guó)際化支持等功能。ApplicationContext 管理的對(duì)象,在容器啟動(dòng)后默認(rèn)全部初始化并且綁定完成。

Spring 支持的幾種 bean 的作用域?

Spring 框架支持以下五種 bean 的作用域:

singleton : bean 在每個(gè) Spring ioc 容器中只有一個(gè)實(shí)例。

prototype:一個(gè) bean 的定義可以有多個(gè)實(shí)例。

request:每次 http 請(qǐng)求都會(huì)創(chuàng)建一個(gè) bean,該作用域僅在基于 web 的 Spring ApplicationContext 情形下有效。

session : 在一個(gè)HTTP Session中 , 一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例。 該作用域僅在基于web 的Spring ApplicationContext 情形下有效。

global-session:在一個(gè)全局的 HTTP Session 中,一個(gè) bean 定義對(duì)應(yīng)一個(gè)實(shí)例。該作用域僅在基于 web 的Spring ApplicationContext 情形下有效。

缺省的 Spring bean 的作用域是 Singleton。

Spring 框架中的單例 bean 是線程安全的嗎?

不是線程安全的。

當(dāng)存在共享變量時(shí),大家都能去調(diào)用,此時(shí)就存在線程安全問(wèn)題。

什么是 bean 的自動(dòng)裝配?有哪些方式自動(dòng)裝配?

自動(dòng)裝配:

無(wú)須在 Spring 配置文件中描述 javaBean 之間的依賴(lài)關(guān)系(如配置<property>、<constructor-arg>)。IOC 容器會(huì)自動(dòng)建立 javabean 之間的關(guān)聯(lián)關(guān)系。

五種自動(dòng)裝配的方式:

  •  no:默認(rèn)的方式是不進(jìn)行自動(dòng)裝配,通過(guò)顯式設(shè)置 ref 屬性來(lái)進(jìn)行裝配。
  •  byName:通過(guò)參數(shù)名自動(dòng)裝配,Spring 容器在配置文件中發(fā)現(xiàn) bean 的 autowire 屬性被設(shè)置成 byname,

之后容器試圖匹配、裝配和該 bean 的屬性具有相同名字的 bean。

  •  byType:通過(guò)參數(shù)類(lèi)型自動(dòng)裝配,Spring 容器在配置文件中發(fā)現(xiàn) bean 的 autowire 屬性被設(shè)置成 byType,

之后容器試圖匹配、裝配和該 bean 的屬性具有相同類(lèi)型的 bean。如果有多個(gè) bean 符合條件,則拋出錯(cuò)誤。

  • constructor:這個(gè)方式類(lèi)似于 byType, 但是要提供給構(gòu)造器參數(shù),如果沒(méi)有確定的帶參數(shù)的構(gòu)造器參數(shù)類(lèi)

型,將會(huì)拋出異常。

  •  autodetect:首先嘗試使用 constructor 來(lái)自動(dòng)裝配,如果無(wú)法工作,則使用 byType 方式。

什么是spring 的 AOP?

AOP:全稱(chēng) Aspect Oriented Programming,即:面向切面編程。

AOP是OOP(Object Oriented Programming,面向?qū)ο缶幊蹋┑难永m(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。

利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。

把我們程序重復(fù)的代碼抽取出來(lái),在需要執(zhí)行的時(shí)候,使用動(dòng)態(tài)代理的技術(shù),在不修改源碼的基礎(chǔ)上,對(duì)我們的已有方法進(jìn)行增強(qiáng)。

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

AOP 技術(shù)利用一種稱(chēng)為"橫切"的技術(shù),剖解開(kāi)封裝的對(duì)象內(nèi)部,并將那些影響了多個(gè)類(lèi)的公共行為封裝到一個(gè)可重用模塊,并將其命名為"Aspect",即切面。所謂"切面",簡(jiǎn)單說(shuō)就是那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái),便于減少系統(tǒng)的重復(fù)代碼,降低模塊之間的耦合度,并有利于未來(lái)的可操作性和可維護(hù)性。

使用"橫切"技術(shù),AOP 把軟件系統(tǒng)分為兩個(gè)部分:核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)。

業(yè)務(wù)處理的主要流程是核心關(guān)注點(diǎn),與之關(guān)系不大的部分是橫切關(guān)注點(diǎn)。

橫切關(guān)注點(diǎn)的一個(gè)特點(diǎn)是,他們經(jīng)常發(fā)生在核心關(guān)注點(diǎn)的多處,而各處基本相似,比如權(quán)限認(rèn)證、日志、事物。

AOP 的作用在于分離系統(tǒng)中的各種關(guān)注點(diǎn),將核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)分離開(kāi)來(lái)。

AOP 核心就是切面,它將多個(gè)類(lèi)的通用行為封裝成可重用的模塊,該模塊含有一組 API 提供橫切功能。比如,一個(gè)日志模塊可以被稱(chēng)作日志的 AOP 切面。根據(jù)需求的不同,一個(gè)應(yīng)用程序可以有若干切面。在 Spring AOP 中,切面通過(guò)帶有@Aspect 注解的類(lèi)實(shí)現(xiàn)。

經(jīng)典應(yīng)用:事務(wù)管理、性能監(jiān)視、安全檢查、緩存 、日志等

AOP的實(shí)現(xiàn)方式?

aop底層采用代理機(jī)制進(jìn)行實(shí)現(xiàn)。

  •  接口 + 實(shí)現(xiàn)類(lèi):spring采用 jdk 的動(dòng)態(tài)代理Proxy。
  •  實(shí)現(xiàn)類(lèi):spring 采用 cglib字節(jié)碼增強(qiáng)。

AOP中有哪些概念?

①Joinpoint( 連接點(diǎn)):被攔截到的點(diǎn)。在 spring 中,這些點(diǎn)指的是方法,因?yàn)?spring 只支持方法類(lèi)型的連接點(diǎn)。

②Pointcut( 切入點(diǎn)):要對(duì)哪些 Joinpoint 進(jìn)行攔截,即被增強(qiáng)的連接點(diǎn)。

③Advice( 通知/ 增強(qiáng)):攔截到 Joinpoint 之后所要做的事情,及增強(qiáng)代碼。

④Introduction(引介):引介是一種特殊的通知在不修改類(lèi)代碼的前提下, Introduction 可以在運(yùn)行期為類(lèi)動(dòng)態(tài)地添加一些方法或 Field。

⑤Target(目標(biāo)對(duì)象):目標(biāo)類(lèi),需要被代理的類(lèi)

⑥Weaving(織入):是指把增強(qiáng)應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理對(duì)象的過(guò)程。spring 采用動(dòng)態(tài)代理織入,而 AspectJ 采用編譯期織入和類(lèi)裝載期織入。

⑦Proxy(代理):代理類(lèi),一個(gè)類(lèi)被 AOP 織入增強(qiáng)后,就產(chǎn)生一個(gè)結(jié)果代理類(lèi)。

⑧Aspect( 切面):是切入點(diǎn)和通知(引介)的結(jié)合。

在Spring中怎么定義類(lèi)的作用域?

當(dāng)定義一個(gè)<bean> 在 Spring 里,可以給這個(gè) bean 聲明一個(gè)作用域。它可以通過(guò) bean 定義中的 scope 屬性來(lái)定義。

當(dāng) Spring 要在需要的時(shí)候每次生產(chǎn)一個(gè)新的 bean 實(shí)例,bean 的 scope 屬性被指定為 prototype。

一個(gè) bean 每次使用的時(shí)候必須返回同一個(gè)實(shí)例,這個(gè) bean 的 scope 屬性被指定為 singleton。 

 

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2022-08-30 17:41:53

中間件系統(tǒng)Java

2010-12-29 10:33:51

Oracle

2024-06-14 09:53:02

2009-08-01 23:17:19

ASP.NET面試題目ASP.NET

2015-09-02 09:32:56

java線程面試

2022-01-18 08:16:52

Web 前端JavaScript

2009-06-06 18:34:05

java面試題

2009-06-06 18:36:02

java面試題

2020-06-24 09:55:17

Web面試前端

2021-06-09 07:56:51

JvmJVM面試題Java

2020-06-04 14:40:40

面試題Vue前端

2017-03-29 09:08:25

Spring筆記

2011-11-21 09:19:39

Java常量池面試題

2015-05-11 09:38:42

.NET高級(jí)工程師面試題

2022-05-08 19:58:10

JSONPJavaScript

2013-05-29 10:23:36

Android開(kāi)發(fā)移動(dòng)開(kāi)發(fā)Java面試題

2011-03-24 13:27:37

SQL

2023-11-13 07:37:36

JS面試題線程

2016-05-05 17:45:43

Spring面試題答案

2024-10-11 17:09:27

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)