Java八股文——Spring篇

文章目錄

  • Java八股文專欄其它文章
  • Java八股文——Spring篇
    • Spring
      • Spring的IoC和AOP
        • Spring IoC實現機制
        • Spring AOP實現機制
      • 動態代理
        • JDK Proxy
        • CGLIB
        • ByteBuddy
      • Spring框架中的單例Bean是線程安全的嗎?
      • 什么是AOP,你們項目中有沒有使用到AOP
        • Spring中的事務是如何實現的
      • Spring中事務失效的場景有哪些方法
        • 異常捕獲處理
        • 拋出檢查異常
      • **檢查異常(Checked Exception)**
        • 非public方法導致事務失效
        • 自調用
        • 多線程操作
      • Spring的Bean的生命周期
        • BeanDefinition
        • Bean生命周期
      • Spring中的循環依賴
        • 三級緩存
        • 構造方法出現循環依賴
      • Spring給我們提供了很多擴展點
      • Spring的常見注解有哪些
    • SpringBoot
      • 為什么使用SpringBoot
      • SpringBoot自動配置原理
        • 1?? 啟動入口
        • 2?? EnableAutoConfiguration
        • 3?? AutoConfigurationImportSelector
        • 4?? 條件裝配
        • 5?? 裝配完成
      • SpringBoot用到哪些設計模式
      • 怎么理解SpringBoot中的約定大于配置
      • SpringBoot項目結構
        • 流程圖
      • 說幾個Starter
      • 寫過SpringBoot starter嗎
      • SpringBoot的過濾器和攔截器
      • SpringBoot常見注解有哪些?
    • SpringMVC
      • SpringMVC的執行流程
        • 視圖階段(JSP)
        • 前后端分離階段(接口開發,異步請求)
      • SpringMVC的常見注解有哪些
    • SpringCloud
      • SpringCloud和SpringBoot的區別
      • 微服務常用的組件
      • SpringCloud Alibaba實現的微服務結構
      • 負載均衡有哪些算法
      • 介紹一下服務熔斷
        • 主要概念
        • 觸發條件
      • 介紹一下服務降級
      • 服務熔斷和服務降級的區別
    • SpringAI
      • 什么是SpringAI
      • 什么是 RAG?Spring AI 如何實現?
      • SpringAI向量數據庫
        • 使用流程:
      • SpringAI會話記憶功能
      • SpringAI的PromptTemplate

Java八股文專欄其它文章

  • Java八股文——Java基礎篇
  • Java八股文——JVM篇
  • Java八股文——Redis篇
  • Java八股文——MySQL篇
  • Java八股文——MyBatis篇

Java八股文——Spring篇

Spring

Spring的IoC和AOP

**IoC:**即控制反轉的意思,它是一種創建和獲取對象的技術思想,依賴注入(DI)是實現這種技術的一種方式。傳統開發過程中,我們需要通過new關鍵字來創建對象。使用IoC思想開發方式的話,我們不通過new關鍵字創建對象,而是通過IoC容器來幫助我們實例化對象。通過IoC的方式,可以大大降低對象之間的耦合度。

AOP:面向切面編程,能夠將那些與業務無關,卻為業務模塊所共同調用的邏輯封裝起來,以減少系統的重復代碼,降低模塊間的耦合度。Spring AOP就是基于動態代理的,如果要代理的對象,實現了某個接口,那么Spring AOP會使用JDK Proxy,去創建代理對象,而對于沒有實現接口的對象,就無法使用JDK Proxy去進行代理了,這時候Spring AOP會使用Cglib生成一個被代理對象的子類來作為代理。

Spring IoC實現機制
  • **反射:**Spring IoC容器利用Java的反射機制動態加載類、創建對象實例及調用對象方法,反射允許在運行時檢查類、方法、屬性等信息,從而實現靈活的對象實例化和管理。

  • **依賴注入:**IoC的核心概念是依賴注入,即容器負責管理應用程序組件之間的依賴關系。Spring通過構造函數注入、屬性注入或方法注入,將組件之間的依賴關系描述在配置文件中或使用注解。

    依賴注入是將對象的創建和依賴關系的管理交給Spring容器來完成,類只需要聲明自己所依賴的對象, 容器在運行時將這些依賴對象注入到類中,從而降低了類與類之間的耦合度,提高了代碼的可維護性和可測試性。

    • 構造器注入:通過構造函數傳遞依賴對象,保證對象初始化時依賴已就緒。
    • Setter方法注入:通過Setter方法設置依賴,靈活性高,但依賴可能未完全初始化。
    • 字段注入:直接通過@Autowired注解字段,代碼簡潔但隱藏依賴關系,不推薦生產代碼。
  • **設計模式-工廠模式:**Spring IoC容器通常采用工廠模式來管理對象的創建和生命周期。容器作為工廠負責實例化Bean并管理它們的生命周期,將Bean的實例化過程交給容器來管理。

  • **容器實現:**Spring IoC容器是實現IoC的核心,通常使用BeanFactory或ApplicationContext來管理Bean。BeanFactory是IoC容器的基本形式,提供基本的IoC功能;ApplicationContext是BeanFactory擴展,并提供更多企業級功能。

Spring AOP實現機制

Spring AOP的實現依賴于動態代理技術。動態代理是在運行時動態生成代理對象,而不是在編譯時。它允許開發者在運行時指定要代理的接口和行為,從而實現在不修改源碼的情況下增強方法的功能。

SpringAOP支持兩種動態代理:

  • 基于JDK的動態代理:使用java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口實現。這種方式需要代理的類實現一個或多個接口。
  • 基于CGLIB的動態代理:當被代理的類沒有實現接口時,Spring會使用CGLIB庫生成一個被代理類的子類作為代理。CGLIB是一個第三方代碼生成庫,通過繼承方式實現代理。

