Spring MVC 視圖解析器 (ViewResolver) 如何配置? Spring Boot 是如何自動配置常見視圖解析器的?

我們來詳細分析一下視圖解析器 (ViewResolver) 的配置以及 Spring Boot 是如何自動配置它們的。

視圖解析器 (ViewResolver) 是什么?

在 Spring MVC 中,當控制器 (Controller) 方法處理完請求并返回一個邏輯視圖名 (String) 時,DispatcherServlet 會使用注冊的 ViewResolver 來將這個邏輯視圖名解析為一個實際的 View 對象。這個 View 對象負責渲染最終的響應(例如,生成 HTML)。

1. 如何手動配置視圖解析器?

可以手動配置 ViewResolver,在 Spring 的配置類(使用 @Configuration 注解)中完成。

核心接口是 org.springframework.web.servlet.ViewResolver

以下是一些常見的視圖解析器及其手動配置示例:

a. InternalResourceViewResolver (通常用于 JSP)

這是最常用的 JSP 視圖解析器。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView; // 如果使用 JSTL@Configuration
@EnableWebMvc // 如果不是 Spring Boot,通常需要這個
public class MvcConfig implements WebMvcConfigurer { // 實現 WebMvcConfigurer 以便自定義MVC配置@Beanpublic ViewResolver jspViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setViewClass(JstlView.class); // 如果使用JSTL標簽庫resolver.setPrefix("/WEB-INF/jsp/");   // 視圖文件的前綴路徑resolver.setSuffix(".jsp");            // 視圖文件的后綴resolver.setOrder(1); // 如果有多個解析器,設置順序return resolver;}// 可以配置其他 ViewResolver// @Bean// public ViewResolver thymeleafViewResolver() { ... }
}
  • prefix: 視圖文件在 Web 應用中的路徑前綴。
  • suffix: 視圖文件的擴展名。
  • viewClass: 指定要使用的視圖類,例如 JstlView (用于JSP + JSTL)。
  • order: 如果有多個視圖解析器,order 屬性決定了它們的查找順序,值越小優先級越高。

b. ThymeleafViewResolver (用于 Thymeleaf 模板引擎)

需要先配置 SpringTemplateEngineTemplateResolver

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring6.SpringTemplateEngine; // Spring 6, Spring 5 用 spring5
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;@Configuration
@EnableWebMvc
public class ThymeleafConfig implements WebMvcConfigurer {private ApplicationContext applicationContext;public ThymeleafConfig(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}@Beanpublic SpringResourceTemplateResolver templateResolver() {SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();templateResolver.setApplicationContext(this.applicationContext);templateResolver.setPrefix("classpath:/templates/"); // Thymeleaf 模板通常放在 classpath 下templateResolver.setSuffix(".html");templateResolver.setTemplateMode(TemplateMode.HTML);templateResolver.setCharacterEncoding("UTF-8");templateResolver.setCacheable(false); // 開發時關閉緩存return templateResolver;}@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver());templateEngine.setEnableSpringELCompiler(true); // 推薦開啟SpringEL編譯器// 可以添加額外的 Dialect,例如 SpringSecurityDialectreturn templateEngine;}@Beanpublic ViewResolver thymeleafViewResolver() {ThymeleafViewResolver resolver = new ThymeleafViewResolver();resolver.setTemplateEngine(templateEngine());resolver.setCharacterEncoding("UTF-8");resolver.setOrder(0); // 優先級高return resolver;}
}

c. FreeMarkerViewResolver (用于 FreeMarker 模板引擎)

需要配置 FreeMarkerConfigurer

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;@Configuration
@EnableWebMvc
public class FreeMarkerConfig implements WebMvcConfigurer {@Beanpublic FreeMarkerConfigurer freeMarkerConfigurer() {FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();configurer.setTemplateLoaderPath("classpath:/templates/freemarker/"); // FreeMarker模板路徑configurer.setDefaultEncoding("UTF-8");return configurer;}@Beanpublic ViewResolver freeMarkerViewResolver() {FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();resolver.setCache(true); // 生產環境建議開啟緩存resolver.setPrefix(""); // 前綴通常在 FreeMarkerConfigurer 中設置resolver.setSuffix(".ftl");resolver.setContentType("text/html;charset=UTF-8");resolver.setOrder(0);return resolver;}
}

d. ContentNegotiatingViewResolver

這是一個特殊的視圖解析器,它本身不解析視圖,而是委托給一個或多個其他的視圖解析器。它會根據請求的媒體類型 (Media Type,例如通過 Accept HTTP頭或URL后綴) 來選擇合適的 ViewResolver (進而選擇合適的 View) 來渲染響應。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.accept.ContentNegotiationManager;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
// ... 其他 ViewResolver importsimport java.util.ArrayList;
import java.util.List;@Configuration
@EnableWebMvc
public class ContentNegotiationMvcConfig implements WebMvcConfigurer {@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configurer.favorParameter(true) // 是否通過請求參數(默認為format)來確定媒體類型.parameterName("mediaType") // 請求參數名.ignoreAcceptHeader(false) // 是否忽略Accept請求頭.defaultContentType(MediaType.TEXT_HTML) // 默認媒體類型.mediaType("html", MediaType.TEXT_HTML).mediaType("json", MediaType.APPLICATION_JSON).mediaType("xml", MediaType.APPLICATION_XML);}@Beanpublic ViewResolver contentNegotiatingViewResolver(ContentNegotiationManager manager) {ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();resolver.setContentNegotiationManager(manager);List<ViewResolver> resolvers = new ArrayList<>();// 添加你想要委托的 ViewResolverresolvers.add(jsonViewResolver()); // 假設有一個處理 JSON 的 ViewResolverresolvers.add(jspViewResolver());   // 上面定義的 JSP ViewResolver// ... 其他resolver.setViewResolvers(resolvers);resolver.setOrder(0); // CNVR 通常優先級最高return resolver;}// 示例:一個簡單的 JSON ViewResolver (通常會使用 MappingJackson2JsonView)// @Bean// public ViewResolver jsonViewResolver() { ... }@Beanpublic ViewResolver jspViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/jsp/");resolver.setSuffix(".jsp");return resolver;}
}

2. Spring Boot 是如何自動配置常見視圖解析器的?

Spring Boot 的核心思想是“約定優于配置” (Convention over Configuration)。它通過自動配置 (Auto-configuration) 機制,根據我們項目中添加的依賴來自動配置應用程序的各個方面,包括視圖解析器。

自動配置的觸發條件:

