日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring、SpringBoot常见面试题与答案

發(fā)布時(shí)間:2025/3/12 javascript 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring、SpringBoot常见面试题与答案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Spring

Spring Bean 的作用域有哪些?它的注冊(cè)方式有幾種?

  • Spring 容器中管理一個(gè)或多個(gè) Bean,這些 Bean 的定義表示為 BeanDefinition 對(duì)象,具體包含以下重要信息:
    • Bean 的實(shí)際實(shí)現(xiàn)類;
    • Bean 的引用或者依賴項(xiàng);
    • Bean 的作用范圍;
      • singleton:單例(默認(rèn));
      • prototype:原型,每次調(diào)用bean都會(huì)創(chuàng)建新實(shí)例;
      • request:每次http請(qǐng)求都會(huì)創(chuàng)建新的bean;
      • session:同一個(gè)http session共享一個(gè)bean對(duì)象;
      • application:全局的web作用域。
  • 三種注冊(cè)方式:XML配置、注解、API(實(shí)現(xiàn)指定接口)。

bean的生命周期是什么?

  • bean的初始化流程由容器\客戶端(非懶加載\懶加載)調(diào)用 BeanFactory 的 getBean() 方法觸發(fā)。以getBean()方法為入口,通過(guò)遞歸,一層一層地完成bean的創(chuàng)建和依賴注入,直到最后完成當(dāng)前bean的創(chuàng)建;
    • getBean();
    • 調(diào)用bean的構(gòu)造函數(shù);
    • 依賴注入;
    • bean初始化前置方法;
    • bean初始化,主要執(zhí)行afterPropertiesSet方法,dubbo的注冊(cè)與發(fā)現(xiàn)都是以該方法為入口;
    • bean初始化后置方法,AOP代理對(duì)象在此處創(chuàng)建;
    • 使用bean;
    • 銷毀bean(需要主動(dòng)發(fā)起)。

Spring怎么解決循環(huán)依賴?

  • Spring的循環(huán)依賴的理論依據(jù)其實(shí)是基于Java的引用傳遞,當(dāng)我們獲取到對(duì)象的引用時(shí),對(duì)象的field或則屬性是可以延后設(shè)置的(但是構(gòu)造器必須是在獲取引用之前執(zhí)行);
  • Spring通過(guò)三級(jí)緩存解決循環(huán)依賴問(wèn)題:
    • singletonObjects:單例對(duì)象的cache;
    • earlySingletonObjects:提前暴光的單例對(duì)象的Cache;
    • singletonFactories:單例對(duì)象工廠的cache,可以用來(lái)創(chuàng)建半成品對(duì)象(只執(zhí)行構(gòu)造器,不填充屬性);
  • Spring首先從一級(jí)緩存singletonObjects中獲取,如果獲取不到,并且對(duì)象正在創(chuàng)建中,就再?gòu)亩?jí)緩存earlySingletonObjects中獲取,如果還是獲取不到且允許singletonFactories通過(guò)getObject()獲取,就從三級(jí)緩存singletonFactory.getObject()獲取,如果獲取到了則從singletonFactories中移除,并放入earlySingletonObjects中。其實(shí)也就是從三級(jí)緩存移動(dòng)到了二級(jí)緩存。

Spring能否解決構(gòu)造器的循環(huán)依賴?

  • 不能,例如“A的構(gòu)造方法中依賴了B的實(shí)例對(duì)象,同時(shí)B的構(gòu)造方法中依賴了A的實(shí)例對(duì)象”;
  • 因?yàn)榧尤雜ingletonFactories三級(jí)緩存的前提是執(zhí)行了構(gòu)造器,所以構(gòu)造器的循環(huán)依賴Spring無(wú)法解決。