動態代理

特性JDK 動態代理CGLIBByteBuddy
是否內置于 JDK否(需要額外依賴)否(需要額外依賴)
代理對象接口類(也支持接口)
代理原理Java 反射 + Proxy.newProxyInstance繼承目標類,動態生成子類修改或生成字節碼
是否支持 final 類支持
是否支持 final 方法支持(可配置)
性能較高(接口)較高(類)非常高,靈活
JDK Proxy

這種類型的代理要求目標對象必須實現至少一個接口。Java動態代理會創建一個實現了相同接口的代理類,然后在運行時動態生成該類的實例。這種代理的核心是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。每一個動態代理類都必須實現InvocationHandler接口,并且每個代理類的實例都關聯到一個handler。當通過代理對象調用一個方法時,這個方法的調用會被轉發為由InvocationHandler接口的invoke()方法來進行調用。

HelloService proxy = (HelloService) Proxy.newProxyInstance(HelloService.class.getClassLoader(),new Class[]{HelloService.class},(proxyObj, method, args) -> {System.out.println("Before method");return method.invoke(realObj, args);});
CGLIB
  • 使用 CGLIB(Code Generation Library)庫。

  • 通過繼承目標類,動態生成子類。

  • 使用ASM 字節碼框架底層生成字節碼。

  • 不能代理 final 類 / final 方法。

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TargetClass.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {System.out.println("Before method");return proxy.invokeSuper(obj, args);
});
TargetClass proxy = (TargetClass) enhancer.create();
ByteBuddy
  • 使用ByteBuddy框架,動態生成/修改字節碼

  • 不僅能做代理,還能修改類定義,創建復雜代理。

  • 靈活性高,可以代理final類、final方法。

HelloService proxy = new ByteBuddy().subclass(HelloService.class).method(ElementMatchers.any()).intercept(MethodDelegation.to(new HelloServiceInterceptor())).make().load(HelloService.class.getClassLoader()).getLoaded().newInstance();

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

Spring框架中的bean是單例的嗎?

  • singleton:bean在每個Spring IOC容器中只有一個實例。默認,通過@Scope("singleton")指定。
  • prototype:一個bean的定義可以有多個實例。
  • 不是線程安全的
  • Spring框架中有一個@Scope注解,默認的值就是singleton,單例的。
  • 因為一般在Spring的bean中都是注入無狀態的對象,沒有線程安全問題,如果在bean中定義了可修改的成員變量,是要考慮線程安全問題的,可以使用多例或者加鎖來解決。

什么是AOP,你們項目中有沒有使用到AOP

AOP稱為面向切面編程,用于將那些與業務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取并封裝為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),減少系統中的重復代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。

常見AOP使用場景:

  • 記錄操作日志
  • 緩存處理
  • Spring中內置的事務處理
Spring中的事務是如何實現的

Spring支持編程式事務管理和聲明式事務管理兩種方式

  • 編程式事務控制:需使用TransactionTemplate來進行實現,對業務代碼有侵入性,項目中很少使用

  • 聲明式事務管理:聲明式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前后進行攔截,將事務處理的功能編制到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。

  • @Trasactional

Spring中事務失效的場景有哪些方法

異常捕獲處理
  • 事務通知只有捕捉到了目標拋出的異常,才能進行后續的回滾處理,如果目標自己處理掉異常,事務通知無法知悉

  • **解決方法:**在catch塊添加throw new RuntimeException(e)拋出

拋出檢查異常
  • Spring默認只會回滾非檢查異常。

    檢查異常(Checked Exception)

    • 繼承自 Exception,但不是 RuntimeException 的子類
    • 編譯時強制檢查,必須使用 try-catch 捕獲,或者 throws 拋出。
    • 典型場景:外部資源操作,如文件、網絡、數據庫。
    • 例子:
      • IOException
      • SQLException
      • ParseException

    非檢查異常(Unchecked Exception)

    • 繼承自 RuntimeException
    • 編譯器不強制處理,可以不寫 try-catchthrows
    • 通常是程序邏輯錯誤,程序員自己修正。
    • 例子:
      • NullPointerException
      • ArrayIndexOutOfBoundsException
      • IllegalArgumentException
  • **解決方法:**添加@Transactional(rollbackFor = Exception.class)

非public方法導致事務失效
  • Spring為方法創建代理、添加事務通知、前提條件都是該方法是public的
  • **解決方法:**改為public方法
自調用
  • 同一個類中一個方法調用另一個 @Transactional 方法,事務不會生效(因為繞過了 Spring 的代理)
多線程操作
  • @Transactional 只作用于當前線程,新開線程不會受事務控制。

Spring的Bean的生命周期

在這里插入圖片描述

BeanDefinition

Spring容器在進行實例化時,會將xml配置的的信息封裝成一個BeanDefinition對象,Spring根據BeanDefinition來創建Bean對象,里面有很多的屬性來描述Bean。

Bean生命周期
  1. 通過BeanDefinition獲取bean的定義信息。
  2. 調用構造函數實例化bean
  3. bean的依賴注入
  4. 處理Aware接口(BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、ApplicationContextAware)
  5. Bean的后置處理器BeanPostProcessor-前置,執行所有注冊的 BeanPostProcessorpostProcessBeforeInitialization 方法,允許對 Bean 進行修改。
  6. 初始化方法(InitializingBean、init-method),如果實現了 InitializingBean,調用其 afterPropertiesSet 方法。如果配置了 init-method,調用該方法。
  7. Bean的后置處理器BeanPostProcessor-后置,執行所有注冊的 BeanPostProcessorpostProcessAfterInitialization 方法,允許對 Bean 進行修改增強(如 AOP 代理)。
  8. 銷毀階段,如果實現了 DisposableBean,調用其 destroy 方法。如果配置了 destroy-method,調用該方法。

