當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring、SpringBoot常见面试题与答案
生活随笔
收集整理的這篇文章主要介紹了
Spring、SpringBoot常见面试题与答案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Spring
Spring Bean 的作用域有哪些?它的注冊方式有幾種?
- Spring 容器中管理一個或多個 Bean,這些 Bean 的定義表示為 BeanDefinition 對象,具體包含以下重要信息:
- Bean 的實際實現類;
- Bean 的引用或者依賴項;
- Bean 的作用范圍;
- singleton:單例(默認);
- prototype:原型,每次調用bean都會創建新實例;
- request:每次http請求都會創建新的bean;
- session:同一個http session共享一個bean對象;
- application:全局的web作用域。
- 三種注冊方式:XML配置、注解、API(實現指定接口)。
bean的生命周期是什么?
- bean的初始化流程由容器\客戶端(非懶加載\懶加載)調用 BeanFactory 的 getBean() 方法觸發。以getBean()方法為入口,通過遞歸,一層一層地完成bean的創建和依賴注入,直到最后完成當前bean的創建;
- getBean();
- 調用bean的構造函數;
- 依賴注入;
- bean初始化前置方法;
- bean初始化,主要執行afterPropertiesSet方法,dubbo的注冊與發現都是以該方法為入口;
- bean初始化后置方法,AOP代理對象在此處創建;
- 使用bean;
- 銷毀bean(需要主動發起)。
Spring怎么解決循環依賴?
- Spring的循環依賴的理論依據其實是基于Java的引用傳遞,當我們獲取到對象的引用時,對象的field或則屬性是可以延后設置的(但是構造器必須是在獲取引用之前執行);
- Spring通過三級緩存解決循環依賴問題:
- singletonObjects:單例對象的cache;
- earlySingletonObjects:提前暴光的單例對象的Cache;
- singletonFactories:單例對象工廠的cache,可以用來創建半成品對象(只執行構造器,不填充屬性);
- Spring首先從一級緩存singletonObjects中獲取,如果獲取不到,并且對象正在創建中,就再從二級緩存earlySingletonObjects中獲取,如果還是獲取不到且允許singletonFactories通過getObject()獲取,就從三級緩存singletonFactory.getObject()獲取,如果獲取到了則從singletonFactories中移除,并放入earlySingletonObjects中。其實也就是從三級緩存移動到了二級緩存。
Spring能否解決構造器的循環依賴?
- 不能,例如“A的構造方法中依賴了B的實例對象,同時B的構造方法中依賴了A的實例對象”;
- 因為加入singletonFactories三級緩存的前提是執行了構造器,所以構造器的循環依賴Spring無法解決。
BeanFactory與FactoryBean的區別是什么?
- BeanFactory是Spring中IOC容器最頂層的接口,它定義了IOC容器的基本功能規范;
- FactoryBean是工廠類接口,當你只是想簡單的去構造Bean,并且繞過原有初始化的復雜流程時,可以通過實現FactoryBean來創建bean。Spring內部就有很多bean是通過FactoryBean來創建的,方便內部的使用。
JDK動態代理與CGLIB的區別是什么?
- JDK Proxy 是 Java 語言自帶的功能,無需通過加載第三方類實現;
- Java 對 JDK Proxy 提供了穩定的支持,并且會持續的升級和更新 JDK Proxy,例如 Java 8 版本中的 JDK Proxy 性能相比于之前版本提升了很多;
- JDK Proxy 是通過攔截器加反射的方式實現的;
- JDK Proxy 只能代理繼承接口的類;
- JDK Proxy 實現和調用起來比較簡單;
- CGLib 是第三方提供的工具,基于 ASM 實現的,性能比較高;
- CGLib 無需通過接口來實現,它是通過實現子類的方式來完成調用的。
Spring事務的傳播屬性有哪些?
- 所謂Spring事務的傳播屬性,就是定義在存在多個事務同時存在的時候,Spring應該如何處理這些事務的行為。
| PROPAGATION_REQUIRED | 支持當前事務。如果當前有事務,則加入當前事務;如果當前沒有事務,就新建一個事務。這是最常見的選擇,也是 Spring 事務默認的傳播屬性。 |
| PROPAGATION_REQUIRES_NEW | 新建事務。即使當前有事務,會額外新建一個事務,新建的事務和原事務相互獨立,互不影響。 |
| PROPAGATION_SUPPORTS | 支持當前事務,如果當前沒有事務,就以非事務方式執行。 |
| PROPAGATION_MANDATORY | 支持當前事務,如果當前沒有事務,就拋出異常。 |
| PROPAGATION_NOT_SUPPORTED | 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 |
| PROPAGATION_NEVER | 以非事務方式執行,如果當前存在事務,則拋出異常。 |
| PROPAGATION_NESTED | 嵌套事務。將創建一個依賴于外層事務的子事務,子事務的提交與回滾由外層事務控制,但它無法影響外層事務。當外層事務提交或回滾時,子事務也會連帶提交和回滾。 |
SpringBoot
SpringBoot與Spring的區別是什么?
- Spring Boot 本質上是 Spring 框架的延伸和擴展,它的誕生是為了簡化 Spring 框架初始搭建以及開發的過程,使用它可以不再依賴 Spring 應用程序中的 XML 配置,為更快、更高效的開發 Spring 提供更加有力的支持。
- 更快速的構建能力:Spring Boot 提供了更多的 Starters 用于快速構建業務框架,Starters 可以理解為啟動器,它包含了一系列可以集成到應用里面的依賴包,你可以一站式集成 Spring 及其他技術,而不需要到處找依賴包。
- 起步依賴:在創建 Spring Boot 時可以直接勾選依賴模塊,這樣在項目初始化時就會把相關依賴直接添加到項目中,大大縮短了查詢并添加依賴的時間;
- 內嵌容器支持:Spring Boot 內嵌了 Tomcat、Jetty、Undertow 三種容器,其默認嵌入的容器是 Tomcat;
- Actuator 監控:可以監控應用程序的運行狀況,或者內存、線程池、Http 請求統計等。
SpringBoot約定優于配置的體現是什么?
- Maven的目錄結構:
- 默認有resources文件夾存放配置文件;
- 默認打包方式為jar。
- 默認的配置文件:application.properties 或 application.yml 文件;
- 默認通過 spring.profiles.active 屬性來決定運行環境時的配置文件;
- EnableAutoConfiguration 默認對于依賴的 starter 進行自動裝載;
- spring-boot-start-web 中默認包含 spring-mvc 相關依賴以及內置的 tomcat 容器,使得構建一個 web 應用更加簡單。
SpringBoot 有幾種讀取配置文件內容的方法?
- 注入Environment對象:通過Environment 的 getProperty() 方法讀取指定配置 Key 的內容;
- 使用@Value注解,實現單個配置的注入;
- 使用@ConfigurationProperties注解,實現一組配置的注入。
SpringBoot的自動裝配機制是什么?
- 自動裝配指的是SpringBoot會將約定配置下的bean自動加載到spring容器中;
- 自動裝配的核心注解是@SpringBootApplication,它又由@SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan組成;
- @SpringBootConfiguration:本質是@Configuration,標注了@Configuration 的 Java 類都是一個 JavaConfig 配置類,在配置類中,任何一個標注了@Bean 的方法,其返回值都會作為 Bean 定義注冊到 Spring IOC 容器中;
- @ComponentScan:掃描指定路徑下標識了需要裝配的類,自動裝配到 Spring IOC容器中,用于標識類需要裝配的注解有:@Component、@Service、@Controller、@Repository;
- @EnableAutoConfiguration:同樣是一個復合注解,主要分為@AutoConfigurationPackage和@Import;
- @AutoConfigurationPackage:該注解修飾的類所在的 package 會作為自動裝配的 package 管理;
- @Import:可以把多個分開的配置合并到一個配置中,而在@EnableAutoConfiguration中@Import導入了AutoConfigurationImportSelector類,它實現了Spring基于SPI的導入方式。
- SPI配置文件的為META-INF/spring.factories,內容為k-v屬性,key 為@EnableAutoConfiguration注解的全限定名,value為需要自動裝配的配置類,需要被@Configuration修飾,多個用逗號分隔。
SpringBoot有哪些按條件裝配的方式?
- @Conditional:注解中只有一個class類型的屬性,這個 class 便是需要實現條件判斷的類,這個類必須實現 Condition 接口的 matches 方法,該方法會返回一個boolean類型值,通過這個值來判斷條件是否成立。
- Conditional其它相關注解:
| @ConditionalOnBean | 在某個 bean 存在的時候 |
| @ConditionalOnMissingBean | 在某個 bean 不存在的時候 |
| @ConditionalOnClass | 當前 classPath 下可以找到某個 class 的時候 |
| @ConditionalOnMissingClass | 當前 classPath 下無法找到某個 class 的時候 |
| @ConditionalOnResource | 當前 classPath 下是否存在某個資源文件 |
| @ConditionalOnProperty | 當前 JVM 是否包含某個屬性值 |
| @ConditionalOnWebApplication | 當前 Spring context 是否是 web 應用程序 |
- 除了通過注解聲明,還可以通過SPI方式聲明
- 在 META-INF/spring-autoconfigure-metadata.properties中配置;
- AutoConfigurationImportSelector在加載自動裝配bean時,會先掃描spring-autoconfigure-metadata.propertie進行過濾,再加載 spring.factories。
如何自定義一個starter?
如何實現starter的按需加載?
- 創建自定義注解@Enable**注解;
- 以 UserClient 為例, 創建自定義注解 @EnableUserClient;
- 在注解中通過@Import導入我們的自動配置類;
- 這樣只有我們聲明了@EnableUserClient,才會導入我們需要的bean。
- 基于@ConditionalOn系列注解實現按條件注入。
內置容器的啟動流程是什么?
- 啟動一個springboot項目,首先運行Application啟動類的main方法,main 方法中調用了SpringApplication.run方法;
- run方法中又調用了最核心的refreshContext方法,這里面又調用了我們最熟悉了spring容器啟動模板方法refresh方法;
- 默認SpringBoot會啟動tomcat,在refresh中的onRefresh()中執行;
- onRefresh調用了createWebServer()方法,通過TomcatServletWebServerFactory開始創建Tomcat實例;
- 最后在refresh方法中的finishRefresh()中調用Tomcat實例的start邏輯,并將應用上下文發布的webServer中,至此完成Tomcat的啟動。
總結
以上是生活随笔為你收集整理的Spring、SpringBoot常见面试题与答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工业用微型计算机(26)-伪操作(2)
- 下一篇: 工业用微型计算机(27)-dos和BIO