spring 面試題

一、Spring 基礎概念

  1. 什么是 Spring 框架?
    • Spring 是一個開源的 Java 應用程序框架,它提供了一種輕量級的、非侵入式的方式來構建企業級應用。Spring 的核心功能包括依賴注入(Dependency Injection,DI)、面向切面編程(Aspect - Oriented Programming,AOP)、事務管理、數據訪問等,旨在簡化企業級 Java 開發,提高開發效率和代碼的可維護性。
  2. Spring 框架的核心模塊有哪些?
    • 核心容器(Core Container)
      • spring - core:提供了框架的基本核心功能,如 IOC(控制反轉)和依賴注入(DI)的基礎實現。
      • spring - beans:提供了 BeanFactory,這是 Spring 框架的核心工廠接口,用于管理和配置應用程序中的對象(beans)。
      • spring - context:建立在核心容器之上,提供了一種更高級的應用程序上下文(ApplicationContext),它是 BeanFactory 的子接口,除了具有 BeanFactory 的功能外,還提供了諸如國際化、事件傳播、資源加載等附加功能。
      • spring - context - support:提供了對第三方庫(如緩存、郵件、調度等)的集成支持。
    • AOP(Aspect - Oriented Programming)
      • spring - aop:提供了面向切面編程的基礎架構,允許在運行時將橫切關注點(如日志記錄、安全檢查等)織入到應用程序的核心業務邏輯中。
      • spring - aspectj:對 AspectJ 框架的集成支持,AspectJ 是一種功能強大的 AOP 實現,Spring - aspectj 使得在 Spring 應用中可以使用 AspectJ 的注解和語法進行更靈活的 AOP 編程。
    • 數據訪問與集成(Data Access/Integration)
      • spring - jdbc:提供了對 JDBC(Java Database Connectivity)的簡化操作,包括數據庫連接的獲取、SQL 語句的執行、結果集的處理等,減少了編寫 JDBC 代碼的繁瑣。
      • spring - tx:提供了事務管理的抽象層,支持編程式事務和聲明式事務,可與多種底層事務管理器(如 JDBC 事務、JTA 事務等)集成。
      • spring - orm:對多種對象 - 關系映射(ORM)框架(如 Hibernate、MyBatis 等)提供集成支持,方便在 Spring 應用中使用 ORM 框架進行數據庫操作。
    • Web(Spring Web)
      • spring - web:提供了基礎的 Web 開發功能,如 Web 應用上下文、Servlet 集成、文件上傳等。
      • spring - webmvc:Spring 的 MVC(Model - View - Controller)框架,用于構建 Web 應用程序,實現了請求處理、視圖渲染、模型綁定等功能。
      • spring - webflux:提供了基于反應式編程(Reactive Programming)的 Web 框架,適用于構建高性能、非阻塞的 Web 應用,如處理大量并發請求的微服務。
  3. 解釋一下控制反轉(IOC)和依賴注入(DI)的概念。
    • 控制反轉(Inversion of Control,IOC)
      • 在傳統的編程模式中,對象的創建和對象間的依賴關系是由程序代碼直接控制的。而在 IOC 模式下,這種控制權被轉移到了容器(如 Spring 容器)中。程序代碼不再負責對象的創建和依賴關系的維護,而是由容器來負責創建對象,并將它們裝配在一起。這就好比在傳統模式下,你自己做飯(自己創建和管理對象),而在 IOC 模式下,你去餐館吃飯(由容器來提供和管理對象)。
    • 依賴注入(Dependency Injection,DI)
      • 依賴注入是實現控制反轉的一種具體方式。它是指當一個對象(依賴方)需要依賴于另一個對象(被依賴方)時,由容器在創建依賴方對象時,將被依賴方對象注入到依賴方對象中。依賴注入有三種常見的方式:
      • 構造函數注入(Constructor Injection):通過構造函數將依賴對象傳入。例如:
        public class MyService {private MyRepository myRepository;public MyService(MyRepository myRepository) {this.myRepository = myRepository;}
        }

        ** setter 注入(Setter Injection)**:通過 setter 方法將依賴對象傳入。例如:

        public class MyService {private MyRepository myRepository;public void setMyRepository(MyRepository myRepository) {this.myRepository = myRepository;}
        }

        字段注入(Field Injection):直接在類的字段上使用注解注入依賴對象,但這種方式會使類與 Spring 框架耦合較緊密,例如:

        public class MyService {@Autowiredprivate MyRepository myRepository;
        }