Spring中的循環依賴

Spring 循環依賴指的是 多個 Bean 之間互相依賴,形成閉環,在創建 Bean 時相互引用,導致無法完成實例化過程。

三級緩存

循環依賴在Spring中是允許存在,spring框架依據三級緩存已經解決了大部分的循環依賴問題

  1. 一級緩存:單例池,緩存已經經歷了完整的生命周期,已經初始化完成的bean對象
  2. 二級緩存:緩存早期的bean對象(生命周期還沒走完)
  3. 三級緩存:緩存的是ObjectFactory,表示對象工廠,用來創建某個對象的

在這里插入圖片描述

構造方法出現循環依賴

優于Bean生命周期第一步就是執行構造函數,所以三級緩存無法解決構造方法出現的循環依賴

  • 解決方式:加@Lazy延遲加載

    public A(@Lazy B b){this.b = b;
    }
    

    Spring給我們提供了很多擴展點

    擴展點接口說明典型使用場景
    BeanFactoryPostProcessorBeanFactory 初始化后,修改 BeanDefinition修改 Bean 屬性定義,比如修改配置值
    BeanDefinitionRegistryPostProcessor在 BeanFactoryPostProcessor 之前,操作 BeanDefinition 注冊表動態注冊 BeanDefinition
    BeanPostProcessorBean 實例化后,初始化前后進行處理AOP、事務、注入代理 Bean
    InstantiationAwareBeanPostProcessorBeanPostProcessor 子接口,控制 Bean 實例化過程提前暴露代理對象、循環依賴處理
    SmartInstantiationAwareBeanPostProcessor更智能的 InstantiationAwareBeanPostProcessor預測 Bean 類型、提前暴露 Bean
    ApplicationContextInitializerApplicationContext 初始化時執行自定義 ApplicationContext 初始化邏輯
    ApplicationListener監聽 ApplicationEvent 事件發布訂閱模式,解耦組件
    EnvironmentPostProcessor修改 Environment 對象,優先加載配置修改配置屬性,優先級比配置文件還高
    CommandLineRunnerSpring Boot 啟動完成后執行啟動后執行任務(如初始化數據)
    ApplicationRunnerSpring Boot 啟動完成后執行,支持 ApplicationArguments更靈活的啟動后執行任務

Spring的常見注解有哪些

注解說明
@Component、@Controller、@Service、@Repository使用在類上用于實例化Bean
@Autowired使用在字段上用于根據類型依賴注入
@Qualifier結合@Autowired一起使用用于根據名稱進行依賴注入
@Scope標注Bean的作用范圍
@Configuration指定當前類是一個Spring配置類,當創建容器時會從該類上加載注解
@ComponentScan用于指定Spring在初始化容器時要掃描的包
@Bean使用在方法上,標注將該方法的返回值存儲到Spring容器中
@Import使用@Import導入的類會被Spring加載到IOC容器中
@Transactional聲明式事務管理
@Aspect、@Before、@After、@Around、@Pointcut用于切面編程(AOP)

SpringBoot

為什么使用SpringBoot

  • 簡化開發:SpringBoot通過提供一系列的開箱即用的組件和自動配置,簡化了項目的配置和開發過程,開發人員可以更專注于業務邏輯的實現,而不需要花費過多時間在繁瑣的配置上。
  • 快速啟動:SpringBoot提供了快速的應用程序啟動方式,可通過內嵌的Tomcat、Jetty或Undertow等容器快速啟動應用程序,無需額外的配置步驟,方便快捷。
  • 自動化配置:SpringBoot通過自動配置功能,根據項目中的依賴關系和約定俗成的規則來配置應用程序,減少了配置的復雜性,使開發者更容易實現應用的最佳實踐。

SpringBoot自動配置原理

借助 @EnableAutoConfiguration + spring.factories 機制,自動裝配符合條件的 Bean,減少手動配置。

@SpringBootApplication|
@EnableAutoConfiguration|
AutoConfigurationImportSelector|
讀取 META-INF/spring.factories|
按條件導入 xxxAutoConfiguration|
自動裝配 Bean 進 IoC 容器
1?? 啟動入口
  • @SpringBootApplication 注解其實是組合注解,里面包含:
    • @EnableAutoConfiguration
    • @ComponentScan
    • @Configuration
2?? EnableAutoConfiguration
  • 核心注解是 @EnableAutoConfiguration
  • 它通過 @AutoConfigurationImportSelector 實現自動配置導入。
3?? AutoConfigurationImportSelector
  • 作用:掃描 所有需要自動配置的類,動態導入到 Spring 容器。
  • 自動配置類來自 META-INF/spring.factoriesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中定義。
# META-INF/spring.factories 示例
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
4?? 條件裝配
  • 每個 xxxAutoConfiguration 配置類,內部通常會使用以下注解組合,按需配置:
    • @ConditionalOnClass → 某個類存在時才生效。
    • @ConditionalOnMissingBean → 容器里沒有某個 Bean 時才創建。
    • @ConditionalOnProperty → 某個配置開啟時生效。
    • @ConditionalOnBean / @ConditionalOnMissingBean → 依賴其他 Bean。

保證不會亂配、重復配,按需裝配。

5?? 裝配完成
  • 滿足條件的 Bean 被自動注冊進 IoC 容器。
  • 我們只需要簡單配置 yml/properties 即可生效。