  1. 類路徑檢測:Spring Boot 會檢查類路徑下是否存在特定的類。例如,如果檢測到 Thymeleaf 的相關類,它就會嘗試配置 Thymeleaf。
  2. @ConditionalOnClass / @ConditionalOnMissingBean:自動配置類通常使用這些注解。
    • @ConditionalOnClass: 只有當指定的類存在于類路徑上時,配置才會生效。
    • @ConditionalOnMissingBean: 只有當用戶沒有自己定義同類型的 Bean 時,Spring Boot 的自動配置 Bean 才會生效。

常見視圖解析器的自動配置:

Spring Boot 為多種模板引擎提供了自動配置支持。這些配置通常在 spring-boot-autoconfigure.jar 中的 org.springframework.boot.autoconfigure.web.servlet (針對Servlet Web) 或 org.springframework.boot.autoconfigure.web.reactive (針對Reactive WebFlux) 包下。

a. Thymeleaf (spring-boot-starter-thymeleaf)

  • 依賴:添加 spring-boot-starter-thymeleaf 依賴時,相關的 Thymeleaf 類會被引入。
  • 自動配置類ThymeleafAutoConfiguration
  • 行為
    • 會自動配置 SpringResourceTemplateResolverSpringTemplateEngineThymeleafViewResolver
    • 默認模板位置:classpath:/templates/
    • 默認模板后綴:.html
    • 默認編碼:UTF-8
    • 可以通過 application.propertiesapplication.yml 修改這些默認值:
      spring.thymeleaf.prefix=classpath:/templates/
      spring.thymeleaf.suffix=.html
      spring.thymeleaf.mode=HTML
      spring.thymeleaf.encoding=UTF-8
      spring.thymeleaf.cache=true # 生產環境建議 true,開發環境 false
      

b. FreeMarker (spring-boot-starter-freemarker)