BeanFactory與FactoryBean的區(qū)別是什么?

  • BeanFactory是Spring中IOC容器最頂層的接口,它定義了IOC容器的基本功能規(guī)范;
  • FactoryBean是工廠類接口,當(dāng)你只是想簡(jiǎn)單的去構(gòu)造Bean,并且繞過(guò)原有初始化的復(fù)雜流程時(shí),可以通過(guò)實(shí)現(xiàn)FactoryBean來(lái)創(chuàng)建bean。Spring內(nèi)部就有很多bean是通過(guò)FactoryBean來(lái)創(chuàng)建的,方便內(nèi)部的使用。

JDK動(dòng)態(tài)代理與CGLIB的區(qū)別是什么?

  • JDK Proxy 是 Java 語(yǔ)言自帶的功能,無(wú)需通過(guò)加載第三方類實(shí)現(xiàn);
  • Java 對(duì) JDK Proxy 提供了穩(wěn)定的支持,并且會(huì)持續(xù)的升級(jí)和更新 JDK Proxy,例如 Java 8 版本中的 JDK Proxy 性能相比于之前版本提升了很多;
  • JDK Proxy 是通過(guò)攔截器加反射的方式實(shí)現(xiàn)的;
  • JDK Proxy 只能代理繼承接口的類;
  • JDK Proxy 實(shí)現(xiàn)和調(diào)用起來(lái)比較簡(jiǎn)單;
  • CGLib 是第三方提供的工具,基于 ASM 實(shí)現(xiàn)的,性能比較高;
  • CGLib 無(wú)需通過(guò)接口來(lái)實(shí)現(xiàn),它是通過(guò)實(shí)現(xiàn)子類的方式來(lái)完成調(diào)用的。

Spring事務(wù)的傳播屬性有哪些?

  • 所謂Spring事務(wù)的傳播屬性,就是定義在存在多個(gè)事務(wù)同時(shí)存在的時(shí)候,Spring應(yīng)該如何處理這些事務(wù)的行為。
常量名稱常量解釋
PROPAGATION_REQUIRED支持當(dāng)前事務(wù)。如果當(dāng)前有事務(wù),則加入當(dāng)前事務(wù);如果當(dāng)前沒(méi)有事務(wù),就新建一個(gè)事務(wù)。這是最常見(jiàn)的選擇,也是 Spring 事務(wù)默認(rèn)的傳播屬性。
PROPAGATION_REQUIRES_NEW新建事務(wù)。即使當(dāng)前有事務(wù),會(huì)額外新建一個(gè)事務(wù),新建的事務(wù)和原事務(wù)相互獨(dú)立,互不影響。
PROPAGATION_SUPPORTS支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行。
PROPAGATION_MANDATORY支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就拋出異常。
PROPAGATION_NOT_SUPPORTED以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
PROPAGATION_NEVER以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
PROPAGATION_NESTED嵌套事務(wù)。將創(chuàng)建一個(gè)依賴于外層事務(wù)的子事務(wù),子事務(wù)的提交與回滾由外層事務(wù)控制,但它無(wú)法影響外層事務(wù)。當(dāng)外層事務(wù)提交或回滾時(shí),子事務(wù)也會(huì)連帶提交和回滾。

SpringBoot

SpringBoot與Spring的區(qū)別是什么?

  • Spring Boot 本質(zhì)上是 Spring 框架的延伸和擴(kuò)展,它的誕生是為了簡(jiǎn)化 Spring 框架初始搭建以及開(kāi)發(fā)的過(guò)程,使用它可以不再依賴 Spring 應(yīng)用程序中的 XML 配置,為更快、更高效的開(kāi)發(fā) Spring 提供更加有力的支持。
    • 更快速的構(gòu)建能力:Spring Boot 提供了更多的 Starters 用于快速構(gòu)建業(yè)務(wù)框架,Starters 可以理解為啟動(dòng)器,它包含了一系列可以集成到應(yīng)用里面的依賴包,你可以一站式集成 Spring 及其他技術(shù),而不需要到處找依賴包。
    • 起步依賴:在創(chuàng)建 Spring Boot 時(shí)可以直接勾選依賴模塊,這樣在項(xiàng)目初始化時(shí)就會(huì)把相關(guān)依賴直接添加到項(xiàng)目中,大大縮短了查詢并添加依賴的時(shí)間;
    • 內(nèi)嵌容器支持:Spring Boot 內(nèi)嵌了 Tomcat、Jetty、Undertow 三種容器,其默認(rèn)嵌入的容器是 Tomcat;
    • Actuator 監(jiān)控:可以監(jiān)控應(yīng)用程序的運(yùn)行狀況,或者內(nèi)存、線程池、Http 請(qǐng)求統(tǒng)計(jì)等。