SpringBoot用到哪些設計模式

設計模式應用場景
單例模式Bean 默認單例
工廠模式BeanFactory、ApplicationContext 創建 Bean
代理模式AOP 實現方法攔截、事務管理
觀察者模式事件發布監聽(ApplicationEventPublisher)
模板方法模式JdbcTemplate、RestTemplate、事務模板
策略模式多種 Bean 實現同一接口時,按需選擇
適配器模式HandlerAdapter 適配不同類型的 Controller
裝飾器模式Servlet Filter 鏈、增強 Bean 功能
責任鏈模式Spring Security 過濾器鏈、FilterChain
建造者模式配置對象(Builder)、RestTemplateBuilder
享元模式復用 Bean 減少內存消耗

怎么理解SpringBoot中的約定大于配置

框架提供了一套合理默認配置,只要你按照約定來組織代碼、命名、放位置,大部分功能可以開箱即用,你不需要寫很多配置。

  • 自動化配置:SpringBoot提供了大量的自動化配置,通過分析項目的依賴和環境,自動配置應用程序的行為。開發者無需顯式地配置每個細節,大部分常用的配置都已經預設好了。
  • 默認配置:SpringBoot為諸多方面提供了大量默認配置,如連接數據、設置Web服務器、處理日志。開發人員無需手動配置這些常見內容,框架與做好決策。
  • 約定的項目結構:SpringBoot提倡特定項目結構,通常主應用程序類(含main方法)置于根包,控制器類、服務類、數據訪問類等分別放在相應子包。

SpringBoot項目結構

在這里插入圖片描述

流程圖

在這里插入圖片描述

說幾個Starter

  • sping-boot-stater-web:最常用的起步依賴之一,包含Spring MVC和Tomcat嵌入式服務,用于快速構建Web應用程序
  • sping-boot-starter-security:提供了Spring Security的基本配置。
  • mybatis-spring-boot-starter:簡化Spring Boot應用中集成MyBatis的過程。
  • spring-boot-starter-data-redis:繼承Reds緩存。
  • sping-boot-starter-test:包含單元測試和集成測試所需的庫,如JUnit,Spring Test等。

寫過SpringBoot starter嗎

  1. 創建Maven項目,添加Spring Boot和starter parent和一些必要依賴

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version>
    </parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency>
    </dependencies>
    
  2. 編寫自動配置類和屬性類,屬性類綁定配置文件中的屬性。

    package io.github.l4vid4.starter;@Configuration
    @EnableConfigurationProperties(KitProperties.class)
    public class KitAutoConfiguration {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加分頁插件(你可以支持多數據庫)interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}@Bean@ConditionalOnMissingBean(ResponseWrapperAdvice.class)@ConditionalOnProperty(prefix = "mybatis-plus-kit", name = "response-wrapper-enabled", havingValue = "true", matchIfMissing = true)public ResponseWrapperAdvice responseWrapperAdvice(KitProperties properties) {return new ResponseWrapperAdvice(properties);}}
    
    package io.github.l4vid4.starter.conf;@ConfigurationProperties(prefix = "mybatis-plus-kit")
    @Data
    @Getter
    public class KitProperties {/*** 是否啟用統一響應封裝(默認啟用)*/private boolean responseWrapperEnabled = true;
    }
    
  3. 需要在 resources/META-INF/spring.factories 中聲明(sping3以下):

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=io.github.l4vid4.starter.KitAutoConfiguration
    
    • Spring3+需要在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.import中聲明:

      io.github.l4vid4.starter.KitAutoConfiguration
      

    Spring Boot 啟動時會自動掃描 spring.factories 里的配置,加載你的自動配置類。

  4. 將starter發布到maven倉庫

SpringBoot的過濾器和攔截器

在Spring Boot中,過濾器和攔截器是用來處理請求和響應的兩種不同機制

特性Filter(過濾器)Interceptor(攔截器)
所屬規范Servlet 規范Spring MVC
作用范圍所有請求,包括靜態資源僅 Spring MVC 控制器請求
攔截階段請求到達 Servlet 前后請求到達 Controller 前后,視圖渲染前后
觸發時機doFilter()在請求前/響應后被調用preHandler、postHandler、afterCompletion分階段觸發
配置方式注冊 Filter Bean,或 FilterRegistrationBean實現 HandlerInterceptor,配置 WebMvcConfigurer
使用場景日志、編碼、權限、跨域處理等通用功能認證鑒權、業務邏輯處理、記錄用戶操作等
  • 過濾器是Java Servlet規范中的一部分,它可以對進入Servlet容器的請求和響應進行預處理和后處理。過濾器通過實現javax.servlet.Filter接口,并重寫其中的init、doFilterdestroy方法來完成相應的邏輯。當請求進入Servlet容器時,會按照配置的順序依次經過各個過濾器,然后再到達目標Servlet或控制器;響應返回時,也會按照相反的順序再次經過這些過濾器。
  • 攔截器是Spring框架提供的一種機制,它可以對控制器方法的執行進行攔截。攔截器通過實現org.springFramework.web.servlet.HandlerInterceptor接口,并重寫其中的preHandle、PostHandleafterCompletion方法來完成相應的邏輯。當請求到達控制器時,會先經過攔截器的preHandle方法,如果該方法返回true,則繼續執行后續的控制器方法和其他攔截器;在控制器方法執行完成后,會調用攔截器的postHandle方法;最后,在請求處理完成后,會調用攔截器的afterCompletion方法。

SpringBoot常見注解有哪些?