  • 依賴:添加 spring-boot-starter-freemarker
  • 自動配置類FreeMarkerAutoConfiguration
  • 行為
    • 會自動配置 FreeMarkerConfigurerFreeMarkerViewResolver
    • 默認模板位置:classpath:/templates/ (注意,FreeMarker 傳統上有一個自己的路徑,但 Spring Boot 會配置 FreeMarkerConfigurertemplateLoaderPathspring.freemarker.template-loader-path 的值,默認為 classpath:/templates/)。
    • 默認模板后綴:.ftlh (FreeMarker Template Language HTML,也可以是 .ftl)
    • 可以通過 application.propertiesapplication.yml 修改:
      spring.freemarker.template-loader-path=classpath:/templates/freemarker/
      spring.freemarker.suffix=.ftl
      spring.freemarker.charset=UTF-8
      spring.freemarker.cache=true
      # 更多配置...
      

c. Groovy Templates (spring-boot-starter-groovy-templates)

  • 依賴:添加 spring-boot-starter-groovy-templates
  • 自動配置類GroovyTemplateAutoConfiguration
  • 行為
    • 會自動配置 GroovyMarkupConfigurerGroovyMarkupViewResolver
    • 默認模板位置:classpath:/templates/
    • 默認模板后綴:.tpl
    • 可以通過 application.propertiesapplication.yml 修改:
      spring.groovy.template.prefix=classpath:/templates/
      spring.groovy.template.suffix=.tpl
      # 更多配置...
      

d. JSP (特殊情況)

  • 依賴:JSP 通常不需要特定的 Spring Boot starter 來“啟用”,而是依賴于 Servlet 容器(如 Tomcat, Jetty, Undertow)對 JSP 的支持。如果使用嵌入式容器,需要確保它支持 JSP。例如,對于 Tomcat,tomcat-embed-jasper 是必需的,它通常由 spring-boot-starter-web 間接引入。
  • 自動配置類WebMvcAutoConfiguration 內部有一個內部類 WebMvcAutoConfigurationAdapter,它會嘗試配置 InternalResourceViewResolver
  • 行為
    • 如果 Spring Boot 檢測到 javax.servlet.jsp.JspPage (或 Jakarta EE 9+ 的 jakarta.servlet.jsp.JspPage) 在類路徑上,并且沒有其他更專門的視圖解析器(如 Thymeleaf 的)被配置,它可能會配置一個 InternalResourceViewResolver
    • 重要:JSP 在使用 Spring Boot 的可執行 JAR (fat JAR) 方式打包和運行時存在一些限制,因為 JSP 需要編譯。它們更適合傳統的 WAR 包部署。
    • 可以通過 application.propertiesapplication.yml 修改(如果 InternalResourceViewResolver 被自動配置):
      spring.mvc.view.prefix=/WEB-INF/jsp/
      spring.mvc.view.suffix=.jsp
      
      但通常,如果使用了像 Thymeleaf 這樣的模板引擎,Spring Boot 會優先配置它們的 ViewResolver,而 InternalResourceViewResolver 的自動配置優先級較低。

e. ContentNegotiatingViewResolver (自動配置)

  • Spring Boot 默認會自動配置 ContentNegotiatingViewResolver (WebMvcAutoConfiguration 的一部分)。
  • 它會智能的包裝所有其他已配置的(包括自動配置和用戶自定義的)ViewResolver
  • 它使得應用可以根據請求(如 Accept 頭)返回不同格式的響應(HTML, JSON, XML 等),而控制器代碼無需改變。

f. BeanNameViewResolver (自動配置)

  • Spring Boot 也會自動配置 BeanNameViewResolver
  • 如果控制器返回的邏輯視圖名與 Spring 應用上下文中某個 View bean 的名稱匹配,則會使用該 View bean。它的 order 值較高(優先級較低),通常在 InternalResourceViewResolver 之后。

g. WelcomePageHandlerMapping 和靜態資源

  • 雖然不是嚴格的 ViewResolver,但 Spring Boot 也會自動配置對 index.html 作為歡迎頁面的支持 (WelcomePageHandlerMapping) 以及從 classpath:/static/, classpath:/public/, classpath:/resources/, classpath:/META-INF/resources/ 等位置提供靜態資源的服務。

如何覆蓋或禁用自動配置?

  1. 提供自己的 Bean:如果定義了與自動配置相同類型的 Bean (例如,你自己定義了一個 ThymeleafViewResolver Bean),那么 Spring Boot 的自動配置版本將不會生效 (因為 @ConditionalOnMissingBean)。
  2. 使用 application.properties:對于大多數自動配置的屬性,我們可以通過 application.propertiesapplication.yml 來覆蓋默認值。
  3. 排除自動配置類:如果想完全禁用某個自動配置,可以使用 @SpringBootApplication (或 @EnableAutoConfiguration) 的 exclude 屬性:
    @SpringBootApplication(exclude = ThymeleafAutoConfiguration.class)
    public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
    }
    

總結:

  • 手動配置:給予完全的控制權,適用于非 Spring Boot 項目或需要深度定制的場景。
  • Spring Boot 自動配置:極大的簡化了常見視圖技術的集成。通過添加相應的 starter 依賴,Spring Boot 會根據約定自動配置好視圖解析器,并允許通過屬性文件進行簡單的定制。如果需要更復雜的定制,仍然可以提供自己的 Bean 來覆蓋自動配置。

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

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

相關文章

理解網站導航文件:robots.txt、sitemap.xml與LLMs.txt的全面解析

在當今數字化時代&#xff0c;網站不僅需要為人類用戶提供良好的瀏覽體驗&#xff0c;還需要考慮搜索引擎和人工智能系統的可訪問性。本文將深入探討三種關鍵的網站導航文件&#xff1a;傳統的robots.txt和sitemap.xml&#xff0c;以及新興的LLMs.txt&#xff0c;分析它們的功能…

leetcode 349. Intersection of Two Arrays

題目描述 題目限制0 < nums1[i], nums2[i] < 1000&#xff0c;所以可以開辟一個1001個元素的數組來做哈希表。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> table(1001,0…

【軟件工程】軟件多缺陷定位方法總結

軟件多缺陷定位(Multi-Fault Localization)是軟件工程中的一個重要研究方向,旨在同時定位代碼中存在的多個缺陷(Bug)。由于多個缺陷可能相互干擾(如掩蓋錯誤行為),導致傳統單缺陷定位方法效果下降,因此需要針對多缺陷場景的特殊性設計方法。以下是常見的多缺陷定位方法…

【數據結構入門訓練DAY-30】數的劃分

文章目錄 前言一、題目二、解題思路結語 前言 本次訓練內容 訓練DFS。訓練解題思維。 一、題目 將整數n分成k份&#xff0c;且每份不能為空&#xff0c;任意兩份不能相同(不考慮順序)。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三種分法被認為是相同的。 {1&a…

OpenCV進階操作:圖像直方圖、直方圖均衡化

文章目錄 一、圖像直方圖二、圖像直方圖的作用三、使用matplotlib方法繪制直方圖2.使用opencv的方法繪制直方圖&#xff08;劃分16個小的子亮度區間&#xff09;3、繪制彩色圖像的直方圖 四、直方圖均衡化1、繪制原圖的直方圖2、繪制經過直方圖均衡化后的圖片的直方圖3、自適應…

Open CASCADE學習|Geom2d_BezierCurve 類

概述 Open CASCADE 提供了幾何建模的強大工具集,其中 Geom2d_BezierCurve 類用于表示二維貝塞爾曲線。貝塞爾曲線在計算機圖形學和計算機輔助設計(CAD)中具有廣泛應用,本文將詳細介紹 Geom2d_BezierCurve 類及其使用方法。 貝塞爾曲線簡介 貝塞爾曲線是一種參數曲線,廣泛…

muduo源碼解析

1.對類進行禁止拷貝 class noncopyable {public:noncopyable(const noncopyable&) delete;void operator(const noncopyable&) delete;protected:noncopyable() default;~noncopyable() default; }; 2.日志 使用枚舉定義日志等級 enum LogLevel{TRACE,DEBUG,IN…

互聯網大廠Java面試實錄:Spring Boot與微服務架構在電商場景中的應用解析

&#x1f4aa;&#x1f3fb; 1. Python基礎專欄&#xff0c;基礎知識一網打盡&#xff0c;9.9元買不了吃虧&#xff0c;買不了上當。 Python從入門到精通 &#x1f601; 2. 畢業設計專欄&#xff0c;畢業季咱們不慌忙&#xff0c;幾百款畢業設計等你選。 ?? 3. Python爬蟲專欄…

關于匯編語言與程序設計——單總線溫度采集與顯示的應用

一、實驗要求 (1)握碼管的使用方式 (2)掌握DS18B20溫度傳感器的工作原理 (3)掌握單總線通信方式實現 MCU與DS18B20數據傳輸 二、設計思路 1.整體思路 通過編寫數碼管顯示程序和單總線溫度采集程序&#xff0c;結合溫度傳感報警&#xff0c;利用手指觸碰傳感器&#xff0c;當…

用html+js+css實現的戰略小游戲

效果圖: 兄弟們&#xff0c;話不多說&#xff0c;直接上代碼 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Navicat BI 數據分析功能上線 | 數據洞察新方法

Navicat 17.2 版本一經發布&#xff0c;便以 AI 助手賦能智能交互、Snowflake 支持拓展數據連接版圖、拓展對關系型、維度以及數據倉庫 2.0 建模方法的支持等新特性與功能抓住了用戶的目光&#xff0c;但其中一項低調且實用的更新 - 在 BI 數據預覽中深度集成數據分析工具&…

【ts】defineProps數組的類型聲明

第一種&#xff1a;使用Record<string, unknown> Record<string, unknown>表示一個對象&#xff0c;鍵是string類型&#xff0c;值是未知的 import { defineProps, PropType } from vue;const props defineProps({dataList: {type: Array as PropType<Record…

OpenCv實戰筆記(4)基于opencv實現ORB特征匹配檢測

一、原理作用 ORB 原理&#xff08;Oriented FAST and Rotated BRIEF&#xff09;&#xff1a; 特征點檢測&#xff1a;使用 FAST 算法檢測角點&#xff08;關鍵點&#xff09;。 方向計算&#xff1a;為每個關鍵點分配主方向&#xff0c;增強旋轉不變性。 特征描述&#xff1a…

Unreal 從入門到精通之VR常用操作

文章目錄 前言1.如何設置VRPawn視角的位置。2.如何播放視頻3.如何播放VR全景視頻。4.如何打開和關閉VR模式。前言 我們使用Unreal5 開發VR 項目的時候,會遇到很多常見問題。 比如: 1.如何設置VRPawn視角的位置。 2.如何播放視頻。 3.如何播放VR全景視頻。 4.如何打開和關閉V…

[論文閱讀]Deep Cross Network for Ad Click Predictions

摘要 特征工程是許多預測模型成功的關鍵。然而&#xff0c;這個過程是困難的&#xff0c;甚至需要手動特征工程或窮舉搜索。DNN能夠自動學習特征交互&#xff1b;然而&#xff0c;它們隱式地生成所有的交互&#xff0c;并且不一定有效地學習所有類型的交叉特征。在本文中&…

數據庫(MySQL)基礎

一、登錄數據庫 在linux系統中登錄數據庫的指令 mysql -h 127.48.0.236 -P 3306 -u root -p -h&#xff1a;填寫IP地址&#xff0c;指明要連接的主機。如果不加該字段表示本地主機-P&#xff1a;填寫端口號&#xff0c;指明進程。 如果不加該字段會使用默認的端口號。-u&…

遠程調試---在電腦上devtools調試運行在手機上的應用

1、啟動項目–以vite項目為例:先ipconfig查看ip地址 ,然后在vite中配置host為ip地址 2、手機上查看項目:保證手機和電腦在同一局域網, 在手機瀏覽器打開我們vite啟動的項目地址, 3、使用chii進行遠程調試 (1) 安裝 npm install chii -g (2)啟動 chii start -p 8080 (3)在…

【程序員AI入門:開發】11.從零構建智能問答引擎:LangChain + RAG 實戰手冊

1、技術選型 組件推薦方案說明文本嵌入模型sentence-transformers/all-MiniLM-L6-v2輕量級且效果較好的開源模型向量數據庫FAISS高效的本地向量檢索庫大語言模型GPT-3.5/開源LLM&#xff08;如ChatGLM3&#xff09;根據資源選擇云端或本地模型文檔處理框架LangChain簡化RAG流程…

【Linux基礎】文件查找和文本處理指令

目錄 grep命令 find命令 tar命令 head命令 tail命令 wc命令 tee命令 grep命令 作用&#xff1a;在文件中搜索匹配特定模式的文本行&#xff0c;并將結果輸出到標準輸出&#xff08;通常是終端&#xff09;。 基本用法&#xff1a; grep [選項] 搜索模式 [文件名] 常用…

云軸科技ZStack入選賽迪顧問2025AI Infra平臺市場發展報告代表廠商

DeepSeek憑借低成本、高性能、開源優勢帶來的蝴蝶效應依然在持續影響企業AI應用部署。尤其在數據安全備受關注的背景下&#xff0c;私有化部署已經成為企業應用AI大模型的優選方案。賽迪顧問在近期發布的《2025中國AI Infra平臺市場發展研究報告》中認為&#xff0c;在推理算力…