SpringBoot約定優(yōu)于配置的體現(xiàn)是什么?

  • Maven的目錄結(jié)構(gòu):
    • 默認(rèn)有resources文件夾存放配置文件;
    • 默認(rèn)打包方式為jar。
  • 默認(rèn)的配置文件:application.properties 或 application.yml 文件;
  • 默認(rèn)通過(guò) spring.profiles.active 屬性來(lái)決定運(yùn)行環(huán)境時(shí)的配置文件;
  • EnableAutoConfiguration 默認(rèn)對(duì)于依賴的 starter 進(jìn)行自動(dòng)裝載;
  • spring-boot-start-web 中默認(rèn)包含 spring-mvc 相關(guān)依賴以及內(nèi)置的 tomcat 容器,使得構(gòu)建一個(gè) web 應(yīng)用更加簡(jiǎn)單。

SpringBoot 有幾種讀取配置文件內(nèi)容的方法?

  • 注入Environment對(duì)象:通過(guò)Environment 的 getProperty() 方法讀取指定配置 Key 的內(nèi)容;
  • 使用@Value注解,實(shí)現(xiàn)單個(gè)配置的注入;
  • 使用@ConfigurationProperties注解,實(shí)現(xiàn)一組配置的注入。

SpringBoot的自動(dòng)裝配機(jī)制是什么?

  • 自動(dòng)裝配指的是SpringBoot會(huì)將約定配置下的bean自動(dòng)加載到spring容器中;
  • 自動(dòng)裝配的核心注解是@SpringBootApplication,它又由@SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan組成;
    • @SpringBootConfiguration:本質(zhì)是@Configuration,標(biāo)注了@Configuration 的 Java 類都是一個(gè) JavaConfig 配置類,在配置類中,任何一個(gè)標(biāo)注了@Bean 的方法,其返回值都會(huì)作為 Bean 定義注冊(cè)到 Spring IOC 容器中;
    • @ComponentScan:掃描指定路徑下標(biāo)識(shí)了需要裝配的類,自動(dòng)裝配到 Spring IOC容器中,用于標(biāo)識(shí)類需要裝配的注解有:@Component、@Service、@Controller、@Repository;
    • @EnableAutoConfiguration:同樣是一個(gè)復(fù)合注解,主要分為@AutoConfigurationPackage和@Import;
      • @AutoConfigurationPackage:該注解修飾的類所在的 package 會(huì)作為自動(dòng)裝配的 package 管理;
      • @Import:可以把多個(gè)分開(kāi)的配置合并到一個(gè)配置中,而在@EnableAutoConfiguration中@Import導(dǎo)入了AutoConfigurationImportSelector類,它實(shí)現(xiàn)了Spring基于SPI的導(dǎo)入方式。
        • SPI配置文件的為META-INF/spring.factories,內(nèi)容為k-v屬性,key 為@EnableAutoConfiguration注解的全限定名,value為需要自動(dòng)裝配的配置類,需要被@Configuration修飾,多個(gè)用逗號(hào)分隔。

SpringBoot有哪些按條件裝配的方式?

  • @Conditional:注解中只有一個(gè)class類型的屬性,這個(gè) class 便是需要實(shí)現(xiàn)條件判斷的類,這個(gè)類必須實(shí)現(xiàn) Condition 接口的 matches 方法,該方法會(huì)返回一個(gè)boolean類型值,通過(guò)這個(gè)值來(lái)判斷條件是否成立。
  • Conditional其它相關(guān)注解:
注解名稱描述
@ConditionalOnBean在某個(gè) bean 存在的時(shí)候
@ConditionalOnMissingBean在某個(gè) bean 不存在的時(shí)候
@ConditionalOnClass當(dāng)前 classPath 下可以找到某個(gè) class 的時(shí)候
@ConditionalOnMissingClass當(dāng)前 classPath 下無(wú)法找到某個(gè) class 的時(shí)候
@ConditionalOnResource當(dāng)前 classPath 下是否存在某個(gè)資源文件
@ConditionalOnProperty當(dāng)前 JVM 是否包含某個(gè)屬性值
@ConditionalOnWebApplication當(dāng)前 Spring context 是否是 web 應(yīng)用程序
  • 除了通過(guò)注解聲明,還可以通過(guò)SPI方式聲明
    • 在 META-INF/spring-autoconfigure-metadata.properties中配置;
  • AutoConfigurationImportSelector在加載自動(dòng)裝配bean時(shí),會(huì)先掃描spring-autoconfigure-metadata.propertie進(jìn)行過(guò)濾,再加載 spring.factories。

如何自定義一個(gè)starter?

  • 創(chuàng)建 Starter 項(xiàng)目;
  • 項(xiàng)目創(chuàng)建完后定義 Starter 需要的配置(Properties)類,比如數(shù)據(jù)庫(kù)的連接信息;
  • 編寫自動(dòng)配置類,自動(dòng)配置類就是獲取配置,根據(jù)配置來(lái)自動(dòng)裝配 Bean;
  • 編寫 spring.factories 文件加載自動(dòng)配置類,Spring 啟動(dòng)的時(shí)候會(huì)掃描 spring.factories 文件,加載文件中配置的類;
  • 編寫配置提示文件 spring-configuration-metadata.json(不是必須的),在添加配置的時(shí)候,我們想要知道具體的配置項(xiàng)是什么作用,可以通過(guò)編寫提示文件來(lái)提示;
  • 最后就是使用,在項(xiàng)目中引入自定義 Starter 的 Maven 依賴,增加配置值后即可使用。
  • 如何實(shí)現(xiàn)starter的按需加載?

    • 創(chuàng)建自定義注解@Enable**注解;
      • 以 UserClient 為例, 創(chuàng)建自定義注解 @EnableUserClient;
      • 在注解中通過(guò)@Import導(dǎo)入我們的自動(dòng)配置類;
      • 這樣只有我們聲明了@EnableUserClient,才會(huì)導(dǎo)入我們需要的bean。
    • 基于@ConditionalOn系列注解實(shí)現(xiàn)按條件注入。

    內(nèi)置容器的啟動(dòng)流程是什么?

    • 啟動(dòng)一個(gè)springboot項(xiàng)目,首先運(yùn)行Application啟動(dòng)類的main方法,main 方法中調(diào)用了SpringApplication.run方法;
    • run方法中又調(diào)用了最核心的refreshContext方法,這里面又調(diào)用了我們最熟悉了spring容器啟動(dòng)模板方法refresh方法;
    • 默認(rèn)SpringBoot會(huì)啟動(dòng)tomcat,在refresh中的onRefresh()中執(zhí)行;
    • onRefresh調(diào)用了createWebServer()方法,通過(guò)TomcatServletWebServerFactory開(kāi)始創(chuàng)建Tomcat實(shí)例;
    • 最后在refresh方法中的finishRefresh()中調(diào)用Tomcat實(shí)例的start邏輯,并將應(yīng)用上下文發(fā)布的webServer中,至此完成Tomcat的啟動(dòng)。

    總結(jié)

    以上是生活随笔為你收集整理的Spring、SpringBoot常见面试题与答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。