注解說明
@SpringBootApplication啟動入口注解,包含 @Configuration@EnableAutoConfiguration@ComponentScan
@SpringBootConfiguration標注 Spring Boot 配置類,本質是 @Configuration,被 @SpringBootApplication 包含
@EnableAutoConfiguration開啟自動配置(被 @SpringBootApplication 包含)
@ConfigurationProperties將配置文件中的屬性綁定到 Java Bean 上
@EnableConfigurationProperties開啟 @ConfigurationProperties 注解生效
@ConditionalOnClass某個類存在時自動配置生效
@ConditionalOnMissingBean當容器中不存在指定 Bean 時進行自動配置
@ConditionalOnProperty當指定配置屬性存在且滿足條件時生效
@ConditionalOnBean當容器中存在某個 Bean 時生效
@ConditionalOnMissingClass某個類不存在時自動配置生效
@ConditionalOnWebApplicationWeb 應用環境下自動配置生效
@ConditionalOnNotWebApplication非 Web 應用環境下自動配置生效
@SpringBootTest用于測試類,啟動完整的 Spring Boot 應用上下文
@TestConfiguration專門為測試提供的配置類
@DataJpaTest測試 JPA 相關組件(Repository 層)
@WebMvcTest測試 MVC Controller 層
@MockBean在測試中 Mock 某個 Bean
@EnableScheduling啟用定時任務調度功能
@EnableAsync啟用異步方法執行

SpringMVC

SpringMVC的執行流程

視圖階段(JSP)
  1. 用戶發送請求到前端控制器DispatcherServlet
  2. DispatcherServlet收到請求調用HandlerMapping(處理器映射器)
  3. HandlerMapping找到具體的處理器,生成處理器對象及處理器攔截器(如果有),再一起返回給DispatcherServlet。
  4. DispatcherServlet調用HandlerAdapter(處理器適配器)
  5. HandlerAdapter經過適配調用具體的處理器(Handler/Controller)
  6. Controller執行完成返回ModelAndView對象
  7. HandlerAdapter將Controller執行結果ModelAndView返回給DispatcherServlet
  8. DispatcherServlet將ModelAndView傳給ViewReslover(視圖解析器)
  9. ViewReslover解析后返回具體的View(視圖)
  10. DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)
  11. Dispatcher響應用戶

在這里插入圖片描述

前后端分離階段(接口開發,異步請求)
  1. 用戶發送請求到前端控制器DispatcherServlet
  2. DispatcherServlet收到請求調用HandlerMapping(處理器映射器)
  3. HandlerMapping找到具體的處理器,生成處理器對象及處理器攔截器(如果有),再一起返回給DispatcherServlet。
  4. DispatcherServlet調用HandlerAdapter(處理器適配器)
  5. HandlerAdapter經過適配調用具體的處理器(Handler/Controller)
  6. 方法上添加了@ResponseBody
  7. 通過HttpMessageConverter來將返回結果轉換為JSON并響應

在這里插入圖片描述

SpringMVC的常見注解有哪些

注解說明
@RequestMapping映射請求路徑到 Controller 方法,可指定 GET、POST 等
@RequestBody將請求體中的 JSON/XML 數據綁定到方法參數上,將Json轉換為Java對象
@RequestParam將請求參數綁定到方法參數上,通常用于 URL 參數
@PathVariable將 URL 路徑中的占位符綁定到方法參數上(/user/{id})
@ResponseBody將方法返回值直接寫入 HTTP 響應體,通常用于返回 JSON
@RequestHeader將請求頭中的值綁定到方法參數上
@RestController組合注解,等于 @Controller + @ResponseBody,用于 RESTful API

SpringCloud

SpringCloud和SpringBoot的區別

  • SpringBoot是用于構建單個Spring應用的框架,而SpringCloud則是用于構建分布式系統中的微服務架構的工具,Spring Cloud提供了服務注冊與發現、負載均衡、斷路器、網關等功能。
  • 兩者可以結合使用,通過Spring Boot構建微服務應用,然后用Spring Cloud來實現微服務架構中的各種功能。

微服務常用的組件

在這里插入圖片描述

  • 注冊中心:注冊中心是微服務架構最核心的組件。它起到的作用是對新節點的注冊與狀態維護,解決了如何發現新節點以及檢查各節點的運行狀態的問題。微服務節點在啟動時會將自己的服務名稱、IP、端口等信息在注冊中心登記,注冊中心會定時檢查該節點的運行狀態。注冊中心通常會采用心跳機制最大程度保證已登記過的服務節點都是可用的。
  • 負載均衡:負載均衡解決了如何發現服務及負載均衡如何實現的問題,通常微服務在互相調用時,并不是直接通過IP、端口進行訪問調用。而是先通過服務名在注冊中心查詢該服務擁有哪些節點,注冊中心將該服務可用節點列表返回給服務調用者,這個過程叫服務發現,因服務高可用的要求,服務調用者會接收到多個節點,必須要從中進行選擇。因此服務調用者一端必須內置負載均衡器,通過負載均衡策略選擇合適的節點發起實質性的通信請求。
  • 服務通信:服務通信組件解決了服務間如何進行消息通信的問題,服務間通信采用輕量級協議,通常時HTTP RESTful風格。但因為RESTful風格過于靈活,必須加以約束,通常應用時對其封裝。例如在SpingCloud中就提供了Feign和RestTemplate兩種技術屏蔽底層的實現細節,所有開發者都是基于封裝后統一的SDK進行開發,有利于團隊間的相互合作。
  • 配置中心:配置中心主要解決了如何集中管理各節點配置文件的問題,在微服務架構下,所有的微服務節點都包含自己的各種配置文件,如jdbc配置、自定義配置、環境配置、運行參數配置等。要知道有的微服務可能有幾十個節點,如果將這些配置文件分散存儲在節點上,發生配置更改就需要逐個節點調整,將給運維人員帶來巨大的壓力。配置中心便由此而生,通過部署配置中心服務器,將各節點配置文件從服務中剝離,集中轉存到配置中心。一般配置中心都有UI界面,方便實現大規模集群配置調整。
  • 集中式日志管理:集中式日志主要解決了如何收集各節點日志并統一管理的問題。微服務架構默認將應用日志分別保存在部署節點上,當需要對日志數據和操作數據進行數據分析和數據統計時,必須收集所有節點的日志數據。那么怎么高效收集所有節點的日志數據呢?業內常見的方案有ELF、EFK。通過搭建獨立的日志收集系統,定時抓取各節點增量日志形成有效的統計報表,為統計和分析提供數據支撐。
  • 分布式鏈路追蹤:分布式鏈路解決了如何直觀的了解各節點間的調用鏈路的問題。系統中一個復雜的業務流程,可能會出現連續調用多個微服務,我們需要了解完整的業務邏輯涉及的每個微服務的運行狀態,通過可視化鏈路圖展現,可以幫助開發人員快速分析系統瓶頸及出錯的服務。
  • 服務保護:服務保護主要是解決了如何對系統進行鏈路保護,避免服務雪崩的問題。在業務運行時,微服務間互相調用支撐,如果某個微服務出現高延遲導致線程池滿載,或是業務處理失敗。這里就需要引入服務保護組件來實現高延遲服務的快速降級,避免系統崩潰。

