2025年高頻spring的面試題及答案_第1頁
2025年高頻spring的面試題及答案_第2頁
2025年高頻spring的面試題及答案_第3頁
2025年高頻spring的面試題及答案_第4頁
2025年高頻spring的面試題及答案_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2025年高頻spring的面試題及答案Spring框架中Bean的生命周期包含哪些關(guān)鍵階段?Bean的生命周期從實(shí)例化開始,經(jīng)歷依賴注入、初始化前處理、初始化、初始化后處理,最終到銷毀階段。具體步驟為:1.實(shí)例化:通過構(gòu)造器或工廠方法創(chuàng)建Bean的原始對(duì)象(未填充屬性)。2.屬性注入:根據(jù)@Autowired、@Resource等注解或XML配置,完成依賴注入。3.Aware接口回調(diào):若Bean實(shí)現(xiàn)了BeanNameAware、BeanFactoryAware等接口,會(huì)回調(diào)設(shè)置對(duì)應(yīng)屬性(如獲取Bean名稱或所屬工廠)。4.BeanPostProcessor前置處理:調(diào)用BeanPostProcessor的postProcessBeforeInitialization方法,可在此階段修改Bean的狀態(tài)(如動(dòng)態(tài)代理前的增強(qiáng))。5.初始化方法執(zhí)行:若配置了init-method(XML)或@PostConstruct注解,執(zhí)行初始化邏輯(如資源初始化、配置校驗(yàn))。6.BeanPostProcessor后置處理:調(diào)用BeanPostProcessor的postProcessAfterInitialization方法,典型場(chǎng)景是AOP在此階段為Bean提供代理對(duì)象。7.銷毀階段:容器關(guān)閉時(shí),若配置了destroy-method(XML)或@PreDestroy注解,執(zhí)行資源釋放(如關(guān)閉連接、停止線程)。需注意,Bean的作用域會(huì)影響生命周期:?jiǎn)卫鼴ean由容器管理完整生命周期;原型Bean實(shí)例化后由調(diào)用者管理,容器不負(fù)責(zé)銷毀。Spring如何解決循環(huán)依賴?Spring通過三級(jí)緩存(singletonFactories)解決單例Bean的循環(huán)依賴,僅支持setter注入或字段注入,構(gòu)造器注入無法解決。三級(jí)緩存的具體作用如下:一級(jí)緩存(singletonObjects):存儲(chǔ)已完成初始化的單例Bean(成品Bean)。二級(jí)緩存(earlySingletonObjects):存儲(chǔ)已實(shí)例化但未完成初始化的早期Bean(半成品Bean),用于避免重復(fù)創(chuàng)建代理對(duì)象。三級(jí)緩存(singletonFactories):存儲(chǔ)ObjectFactory工廠,用于提供早期Bean的代理對(duì)象(若需要AOP)。解決流程示例:A依賴B,B依賴A。1.創(chuàng)建A時(shí),實(shí)例化A(原始對(duì)象),將A的ObjectFactory(λ表達(dá)式:()->getEarlyBeanReference(beanName,mbd,bean))存入三級(jí)緩存。2.A需要注入B,觸發(fā)B的創(chuàng)建流程:實(shí)例化B,將B的ObjectFactory存入三級(jí)緩存。3.B需要注入A,從三級(jí)緩存獲取A的ObjectFactory,調(diào)用getObject()提供A的早期引用(可能是代理對(duì)象),將A從三級(jí)緩存移至二級(jí)緩存。4.B完成屬性注入和初始化,存入一級(jí)緩存。5.A獲取到B(一級(jí)緩存中的成品),完成屬性注入和初始化,從二級(jí)緩存移至一級(jí)緩存。若僅用二級(jí)緩存,當(dāng)Bean需要AOP時(shí),會(huì)提前提供代理對(duì)象,導(dǎo)致同一Bean的不同階段代理對(duì)象不一致(如初始化前后的增強(qiáng)邏輯差異)。三級(jí)緩存通過延遲提供代理(僅在需要時(shí)調(diào)用ObjectFactory),保證了代理對(duì)象的一致性。@Transactional注解的事務(wù)失效場(chǎng)景有哪些?@Transactional失效通常由以下原因?qū)е拢?.方法非public修飾:Spring通過動(dòng)態(tài)代理實(shí)現(xiàn)事務(wù),默認(rèn)僅對(duì)public方法生效(JDK代理限制,CGLIB可支持protected但官方不推薦)。2.自調(diào)用問題:同一類中未被代理的方法調(diào)用@Transactional方法(如this.xxx()),因未通過代理對(duì)象,事務(wù)攔截器未生效。解決方案:通過@Autowired注入自身(代理對(duì)象)或使用AopContext.currentProxy()獲取代理。3.異常類型不匹配:默認(rèn)僅回滾RuntimeException和Error,若拋出檢查型異常(如IOException)且未配置rollbackFor=Exception.class,事務(wù)不會(huì)回滾。4.事務(wù)傳播行為配置錯(cuò)誤:若內(nèi)層方法配置propagation=NOT_SUPPORTED(不支持事務(wù)),外層事務(wù)調(diào)用時(shí)內(nèi)層方法不會(huì)參與事務(wù)。5.數(shù)據(jù)源未配置事務(wù)管理器:未在配置類中通過@Bean聲明PlatformTransactionManager(如DataSourceTransactionManager),導(dǎo)致事務(wù)機(jī)制未啟用。6.Bean未被Spring管理:若類未被@Component、@Service等注解標(biāo)記,或未在XML中配置,Spring無法為其提供事務(wù)代理。例如,業(yè)務(wù)方法中捕獲異常并記錄日志但未重新拋出,導(dǎo)致事務(wù)管理器未檢測(cè)到異常,最終提交事務(wù)(即使業(yè)務(wù)邏輯失?。?。SpringBoot3.x相比2.x的核心變化有哪些?SpringBoot3.x基于Java17+,兼容JakartaEE9+(原javax包替換為jakarta),主要變化包括:1.JakartaEE遷移:所有JSR標(biāo)準(zhǔn)接口(如Servlet、JPA、Validation)從javax.遷移至jakarta.,需升級(jí)依賴(如Hibernate6.x、Servlet5.0)。2.GraalVM原生鏡像支持:通過spring-boot-maven-plugin的native:compile目標(biāo),可構(gòu)建原生可執(zhí)行文件(減少啟動(dòng)時(shí)間和內(nèi)存占用),需使用@NativeHint等注解處理反射、資源訪問等場(chǎng)景。3.虛擬線程(ProjectLoom)支持:SpringBoot3.2+集成虛擬線程,通過配置spring.threads.virtual.enabled=true啟用,適用于I/O密集型應(yīng)用(如HTTP客戶端調(diào)用、數(shù)據(jù)庫查詢),減少線程上下文切換開銷。4.MicrometerTracing集成:替代SpringCloudSleuth,提供開放遙測(cè)(OpenTelemetry)支持,簡(jiǎn)化鏈路追蹤配置(自動(dòng)提供Span、關(guān)聯(lián)日志)。5.Security默認(rèn)配置強(qiáng)化:SpringSecurity6.x默認(rèn)啟用基于路徑的授權(quán)(需顯式配置permitAll()),并支持OAuth2.1標(biāo)準(zhǔn)(如授權(quán)碼模式的PKCE強(qiáng)制開啟)。6.響應(yīng)式編程優(yōu)化:SpringWebFlux支持HTTP/3(基于QUIC協(xié)議),提升高延遲網(wǎng)絡(luò)下的性能;Reactor3.5+增強(qiáng)了背壓控制和調(diào)試工具。例如,原生鏡像構(gòu)建時(shí)需處理動(dòng)態(tài)代理類(如使用@ProxyHint),否則可能因GraalVM的靜態(tài)分析遺漏導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。SpringMVC中DispatcherServlet的請(qǐng)求處理流程是怎樣的?DispatcherServlet作為前端控制器,核心流程分為9步:1.接收請(qǐng)求:客戶端發(fā)送HTTP請(qǐng)求,被DispatcherServlet攔截(通過web.xml或@WebServlet配置)。2.獲取HandlerMapping:根據(jù)請(qǐng)求URL,通過HandlerMapping(如BeanNameUrlHandlerMapping、RequestMappingHandlerMapping)查找對(duì)應(yīng)的Handler(控制器方法)。3.獲取HandlerAdapter:根據(jù)Handler類型(如@Controller標(biāo)注的方法),選擇匹配的HandlerAdapter(如RequestMappingHandlerAdapter)。4.執(zhí)行Handler:調(diào)用HandlerAdapter的handle()方法,執(zhí)行控制器方法(可能涉及參數(shù)解析@RequestParam、@RequestBody,返回ModelAndView或@ResponseBody的返回值)。5.處理異常:若執(zhí)行過程中拋出異常,由HandlerExceptionResolver(如ExceptionHandlerExceptionResolver)處理,返回錯(cuò)誤視圖或JSON。6.視圖解析:若返回ModelAndView,通過ViewResolver(如InternalResourceViewResolver、ThymeleafViewResolver)解析視圖名稱為具體View對(duì)象。7.視圖渲染:View對(duì)象結(jié)合Model數(shù)據(jù),提供響應(yīng)內(nèi)容(如JSP填充數(shù)據(jù)、Thymeleaf模板渲染)。8.響應(yīng)輸出:將渲染后的內(nèi)容寫入HTTP響應(yīng)流,返回客戶端。9.清理資源:完成請(qǐng)求處理后,清理線程局部變量(如RequestContextHolder中的請(qǐng)求上下文)。關(guān)鍵擴(kuò)展點(diǎn):可通過自定義HandlerMapping、HandlerAdapter或ViewResolver,實(shí)現(xiàn)個(gè)性化的請(qǐng)求處理邏輯(如多版本API路由、自定義模板引擎)。SpringAOP的實(shí)現(xiàn)原理是什么?如何選擇JDK動(dòng)態(tài)代理和CGLIB?SpringAOP基于動(dòng)態(tài)代理模式,通過BeanPostProcessor在Bean初始化后提供代理對(duì)象。核心實(shí)現(xiàn)方式有兩種:JDK動(dòng)態(tài)代理:基于java.lang.reflect.Proxy,僅能代理接口(目標(biāo)類必須實(shí)現(xiàn)至少一個(gè)接口)。代理類實(shí)現(xiàn)接口方法,調(diào)用時(shí)通過InvocationHandler攔截,執(zhí)行切面邏輯。CGLIB代理:基于ASM字節(jié)碼增強(qiáng)庫,通過繼承目標(biāo)類提供子類。代理類重寫父類方法(final方法無法被代理),調(diào)用時(shí)通過MethodInterceptor攔截,執(zhí)行切面邏輯。選擇策略:若目標(biāo)類實(shí)現(xiàn)了接口,默認(rèn)使用JDK動(dòng)態(tài)代理(減少依賴,提升性能)。若目標(biāo)類未實(shí)現(xiàn)接口或需要代理類中的非接口方法(如protected方法),強(qiáng)制使用CGLIB(可通過配置xy-target-class=true全局啟用)。注意:SpringBoot2.0+默認(rèn)優(yōu)先使用CGLIB(因現(xiàn)代應(yīng)用中純接口編程場(chǎng)景減少),但仍可通過@EnableAspectJAutoProxy(proxyTargetClass=false)切換。例如,對(duì)@Service標(biāo)注的類(通常不實(shí)現(xiàn)接口),Spring會(huì)使用CGLIB提供代理;對(duì)@Repository標(biāo)注的DAO接口(實(shí)現(xiàn)JpaRepository),使用JDK動(dòng)態(tài)代理。Spring中如何實(shí)現(xiàn)Bean的條件裝配?@Conditional注解的常用擴(kuò)展有哪些?Spring通過條件裝配(ConditionalBean)實(shí)現(xiàn)根據(jù)環(huán)境動(dòng)態(tài)注冊(cè)Bean,核心注解是@Conditional,可自定義條件或使用內(nèi)置擴(kuò)展:1.@ConditionalOnClass:當(dāng)類路徑中存在指定類時(shí)裝配(如存在DataSource.class時(shí)注冊(cè)JdbcTemplate)。2.@ConditionalOnMissingClass:當(dāng)類路徑中不存在指定類時(shí)裝配(用于兼容不同版本依賴)。3.@ConditionalOnBean:當(dāng)容器中存在指定Bean時(shí)裝配(如存在UserService時(shí)注冊(cè)UserController)。4.@ConditionalOnMissingBean:當(dāng)容器中不存在指定Bean時(shí)裝配(用于提供默認(rèn)實(shí)現(xiàn),如SpringBoot的默認(rèn)數(shù)據(jù)源配置)。5.@ConditionalOnProperty:當(dāng)配置屬性滿足條件時(shí)裝配(如spring.cache.type=redis時(shí)注冊(cè)RedisCacheManager)。6.@ConditionalOnResource:當(dāng)類路徑中存在指定資源時(shí)裝配(如存在schema.sql時(shí)執(zhí)行數(shù)據(jù)初始化)。7.@ConditionalOnWebApplication:當(dāng)前應(yīng)用是Web應(yīng)用時(shí)裝配(區(qū)分Servlet環(huán)境和Reactive環(huán)境)。實(shí)現(xiàn)自定義條件需實(shí)現(xiàn)Condition接口,重寫matches()方法(如根據(jù)服務(wù)器IP決定是否注冊(cè)Bean)。例如,SpringBoot的自動(dòng)配置類(如DataSourceAutoConfiguration)大量使用@Conditional注解,根據(jù)類路徑和配置動(dòng)態(tài)激活配置。Spring事務(wù)的隔離級(jí)別和傳播行為分別有哪些?隔離級(jí)別(Isolation):定義事務(wù)間可見性,解決臟讀、不可重復(fù)讀、幻讀問題。DEFAULT:使用數(shù)據(jù)庫默認(rèn)隔離級(jí)別(如MySQL默認(rèn)REPEATABLE_READ,Oracle默認(rèn)READ_COMMITTED)。READ_UNCOMMITTED:允許讀取未提交的修改(臟讀)。READ_COMMITTED:僅讀取已提交的修改(解決臟讀,可能不可重復(fù)讀)。REPEATABLE_READ:同一事務(wù)內(nèi)多次讀取結(jié)果一致(解決不可重復(fù)讀,可能幻讀)。SERIALIZABLE:最高隔離級(jí)別,事務(wù)串行執(zhí)行(解決所有問題,性能最差)。傳播行為(Propagation):定義事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí)的行為。REQUIRED(默認(rèn)):若當(dāng)前有事務(wù)則加入,無則創(chuàng)建新事務(wù)(最常用)。REQUIRES_NEW:無論當(dāng)前是否有事務(wù),都創(chuàng)建新事務(wù)(原事務(wù)掛起,用于需要獨(dú)立回滾的場(chǎng)景,如日志記錄)。NESTED:在當(dāng)前事務(wù)嵌套執(zhí)行(通過保存點(diǎn)實(shí)現(xiàn),回滾僅影響嵌套部分,需數(shù)據(jù)庫支持保存點(diǎn))。SUPPORTS:若當(dāng)前有事務(wù)則加入,無則以非事務(wù)執(zhí)行。NOT_SUPPORTED:以非事務(wù)執(zhí)行,若當(dāng)前有事務(wù)則掛起。MANDATORY:必須在現(xiàn)有事務(wù)中執(zhí)行,無事務(wù)則拋異常(強(qiáng)制事務(wù)上下文)。NEVER:必須以非事務(wù)執(zhí)行,有事務(wù)則拋異常。例如,用戶下單時(shí),主事務(wù)(訂單創(chuàng)建)調(diào)用嵌套事務(wù)(庫存扣減),若庫存扣減失敗,僅回滾庫存部分(NESTED),而訂單創(chuàng)建可能繼續(xù)(需業(yè)務(wù)判斷)。SpringBoot如何實(shí)現(xiàn)自動(dòng)配置?關(guān)鍵組件有哪些?SpringBoot自動(dòng)配置通過@SpringBootApplication注解(包含@EnableAutoConfiguration)觸發(fā),核心流程如下:1.加載META-INF/spring.factories:掃描所有依賴Jar包中的spring.factories文件,獲取EnableAutoConfiguration對(duì)應(yīng)的配置類列表(如DataSourceAutoConfiguration、WebMvcAutoConfiguration)。2.條件過濾:對(duì)每個(gè)自動(dòng)配置類應(yīng)用@Conditional注解(如@ConditionalOnClass、@ConditionalOnProperty),僅滿足條件的配置類會(huì)被激活。3.Bean注冊(cè):激活的配置類通過@Bean方法注冊(cè)組件(如DispatcherServlet、RequestMappingHandlerAdapter),并處理用戶自定義配置(用戶@Bean優(yōu)先于自動(dòng)配置的@Bean)。關(guān)鍵組件:AutoConfigurationImportSelector:@EnableAutoConfiguration的底層實(shí)現(xiàn)類,負(fù)責(zé)加載和過濾自動(dòng)配置類。SpringFactoriesLoader:讀取spring.factories文件,解析配置類全限定名。ConditionEvaluator:評(píng)估@Conditional條件是否滿足(如類路徑檢查、配置屬性檢查)。@ConfigurationProperties:將perties中的配置綁定到Java對(duì)象(如ServerProperties對(duì)應(yīng)server.port等配置)。例如,當(dāng)引入spring-boot-starter-web依賴時(shí),WebMvcAutoConfiguration會(huì)檢測(cè)到DispatcherServlet存在,并注冊(cè)MVC相關(guān)Bean;若用戶自定義了@BeanViewResolver,則自動(dòng)配置的ViewResolver會(huì)被覆蓋。SpringWebFlux與SpringMVC的區(qū)別有哪些?適用場(chǎng)景是什么?核心區(qū)別:1.編程模型:MVC基于ServletAPI(同步阻塞),依賴Tomcat、Jetty等Servlet容器;WebFlux基于Reactor(響應(yīng)式編程),支持異步非阻塞,可運(yùn)行在Netty、Undertow等非Servlet容器。2.處理方式:MVC的每個(gè)請(qǐng)求由一個(gè)線程處理(線程池大小限制吞吐量);WebFlux通過少量線程(如EventLoop)處理多個(gè)請(qǐng)求(利用回調(diào)、發(fā)布-訂閱模式),適合I/O密集型場(chǎng)景。3.返回類型:MVC返回ModelAndView、@ResponseBody(同步數(shù)據(jù));WebFlux支持Mono(0/1個(gè)元素)和Flux(0到N個(gè)元素),可處理流式數(shù)據(jù)(如Server-SentEvents、WebSocket)。4.注解支持:WebFlux支持@Controller、@RequestMapping(與MVC兼容),但新增@ServerWebSocket等響應(yīng)式注解,且@RequestBody、@ResponseBody支持異步反序列化。適用場(chǎng)景:WebFlux:高并發(fā)I/O場(chǎng)景(如微服務(wù)網(wǎng)關(guān)、實(shí)時(shí)數(shù)據(jù)推送、第三方接口調(diào)用),需較少線程處理大量請(qǐng)求(降低資源消耗)。MVC:傳統(tǒng)業(yè)務(wù)邏輯(如CRUD)、同步數(shù)據(jù)庫操作(如JPA的findById),或需要Servlet特性(如Filter、Listener)的場(chǎng)景。例如,電商大促時(shí),商品詳情頁的接口(需調(diào)用多個(gè)下游服務(wù))使用WebFlux,通過Mono.zip()合并異步調(diào)用結(jié)果,提升吞吐量;而用戶信息修改接口(單數(shù)據(jù)庫操作)使用MVC更簡(jiǎn)單。SpringSecurity如何實(shí)現(xiàn)權(quán)限控制?常見擴(kuò)展點(diǎn)有哪些?SpringSecurity通過FilterChainProxy管理多個(gè)SecurityFilter,核心流程為:1.認(rèn)證(Authentication):通過UsernamePasswordAuthenticationFilter、BasicAuthenticationFilter等獲取用戶憑證(如用戶名密碼、JWT令牌),調(diào)用AuthenticationManager驗(yàn)證(如查詢數(shù)據(jù)庫、調(diào)用OAuth2授權(quán)服務(wù)器)。2.授權(quán)(Authorization):通過FilterSecurityInterceptor檢查請(qǐng)求是否有權(quán)限訪問(如基于角色的訪問控制@PreAuthorize("hasRole('ADMIN')")、路徑匹配antMatchers("/admin").hasRole("ADMIN"))。3.會(huì)話管理:通過SessionManagementFilter管理會(huì)話(如限制同一用戶多端登錄、Session超時(shí)處理)。4.安全增強(qiáng):通過CsrfFilter防止跨站請(qǐng)求偽造,通過CorsFilter處理跨域請(qǐng)求,通過HeaderWriterFilter添加安全響應(yīng)頭(如X-Content-Type-Options)。常見擴(kuò)展點(diǎn):自定義UserDetailsService:實(shí)現(xiàn)loadUserByUsername()方法,從數(shù)據(jù)庫或外部系統(tǒng)加載用戶信息(如LDAP、OAuth2用戶)。自定義AuthenticationProvider:實(shí)現(xiàn)authenticate()方法,支持自定義認(rèn)證方式(如手機(jī)驗(yàn)證碼登錄)。自定義AccessDecisionManager:實(shí)現(xiàn)decide()方法,自定義授權(quán)邏輯(如基于數(shù)據(jù)權(quán)限的行級(jí)控制)。JWT令牌處理:通過JwtAuthenticationConverter解析令牌,提取用戶權(quán)限(如從token的authorities聲明中獲取角色)。表達(dá)式控制:使用@PreAuthorize、@PostAuthorize注解結(jié)合SpEL(如@PreAuthorize("userId==principal.id"))實(shí)現(xiàn)細(xì)粒度權(quán)限控制。例如,在微服務(wù)中,資源服務(wù)器(ResourceServer)通過BearerTokenAuthenticationFilter解析JWT令牌,調(diào)用RemoteTokenServices驗(yàn)證令牌有效性,然后根據(jù)令牌中的scope屬性控制接口訪問。SpringCloud2023.x的核心組件有哪些?相比舊版本有何改進(jìn)?SpringCloud2023.x(代號(hào)Pajaro)基于SpringBoot3.x,核心組件及改進(jìn)如下:1.SpringCloudNetflix:Eureka2.x不

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論