二、Spring Bean

  1. Spring Bean 的生命周期是怎樣的?
    • 實例化(Instantiation)
      • Spring 首先根據配置(如 XML 配置、注解等)確定要創建的 Bean 類型,然后使用 Java 反射機制創建 Bean 的實例。例如,對于一個簡單的使用 @Component 注解的類:
        @Component
        public class MyBean {public MyBean() {// 這是構造函數,在實例化時被調用}
        }

        屬性賦值(Populate Properties)

      • 在實例化后,Spring 會對 Bean 的屬性進行賦值。如果使用了依賴注入,會將依賴的其他 Bean 注入到當前 Bean 中。例如:
        @Component
        public class MyBean {@Autowiredprivate AnotherBean anotherBean;
        }

        • 這里 Spring 會找到 AnotherBean 的實例并注入到 MyBean 的 anotherBean 屬性中。
      • 初始化(Initialization)
        • 執行 Bean 的初始化方法。有兩種常見的初始化方式:
          • 實現 InitializingBean 接口
            @Component
            public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {// 初始化邏輯}
            }

            使用 @PostConstruct 注解

            @Component
            public class MyBean {@PostConstructpublic void init() {// 初始化邏輯}
            }

?????????????????????????

  • 使用(In - use)
    • 初始化完成后,Bean 就可以被應用程序使用了,例如被其他組件調用方法等。
  • 銷毀(Destruction)
    • 當容器關閉時,會銷毀 Bean。如果 Bean 實現了 DisposableBean 接口,會調用其 destroy 方法:
@Component
public class MyBean implements DisposableBean {@Overridepublic void destroy() throws Exception {// 銷毀邏輯}
}

或者使用 @PreDestroy 注解來定義銷毀方法:

@Component
public class MyBean {@PreDestroypublic void cleanUp() {// 銷毀邏輯}
}
  1. 如何配置 Spring Bean?有哪些方式?
    • 基于 XML 配置
      • 在 XML 文件中定義 Bean,例如:

        xml

        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema - instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring - beans.xsd"><bean id="myBean" class="com.example.MyBean"><property name="propertyName" value="propertyValue"/></bean>
        </beans>
        

        這里定義了一個 id 為 myBean 的 Bean,其類是 com.example.MyBean,并設置了一個屬性。
    • 基于注解配置
      • 使用 Spring 的注解來標識 Bean 及其配置。常見的注解有:
        • @Component:通用的組件注解,用于標識一個普通的 Spring 組件。例如:

          java

          @Component
          public class MyComponent {// 組件邏輯
          }
          
        • @Service:用于標識業務邏輯層的組件,通常在服務類上使用。例如:

          java

          @Service
          public class MyService {// 服務邏輯
          }
          
        • @Repository:用于標識數據訪問層(如數據庫操作)的組件,例如:

          java

          @Repository
          public class MyRepository {// 數據訪問邏輯
          }
          
        • @Controller:用于標識 Web 應用中的控制器組件,例如在 Spring MVC 中:

          java

          @Controller
          public class MyController {// 控制器邏輯
          }
          
        • @Configuration 和 @Bean:用于 Java 配置類來定義 Bean。例如:

          java

          @Configuration
          public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
          }
          
    • 基于 Java 配置(Java - based configuration)
      • 除了 @Configuration 和 @Bean 的方式外,還可以通過繼承特定的抽象類來配置 Spring。例如,繼承 WebMvcConfigurerAdapter(在 Spring 5 中已被 WebMvcConfigurer 取代)來配置 Spring MVC:

        java

        @Configuration
        public class WebMvcConfig extends WebMvcConfigurer {// 配置視圖解析器等@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {// 配置邏輯}
        }
        

三、Spring AOP

  1. 什么是面向切面編程(AOP)?Spring AOP 的原理是什么?
    • 面向切面編程(AOP)
      • AOP 是一種編程范式,它允許將橫切關注點(如日志記錄、安全檢查、事務管理等)從應用程序的核心業務邏輯中分離出來,以獨立的模塊(切面)進行處理。這樣可以提高代碼的模塊化程度和可維護性。例如,在一個沒有 AOP 的應用中,如果每個業務方法都需要添加日志記錄代碼,會導致日志記錄代碼分散在各個業務方法中,而使用 AOP,可以將日志記錄邏輯定義在一個切面中,然后自動織入到需要的業務方法中。
    • Spring AOP 原理
      • Spring AOP 主要基于動態代理(Dynamic Proxy)技術。當一個目標對象(被代理對象)需要被織入切面邏輯時,Spring 會根據目標對象是否實現接口來選擇使用 JDK 動態代理或 CGLIB 動態代理。
        • JDK 動態代理
          • 如果目標對象實現了接口,Spring 會使用 JDK 動態代理。JDK 動態代理是通過實現目標對象的接口來創建代理對象的。例如,有一個接口和實現類:

            java

            public interface MyInterface {void doSomething();
            }
            public class MyClass implements MyInterface {@Overridepublic void doSomething() {// 業務邏輯}
            }
            

            Spring 會創建一個實現 MyInterface 的代理對象,在代理對象的 doSomething 方法中,會在調用目標對象的 doSomething 方法前后添加切面邏輯。
        • CGLIB 動態代理
          • 如果目標對象沒有實現接口,Spring 會使用 CGLIB(Code Generation Library)動態代理。CGLIB 是通過字節碼生成技術來創建目標對象的子類作為代理對象。例如,有一個沒有實現接口的類:

            java

            public class MyClass {public void doSomething() {// 業務邏輯}
            }
            

            Spring 會生成一個 MyClass 的子類作為代理對象,在子類的 doSomething 方法中添加切面邏輯。
  2. Spring AOP 中的通知(Advice)有哪些類型?
    • 前置通知(Before Advice)
      • 在目標方法執行之前執行的通知。例如,在一個方法調用前記錄日志:

        java

        import org.aspectj.lang.JoinPoint;
        import org.aspectj.lang.annotation.Aspect;
        import org.aspectj.lang.annotation.Before;@Aspect
        public class LoggingAspect {@Before("execution(* com.example.service.MyService.*(..))")public void beforeAdvice(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}
        }
        
    • 后置通知(After Advice)
      • 在目標方法執行之后執行的通知。有兩種類型:
        • 正常返回后執行的后置通知(After Returning Advice)
          • 當目標方法正常返回時執行。例如:

            java

            import org.aspectj.lang.JoinPoint;
            import org.aspectj.lang.annotation.AfterReturning;
            import org.aspectj.lang.annotation.Aspect;@Aspect
            public class LoggingAspect {@AfterReturning(pointcut = "execution(* com.example.service.MyService.*(..))", returning = "result")public void afterReturningAdvice(JoinPoint joinPoint, Object result) {System.out.println("After returning method: " + joinPoint.getSignature().getName() + ", result: " + result);}
            }
            
        • 無論是否拋出異常都執行的后置通知(After Finally Advice)
          • 這種通知類似于 try - finally 塊中的 finally 語句塊,無論目標方法是否拋出異常都會執行。例如:

            java

            import org.aspectj.lang.JoinPoint;
            import org.aspectj.lang.annotation.After;
            import org.aspectj.lang.annotation.Aspect;@Aspect
            public class LoggingAspect {@After("execution(* com.example.service.MyService.*(..))")public void afterFinallyAdvice(JoinPoint joinPoint) {System.out.println("After finally method: " + joinPoint.getSignature().getName());}
            }
            
    • 環繞通知(Around Advice)
      • 環繞通知可以在目標方法執行前后都添加邏輯,它可以完全控制目標方法的執行。例如:

        java

        import org.aspectj.lang.ProceedingJoinPoint;
        import org.aspectj.lang.annotation.Around;
        import org.aspectj.lang.annotation.Aspect;@Aspect
        public class LoggingAspect {@Around("execution(* com.example.service.MyService.*(..))")public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {System.out.println("Before method in around advice: " + pjp.getSignature().getName());Object result = pjp.proceed();System.out.println("After method in around advice: " + pjp.getSignature().getName());return result;}
        }
        
    • 異常通知(After Throwing Advice)
      • 當目標方法拋出異常時執行的通知。例如:
        import org.aspectj.lang.JoinPoint;
        import org.aspectj.lang.annotation.AfterThrowing;
        import org.aspectj.lang.annotation.Aspect;@Aspect
        public class LoggingAspect {@AfterThrowing(pointcut = "execution(* com.example.service.MyService.*(..))", throwing = "ex")public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) {System.out.println("Method: " + joinPoint.getSignature().getName() + " threw exception: " + ex.getMessage());}
        }
        

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903579.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903579.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903579.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV-Python (官方)中文教程(部分一)_Day20

22.直方圖 22.1直方圖的計算,繪制與分析 使用 OpenCV 或 Numpy 函數計算直方圖 使用 Opencv 或者 Matplotlib 函數繪制直方圖 將要學習的函數有&#xff1a;cv2.calcHist(),np.histogram() 什么是直方圖呢&#xff1f;通過直方圖你可以對整幅圖像的灰度分布有一個整體的 了…

數電發票整理:免費實用工具如何高效解析 XML 發票數據

如今數字電子發票越來越普及&#xff0c;但是數電發票的整理還是頗有講究~ 今天給大家介紹一個 XML 發票閱讀器。使用它完全不收取任何費用&#xff0c;且無廣告干擾&#xff0c;對財務人員而言十分實用。 01 軟件介紹 這款軟件就是XML格式&#xff08;數電票&#xff09;閱讀…

深度學習正則化:原理、方法與應用深度解析

摘要 本文深入探討深度學習中的正則化技術&#xff0c;介紹其避免過擬合的重要性&#xff0c;詳細講解常見的正則化方法&#xff0c;如 L 1 L_1 L1?和 L 2 L_2 L2?正則化、Dropout等&#xff0c;并通過線性回歸案例和神經網絡訓練流程對其進行直觀闡釋。幫助讀者理解正則化原…

【爬蟲】deepseek談爬蟲工具

2025 年&#xff0c;隨著 Web 技術的演進和反爬機制的升級&#xff0c;工具生態也會進一步優化。以下是 2025 年爬蟲 & 自動化測試的前沿工具預測&#xff0c;結合行業趨勢和現有技術發展方向&#xff1a; &#x1f680; 2025 年推薦組合&#xff08;預測版&#xff09; 1…

SQLMesh 測試自動化:提升數據工程效率

在現代數據工程中&#xff0c;確保數據模型的準確性和可靠性至關重要。SQLMesh 提供了一套強大的測試工具&#xff0c;用于驗證數據模型的輸出是否符合預期。本文將深入探討 SQLMesh 的測試功能&#xff0c;包括如何創建測試、支持的數據格式以及如何運行和調試測試。 SQLMesh …

Java學習手冊:Spring 中常用的注解

一、組件注解 Component &#xff1a;用于標記一個類為 Spring 管理的 Bean&#xff0c;是 Spring 的基本組件注解。Spring 會通過類路徑掃描自動檢測并注冊標記了 Component 的類為 Bean。Service &#xff1a;是 Component 的派生注解&#xff0c;用于標記服務層類&#xff…

前端跨域問題詳解:原因、解決方案與最佳實踐

引言 在現代Web開發中&#xff0c;跨域問題是前端工程師幾乎每天都會遇到的挑戰。隨著前后端分離架構的普及和微服務的發展&#xff0c;跨域請求變得愈發常見。本文將深入探討跨域問題的本質、各種解決方案以及在實際開發中的最佳實踐。 一、什么是跨域問題&#xff1f; 1.1…

[計算機網絡]物理層

文章目錄 物理層的概述與功能傳輸介質雙絞線:分類:應用領域: 同軸電纜&#xff1a;分類: 光纖&#xff1a;分類: 無線傳輸介質&#xff1a;無線電波微波&#xff1a;紅外線&#xff1a;激光&#xff1a; 物理層設備中繼器&#xff1a;放大器&#xff1a;集線器(Hub)&#xff1a…

大連理工大學選修課——機器學習筆記(9):線性判別式與邏輯回歸

線性判別式與邏輯回歸 概述 判別式方法 產生式模型需要計算輸入、輸出的聯合概率 需要知道樣本的概率分布&#xff0c;定義似然密度的隱式參數也稱為基于似然的分類 判別式模型直接構造判別式 g i ( x ∣ θ i ) g_i(x|\theta_i) gi?(x∣θi?)&#xff0c;顯式定義判別式…

OpenCV 圖像處理核心技術 (第二部分)

歡迎來到 OpenCV 圖像處理的第二部分&#xff01;在第一部分&#xff0c;我們學習了如何加載、顯示、保存圖像以及訪問像素等基礎知識。現在&#xff0c;我們將深入探索如何利用 OpenCV 提供的強大工具來修改和分析圖像。 圖像處理是計算機視覺領域的基石。通過對圖像進行各種…

【鴻蒙HarmonyOS】一文詳解華為的服務卡片

7.服務卡片 1.什么是卡片 Form Kit&#xff08;卡片開發服務&#xff09;提供一種界面展示形式&#xff0c;可以將應用的重要信息或操作前置到服務卡片&#xff08;以下簡稱“卡片”&#xff09;&#xff0c;以達到服務直達、減少跳轉層級的體驗效果。卡片常用于嵌入到其他應…

探索目標檢測:邊界框與錨框的奧秘

筆者在2022年開始學習目標檢測的時候&#xff0c;對各種框的概念那是相當混淆&#xff0c;比如&#xff1a; 中文名詞&#xff1a;邊界框、錨框、真實框、預測框等英文名詞&#xff1a;BoundingBox、AnchorBox、Ground Truth等 同一個英文名詞比如BoundingBox翻譯成中文也有多個…

[原創](現代Delphi 12指南):[macOS 64bit App開發]: [1]如何使用原生NSAlert消息框 (runModal模式)

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

LangChain的向量RAG與MCP在意圖識別的主要區別

LangChain的向量RAG與MCP在意圖識別實現上的區別主要體現在技術路徑、流程設計以及應用場景三個方面&#xff1a; 1. 技術路徑差異 LangChain向量RAG 語義相似度驅動&#xff1a;通過用戶輸入的原始查詢與向量化知識庫的語義匹配實現意圖識別。例如&#xff0c;用戶提問"…

[特殊字符] Spring Cloud 微服務配置統一管理:基于 Nacos 的最佳實踐詳解

在微服務架構中&#xff0c;配置文件眾多、管理復雜是常見問題。本文將手把手演示如何將配置集中托管到 Nacos&#xff0c;并在 Spring Cloud Alibaba 項目中實現統一配置管理 自動刷新機制。 一、為什么要使用 Nacos 統一配置&#xff1f; 傳統方式下&#xff0c;每個服務都…

2025平航杯—團隊賽

2025平航杯團隊賽 計算機取證 分析起早王的計算機檢材&#xff0c;起早王的計算機插入過USB序列號是什么(格式&#xff1a;1)分析起早王的計算機檢材&#xff0c;起早王的便簽里有幾條待干(格式&#xff1a;1)分析起早王的計算機檢材&#xff0c;起早王的計算機默認瀏覽器是什…

JSON-RPC 2.0 規范中文版——無狀態輕量級遠程過程調用協議

前言 JSON-RPC是一種簡單、輕量且無狀態的遠程過程調用&#xff08;RPC&#xff09;協議&#xff0c;它允許不同系統通過標準化的數據格式進行通信。自2010年由JSON-RPC工作組發布以來&#xff0c;已成為眾多應用中實現遠程交互的基礎協議之一。本規范主要表達了JSON-RPC 2.0版…

微控制器編程 | ISP、IAP 與 ICP 的原理與比較

注&#xff1a;英文引文&#xff0c;機翻未校。 圖片清晰度限于引文原狀。 Introduction to Programming of Microcontroller: ISP, IAP and ICP 微控制器編程介紹&#xff1a;ISP、IAP 和 ICP Date: 30-11-2022 1. What is Microcontroller Programming 什么是微控制器編…

Allegro23.1新功能之新型via structure創建方法操作指導

Allegro23.1新功能之新型via structure創建方法操作指導 Allegro升級到了23.1后,支持創建新型via structure 通過直接定義參數來生成 具體操作如下 打開軟件,選擇 Allegro PCB Designer

IBM WebSphere Application Server 7.0/8.5.5證書過期問題處理

證書過期錯誤日志&#xff1a; [3/14/16 7:22:20:332 PDT] 0000007d WSX509TrustMa E CWPKI0312E: The certificate with subject DN CNMXSYSTEMS, OUctgNodeCell01, OUctgNode01, OIBM, CUS has an end date Mon Jan 11 11:17:18 PST 2016 which is no longer valid. [3/14/…