SpringCloud Alibaba實現的微服務結構

在這里插入圖片描述

  • SpringCloud Alibaba 中使用 Alibaba Nacos 組件實現 注冊中心,Nacos 提供了一組簡單易用的特性集,可快速實現動態服務發現、服務配置、服務元數據及流量管理。

  • SpringCloud Alibaba 使用 Nacos 服務均衡 實現負載均衡,區別于 Ribbon 是在調用端負載,Nacos 是在服務發現時即負載均衡。

  • SpringCloud Alibaba 使用 Netflix FeignAlibaba Dubbo 組件實現服務通信,Feign 是基于 HTTP,Dubbo 是基于 RPC。

  • SpringCloud Alibaba 在 API 網關 使用 Spring Cloud Gateway

  • SpringCloud Alibaba 配置中心使用 Nacos 內置配置中心,可將配置信息存儲在指定數據庫中。

  • SpringCloud Alibaba 支持阿里云 日志服務(LOG) 實現日志集中管理。

  • SpringCloud Alibaba 支持 分布式鏈路追蹤,可選 Sleuth/Zipkin Server

  • SpringCloud Alibaba 使用 Alibaba Sentinel 實現系統保護,比 Hystrix 更優雅、功能更強大。

負載均衡有哪些算法

  • 簡單輪詢:將請求按順序分發給后端服務器上,不關心服務器當前的狀態,比如后端服務器的性能、當前的負載。
  • 加權輪詢:根據服務器自身的性能給服務器設置不同的權重,將請求按順序和權重分發給后端服務器,可以讓性能高的機器處理更多的請求。
  • 簡單隨機:將請求隨機分發到后端服務器上,請求越多,各個服務器接收到的請求越平均。
  • 加權隨機:根據服務器自身的性能給服務器設置不同的權重,將請求按各個服務器的權重隨即分發給后端服務器。
  • 一致性哈希:根據請求的客戶端ip、或請求參數通過哈希算法得到一個數值,利用該數值取模映射出對應的后端服務器,這樣能保證同一個客戶端或相同參數的請求每次都使用同一臺服務器。
  • 最小活躍數:統計每臺服務器上當前正在處理的請求數,也就是請求活躍數,將請求分發給活躍數最少的后臺服務器。

介紹一下服務熔斷

服務熔斷是應對微服務雪崩效應的一種鏈路保護機制,類似保險絲。

當某個服務出現故障(如響應超時、錯誤率升高)時,主動中斷對該服務的調用,避免大量請求繼續壓垮服務,影響整個系統。

主要概念
  • 熔斷器(Circuit Breaker):像電路的保險絲,觸發后“斷開”調用鏈。
  • 三種狀態
    1. 閉合(Closed):正常調用,監控失敗率。
    2. 打開(Open):熔斷狀態,直接失敗,快速返回,保護服務。
    3. 半開(Half-Open):試探恢復,部分請求允許通過,成功則關閉熔斷器,失敗繼續打開。
觸發條件
  • 請求失敗率超過閾值
  • 響應時間過長
  • 異常量過大

介紹一下服務降級

服務降級一般是指在服務器壓力劇增的時候,根據實際業務使用情況以及流量,對一些服務和頁面有策略的不處理或者用一種簡單的方式處理,從而釋放服務器資源以保證核心業務的正常高效運行

服務降級是從整個系統的負荷情況出發和考慮的,對某些負荷比較高的情況,為了預防某些功能(業務場景)出現符合過載或者響應慢的情況,在其內部暫時舍棄對一些非核心的接口和數據的請求,而直接返回一個提前準備好的fallback(退路)錯誤處理信息。這樣,雖然提供的是一個有損的服務,但卻保證了整個系統的穩定性和可用性。

場景降級策略
推薦系統不可用返回緩存推薦
某服務調用超時返回默認值、緩存數據、提示稍后再試
訂單服務超時提示用戶稍后再試
非核心服務壓力大暫時關閉該服務
大促期間高并發關閉部分耗資源的統計/監控功能

服務熔斷和服務降級的區別

對比項服務熔斷服務降級
定義自動中斷調用,防止連鎖故障擴散主動降低服務質量,保證核心可用
觸發條件故障率高、超時多、異常量大服務不可用、高并發、資源不足
行為直接拒絕請求,快速失敗返回默認值、緩存、簡化邏輯
作用對象主要針對調用鏈中的下游服務針對本地服務或全鏈路服務
是否主動控制否(框架監控后自動熔斷)是(開發者主動配置)
恢復方式半開狀態自動探測后恢復手動/自動恢復
場景防止雪崩、保護依賴服務高峰限流、功能降級、提升可用性

SpringAI

什么是SpringAI

Spring AI 是 Spring 官方推出的 AI 集成框架,用于簡化將 AI 服務(如 OpenAI、Azure OpenAI、Anthropic、HuggingFace 等)集成到 Spring 應用中,具備:

  • 簡化 API 調用
  • 支持 Prompt 工程
  • 支持 RAG(檢索增強生成)
  • 支持向量數據庫集成(如 Pinecone、Milvus 等)
  • 易于與 Spring Boot、Spring Cloud 生態整合

什么是 RAG?Spring AI 如何實現?

  • RAG(Retrieval-Augmented Generation,檢索增強生成)是一種將外部知識與大模型結合的技術,提升回答質量。

  • Spring AI 支持通過 VectorStore 配合 ChatClient 實現 RAG:

  1. 查詢 VectorStore → 找到相關文檔
  2. 拼接到 Prompt 里 → 提交給 LLM
  3. 返回生成結果

SpringAI向量數據庫

Spring AI 的向量數據庫(Vector Store)功能,是用來支持 RAG(檢索增強生成) 場景的。 它將文本、文檔等內容轉成 向量(Embedding),存入向量數據庫,后續可以通過相似度檢索相關內容,增強 LLM 的回答效果。

使用流程:
  1. 生成向量
    調用 LLM/Embedding API 將文本轉成向量。

  2. 存儲向量
    通過 vectorStore.add(doc) 存入數據庫。

  3. 相似度檢索
    用當前用戶問題轉成向量,做 similaritySearch 檢索。

  4. 拼接上下文到 Prompt
    將檢索到的相關內容拼 Prompt 提交給 LLM,提升答案準確性。

SpringAI會話記憶功能

Spring AI 的會話記憶功能,是指在多輪對話場景中,自動保存對話歷史上下文,讓大模型(LLM)能夠理解前后語境,做出更連貫的回答。

Spring AI 提供了 MemoryChatClient,在調用時會自動將之前的對話歷史拼接到 Prompt 里發送給模型,開發者無需手動管理上下文。

常見的 Memory 存儲實現包括:

  • InMemoryChatMemory(內存型,適合單機調試)
  • RedisChatMemory(支持跨服務/分布式場景)
  • 自定義 ChatMemory 接口實現(如數據庫)

SpringAI的PromptTemplate

通過 PromptTemplate 可以動態構建 Prompt,支持參數化,提升 Prompt 工程的可復用性和可維護性。

PromptTemplate template = new PromptTemplate("請介紹一下{topic}");
Prompt prompt = template.create(Map.of("topic", "Spring AI"));

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

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

相關文章

NineData數據庫DevOps功能全面支持百度智能云向量數據庫 VectorDB,助力企業 AI 應用高效落地

NineData 的數據庫 DevOps 解決方案已完成對百度智能云向量數據庫 VectorDB 的全鏈路適配&#xff0c;成為國內首批提供 VectorDB 原生操作能力的服務商。此次合作聚焦 AI 開發核心場景&#xff0c;通過標準化 SQL 工作臺與細粒度權限管控兩大能力&#xff0c;助力企業安全高效…

開源技術驅動下的上市公司財務主數據管理實踐

開源技術驅動下的上市公司財務主數據管理實踐 —— 以人造板制造業為例 引言&#xff1a;財務主數據的戰略價值與行業挑戰 在資本市場監管日益嚴格與企業數字化轉型的雙重驅動下&#xff0c;財務主數據已成為上市公司財務治理的核心基礎設施。對于人造板制造業而言&#xff0…

借助它,普轉也能獲得空轉信息?

在生命科學研究領域&#xff0c;轉錄組技術是探索基因表達奧秘的有力工具&#xff0c;在疾病機制探索、生物發育進程解析等諸多方面取得了顯著進展。然而&#xff0c;隨著研究的深入&#xff0c;研究人員發現普通轉錄組只能提供整體樣本中的基因表達水平信息&#xff0c;卻無法…

synchronized 學習

學習源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.應用場景 不超賣&#xff0c;也要考慮性能問題&#xff08;場景&#xff09; 2.常見面試問題&#xff1a; sync出…

Java事務回滾詳解

一、什么是事務回滾&#xff1f; 事務回滾指的是&#xff1a;當執行過程中發生異常時&#xff0c;之前對數據庫所做的更改全部撤銷&#xff0c;數據庫狀態恢復到事務開始前的狀態。這是數據庫“原子性”原則的體現。 二、Spring 中的 Transactional 默認行為 在 Spring 中&am…

云災備數據復制技術研究

云災備數據復制技術&#xff1a;數字時代的“安全氣囊” 在當今信息化時代&#xff0c;數據就像城市的“生命線”&#xff0c;一旦中斷&#xff0c;后果不堪設想。想象一下&#xff0c;如果政務系統突然崩潰&#xff0c;成千上萬的市民服務將陷入癱瘓。這就是云災備技術的重要…

如何處理Shopify主題的顯示問題:實用排查與修復指南

在Shopify店鋪運營過程中&#xff0c;主題顯示問題是影響用戶體驗與品牌形象的常見痛點。可能是字體錯位、圖片無法加載、移動端顯示混亂、功能失效等&#xff0c;這些都可能造成客戶流失和轉化下降。 本文將從問題識別、原因分析、修復方法到開發者建議全方位解讀如何高效解決…

前端監控方案詳解

一、前端監控方案是什么&#xff1f; 前端監控方案是一套系統化的工具和流程&#xff0c;用于收集、分析和報告網站或Web應用在前端運行時的各種性能指標、錯誤日志、用戶行為等數據。它通常包括以下幾個核心模塊&#xff1a; 性能監控&#xff1a;頁面加載時間、資源加載時間…

Camera相機人臉識別系列專題分析之十二:人臉特征檢測FFD算法之libvega_face.so數據結構詳解

【關注我&#xff0c;后續持續新增專題博文&#xff0c;謝謝&#xff01;&#xff01;&#xff01;】 上一篇我們講了&#xff1a; Camera相機人臉識別系列專題分析之十一&#xff1a;人臉特征檢測FFD算法之低功耗libvega_face.so人臉屬性(年齡&#xff0c;性別&#xff0c;膚…

如何配置HarmonyOS 5與React Native的開發環境?

配置 HarmonyOS 5 與 React Native 的開發環境需遵循以下步驟 一、基礎工具安裝 ?DevEco Studio 5.0? 從 HarmonyOS 開發者官網 下載安裝勾選組件&#xff1a; HarmonyOS SDK (API 12)ArkTS 編譯器JS/ArkTS 調試工具HarmonyOS 本地模擬器 ?Node.js 18.17 # 安裝后驗證版…

kotlin kmp 副作用函數 effect

在 Kotlin Multiplatform (KMP) Compose 中&#xff0c;“effect functions”&#xff08;或“effect handlers”&#xff09;是專門的可組合函數&#xff0c;用于在 UI 中管理副作用。 在 Compose 中&#xff0c;可組合函數應該是“純”的和聲明式的。這意味著它們應該理想地…

3.3.1_1 檢錯編碼(奇偶校驗碼)

從這節課開始&#xff0c;我們會探討數據鏈路層的差錯控制功能&#xff0c;差錯控制功能的主要目標是要發現并且解決一個幀內部的位錯誤&#xff0c;我們需要使用特殊的編碼技術去發現幀內部的位錯誤&#xff0c;當我們發現位錯誤之后&#xff0c;通常來說有兩種解決方案。第一…

【Pandas】pandas DataFrame isna

Pandas2.2 DataFrame Missing data handling 方法描述DataFrame.fillna([value, method, axis, …])用于填充 DataFrame 中的缺失值&#xff08;NaN&#xff09;DataFrame.backfill(*[, axis, inplace, …])用于**使用后向填充&#xff08;即“下一個有效觀測值”&#xff09…

MQTT協議:物聯網時代的通信基石

MQTT協議&#xff1a;物聯網時代的通信基石 在當今快速發展的物聯網&#xff08;IoT&#xff09;時代&#xff0c;設備之間的通信變得尤為重要。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;協議作為一種輕量級的消息傳輸協議&#xff0c;正逐漸成為物聯…

Excel 表格內批量添加前綴與后綴的實用方法

我們經常需要為 Excel 表格中的內容統一添加前綴或后綴&#xff0c;例如給編號加“NO.”、給姓名加“會員_”等。手動操作效率低&#xff0c;本文將介紹幾種實用的方法&#xff0c;幫助你快速完成批量添加前綴和后綴的操作。 使用“&”運算符添加前綴或后綴&#xff08;推…

uniapp 實現騰訊云IM群文件上傳下載功能

UniApp 集成騰訊云IM實現群文件上傳下載功能全攻略 一、功能背景與技術選型 在團隊協作場景中&#xff0c;群文件共享是核心需求之一。本文將介紹如何基于騰訊云IMCOS&#xff0c;在uniapp中實現&#xff1a; 群內文件上傳/下載文件元數據管理下載進度追蹤跨平臺文件預覽 二…

GO協程(Goroutine)問題總結

在使用Go語言來編寫代碼時&#xff0c;遇到的一些問題總結一下 [參考文檔]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函數默認的Goroutine 場景再現&#xff1a; 今天在看到這個教程的時候&#xff0c;在自己的電…

uniapp微信小程序視頻實時流+pc端預覽方案

方案類型技術實現是否免費優點缺點適用場景延遲范圍開發復雜度?WebSocket圖片幀?定時拍照Base64傳輸? 完全免費無需服務器 純前端實現高延遲高流量 幀率極低個人demo測試 超低頻監控500ms-2s???RTMP推流?TRTC/即構SDK推流? 付費方案 &#xff08;部分有免費額度&#x…

分布式鎖實戰:Redisson vs. Redis 原生指令的性能對比

分布式鎖實戰&#xff1a;Redisson vs. Redis 原生指令的性能對比 引言 在DIY主題模板系統中&#xff0c;用戶可自定義聊天室的背景、圖標、動畫等元素。當多個運營人員或用戶同時修改同一模板時&#xff0c;若沒有鎖機制&#xff0c;可能出現“甲修改了背景色&#xff0c;乙…

C++ 設計模式《復制粘貼的奇跡:小明的原型工廠》

&#x1f468;?&#x1f393; 模式名稱&#xff1a;原型模式&#xff08;Prototype Pattern&#xff09; &#x1f4d6; 背景故事 創業初期&#xff0c;小明每天加班寫配送路線、配送策略、營銷套餐。可當業務做大后&#xff0c;他發現大家常常下單“上次那個套餐”—— “老…