08SpringBoot高級--自動化配置

目錄

Spring Boot Starter 依賴管理解釋

一、核心概念

二、工作原理

依賴傳遞:

自動配置:

版本管理:

三、核心流程

四、常用 Starter 示例

五、自定義 Starter 步驟

創建配置類:

配置屬性:

注冊自動配置:在?META-INF/spring.factories?中添加:

打包發布:創建 Maven 項目并發布到倉庫,其他項目可直接引用。

六、優勢與注意事項

優勢:

注意事項:

@Configuration?注解的底層原理與工作機制

一、核心概念

二、核心特性

1. 聲明 Bean 定義

2. 支持 Bean 依賴注入

3. 實現 Bean 作用域

三、底層工作機制

1. 配置類的 CGLIB 增強

2. Bean 方法的攔截處理

3. 與?@Component?注解的區別

四、關鍵注解組合

1.?@Import?導入其他配置類

2.?@PropertySource?加載外部配置

3.?@Profile?實現環境配置

五、最佳實踐

1. 配置類設計原則

2. Bean 命名策略

3. 生命周期管理

六、注意事項

1. 代理限制

2. 循環依賴問題

3. 性能考慮

@EnableAutoConfiguration?自動配置注解底層原理解釋

核心作用

核心機制

自動配置類發現

條件化配置(Conditional)

關鍵流程簡化

與其他注解的配合

簡單示例

核心優勢

Spring Boot 自動化配置原理:按條件開啟自動配置類和配置項?

一、自動化配置的核心機制:條件注解與自動發現

1.?自動配置類的加載入口

2.?條件注解:自動配置的 “開關”

二、按條件開啟自動配置的具體流程

1.?主配置類的條件判斷

2.?配置項的條件化開啟

三、用戶如何干預自動配置?

四、自動化配置的優先級與加載順序

自動配置類的加載順序

用戶配置 vs 自動配置

五、總結:條件化配置的核心價值


Spring Boot Starter 依賴管理解釋

一、核心概念

Starter 是 Spring Boot 提供的一種依賴管理方式,通過一個依賴就能引入某個功能所需的所有組件,避免手動配置大量依賴的麻煩。


二、工作原理

  1. 依賴傳遞
    • 例如引入?spring-boot-starter-web?會自動包含:
      • Spring MVC
      • Tomcat 服務器
      • JSON 處理庫
      • 其他必要組件
  2. 自動配置
    • 每個 Starter 都關聯一個或多個自動配置類
    • 自動配置類根據條件(如類是否存在)自動創建 Bean
    • 例如?WebMvcAutoConfiguration?會自動配置 Spring MVC
  3. 版本管理
    • Spring Boot 通過?spring-boot-dependencies?統一管理所有依賴版本
    • 開發者無需指定版本號,避免版本沖突

三、核心流程


四、常用 Starter 示例

Starter 名稱功能描述
spring-boot-starter-web創建 Web 應用(REST、MVC)
spring-boot-starter-data-jpaJPA 數據庫訪問
spring-boot-starter-security安全認證與授權
spring-boot-starter-test測試工具集(JUnit、Mockito 等)
spring-boot-starter-validationBean 驗證(JSR-303)

五、自定義 Starter 步驟

  1. 創建配置類
    @Configuration
    public class MyAutoConfiguration {@Beanpublic MyService myService() {return new MyServiceImpl();}
    }
    
  2. 配置屬性
    @ConfigurationProperties(prefix = "my.service")
    public class MyProperties {private String name = "default";// getter/setter
    }
    
  3. 注冊自動配置
    在?META-INF/spring.factories?中添加:
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.example.MyAutoConfiguration
    
  4. 打包發布:
    創建 Maven 項目并發布到倉庫,其他項目可直接引用。

六、優勢與注意事項

  • 優勢
    • 快速搭建項目
    • 減少配置錯誤
    • 統一依賴版本
    • 易于擴展
  • 注意事項
    • 依賴沖突時使用?mvn dependency:tree?分析
    • 自動配置不生效時檢查條件注解
    • 自定義 Starter 需遵循命名規范(*-spring-boot-starter

通過 Starter 機制,Spring Boot 實現了 "約定大于配置" 的理念,讓開發者可以更專注于業務邏輯,而不是框架配置。


@Configuration?注解的底層原理與工作機制

一、核心概念

@Configuration?是 Spring 框架中用于定義配置類的注解,它允許將 Spring Bean 的定義以 Java 代碼的形式組織,替代傳統的 XML 配置文件。

配置類本質上是一個被 Spring 容器管理的 Bean,其中使用?@Bean?注解的方法會被容器攔截并用于創建和管理 Bean 實例。


二、核心特性

1. 聲明 Bean 定義
@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {return new DriverManagerDataSource("jdbc:mysql://localhost:3306/mydb", "user", "pass");}
}
  • @Configuration?標記的類會被 Spring 容器識別為配置類
  • @Bean?注解的方法返回的對象會被注冊為 Spring Bean
2. 支持 Bean 依賴注入
@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserServiceImpl(userRepository()); // 依賴注入}@Beanpublic UserRepository userRepository() {return new JdbcUserRepository(dataSource()); // 依賴注入}@Beanpublic DataSource dataSource() {return new DriverManagerDataSource();}
}
3. 實現 Bean 作用域
@Configuration
public class AppConfig {@Bean@Scope("prototype") // 原型作用域,每次請求創建新實例public RequestHandler requestHandler() {return new RequestHandler();}
}

三、底層工作機制

1. 配置類的 CGLIB 增強

Spring 會通過 CGLIB 動態代理技術為?@Configuration?類創建子類:

  • 攔截?@Bean?方法的調用,確保 Bean 的單例性
  • 實現方法間的依賴調用(如?userService()?調用?userRepository()
// 偽代碼展示 CGLIB 增強效果
public class AppConfig$$EnhancerBySpringCGLIB extends AppConfig {private final Map<String, Object> singletons = new ConcurrentHashMap<>();@Overridepublic UserRepository userRepository() {if (!singletons.containsKey("userRepository")) {singletons.put("userRepository", super.userRepository());}return (UserRepository) singletons.get("userRepository");}
}
2. Bean 方法的攔截處理
  • 當?@Bean?方法被調用時,CGLIB 代理會檢查該 Bean 是否已創建
  • 如果已創建,則返回緩存的實例(確保單例性)
  • 如果未創建,則調用原始方法創建新實例
3. 與?@Component?注解的區別
特性@Configuration@Component
CGLIB 增強
Bean 方法攔截支持(確保單例調用)不支持(每次調用創建新實例)
推薦使用場景定義應用配置和 Bean 關系普通組件(如 Service、Repository)

四、關鍵注解組合

1.?@Import?導入其他配置類
@Configuration
@Import({DataSourceConfig.class, SecurityConfig.class})
public class AppConfig {// 合并多個配置類
}
2.?@PropertySource?加載外部配置
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {@Value("${db.url}")private String dbUrl;@Beanpublic DataSource dataSource() {return new DriverManagerDataSource(dbUrl, "user", "pass");}
}
3.?@Profile?實現環境配置
@Configuration
@Profile("dev")
public class DevConfig {@Beanpublic DataSource dataSource() {return new DriverManagerDataSource("jdbc:mysql://devdb:3306/mydb", "dev", "devpass");}
}

五、最佳實踐

1. 配置類設計原則
  • 按功能模塊化組織配置類(如?DataSourceConfigWebConfig
  • 避免配置類過于龐大,保持單一職責
  • 使用?@Import?或?@ComponentScan?組合多個配置類
2. Bean 命名策略
@Bean("customDataSource") // 顯式指定 Bean 名稱
public DataSource dataSource() {return new DriverManagerDataSource();
}
3. 生命周期管理
@Configuration
public class AppConfig {@Bean(initMethod = "init", destroyMethod = "cleanup")public ConnectionFactory connectionFactory() {return new JmsConnectionFactory();}
}

六、注意事項

1. 代理限制
  • @Configuration?類必須是可被繼承的(不能是 final 類)
  • @Bean?方法必須是可重寫的(不能是 private 或 final)
2. 循環依賴問題
  • 避免配置類之間的循環依賴
  • 使用構造器注入時需特別注意
3. 性能考慮
  • CGLIB 代理會帶來一定性能開銷,但通常可忽略不計
  • 對于性能敏感場景,可考慮使用?@Component?替代

通過?@Configuration?注解,Spring 實現了基于 Java 的配置方式,結合 CGLIB 代理技術確保了 Bean 管理的高效性和靈活性,使開發者能夠以更優雅的方式組織應用配置。


@EnableAutoConfiguration?自動配置注解底層原理解釋

核心作用

@EnableAutoConfiguration?是 Spring Boot 實現自動化配置的核心注解,作用是根據項目依賴自動激活對應的配置類,避免手動編寫大量配置。

核心機制

  1. 自動配置類發現
    • 啟動時掃描?META-INF/spring.factories?文件,讀取?EnableAutoConfiguration?對應的配置類列表。
    • 例如,引入?spring-boot-starter-web?時,會自動加載?WebMvcAutoConfiguration?等與 Web 相關的配置類。
  2. 條件化配置(Conditional)
    • 配置類通過?@Conditional?系列注解(如?@ConditionalOnClass@ConditionalOnMissingBean)判斷是否生效。
    • 例:若類路徑存在?Tomcat?相關類且無自定義?ServletContainerFactory,才激活 Web 容器配置。

關鍵流程簡化

  1. 注解觸發@EnableAutoConfiguration?觸發?AutoConfigurationImportSelector?類加載自動配置類。
  2. 過濾篩選:根據條件注解排除不符合當前環境的配置類。
  3. 注入容器:將符合條件的配置類注冊到 Spring 容器,完成 Bean 自動配置。

與其他注解的配合

  • 常與?@SpringBootApplication(組合了?@EnableAutoConfiguration@ComponentScan@Configuration)一起使用。
  • 通過?@AutoConfigureAfter?/?@AutoConfigureBefore?控制配置類加載順序。

簡單示例

引入?spring-boot-starter-data-jpa?后,@EnableAutoConfiguration?會自動配置:

  • JPA 實體管理器(EntityManagerFactory
  • 數據庫連接池(如 HikariCP)
  • 事務管理器(PlatformTransactionManager

核心優勢

  • 零配置啟動依賴即配置,減少手動編寫 XML 或 Java 配置類的工作量。
  • 可擴展性:通過?@Conditional?自定義條件,或通過?spring.factories?擴展自動配置邏輯。

Spring Boot 自動化配置原理:按條件開啟自動配置類和配置項?

一、自動化配置的核心機制:條件注解與自動發現

Spring Boot 自動化配置的本質是通過?條件注解?和?自動配置類發現機制,實現 “按需加載” 配置,避免資源浪費。其核心流程如下:

1.?自動配置類的加載入口
  • spring.factories?配置文件
    Spring Boot 啟動時,會掃描類路徑下的?META-INF/spring.factories?文件,從中讀取?org.springframework.boot.autoconfigure.EnableAutoConfiguration?對應的配置類列表(如?WebMvcAutoConfigurationDataSourceAutoConfiguration?等)。

    • 例如,spring-boot-autoconfigure?模塊的?spring.factories?中定義了大量自動配置類:
      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
      # 其他配置類...
      
  • @EnableAutoConfiguration?注解觸發
    Spring Boot 啟動類上的?@EnableAutoConfiguration?會通過?SpringFactoriesLoader?加載上述配置類,將其納入 Spring 容器管理。

2.?條件注解:自動配置的 “開關”

自動配置類或配置項是否生效,由?@Conditional?及其派生注解決定。這些注解會根據運行時條件(如類是否存在、Bean 是否存在、屬性是否配置等)判斷是否加載配置。常見條件注解包括:

注解生效條件示例場景
@ConditionalOnClass類路徑中存在指定類當存在?javax.servlet.Servlet?時,加載 Web 相關配置
@ConditionalOnMissingClass類路徑中不存在指定類避免與非標準類沖突時使用
@ConditionalOnBean容器中存在指定類型的 Bean當存在自定義?DataSource?時,跳過數據源自動配置
@ConditionalOnMissingBean容器中不存在指定類型的 Bean當無自定義?WebMvcConfigurer?時,加載默認 MVC 配置
@ConditionalOnProperty配置文件中存在指定屬性且值符合條件當?spring.datasource.enabled=true?時,加載數據源配置
@ConditionalOnResource類路徑中存在指定資源文件當存在?application.yml?時加載特定配置
@ConditionalOnWebApplication當前為 Web 應用(Servlet 或 Reactive)僅在 Web 項目中加載 MVC 配置

二、按條件開啟自動配置的具體流程

以?WebMvcAutoConfiguration(MVC 自動配置類)為例,看條件注解如何控制其生效:

1.?主配置類的條件判斷
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {// 配置內容...
}
  • @ConditionalOnWebApplication:確保項目是 Servlet 類型的 Web 應用(非 Reactive)。
  • @ConditionalOnClass:檢查類路徑中存在?ServletDispatcherServlet?等 Web 相關類。
  • @ConditionalOnMissingBean:當容器中沒有用戶自定義的?WebMvcConfigurationSupport?時,才生效(若用戶自定義了 MVC 配置,自動配置會被覆蓋)。
2.?配置項的條件化開啟

自動配置類內部的具體 Bean 定義也會通過條件注解控制,例如:

@Bean
@ConditionalOnMissingBean
public InternalResourceViewResolver defaultViewResolver() {// 默認視圖解析器配置...
}
  • @ConditionalOnMissingBean?表示當容器中沒有自定的?InternalResourceViewResolver?時,才創建默認視圖解析器。

三、用戶如何干預自動配置?

  1. 通過配置文件禁用自動配置
    在?application.properties?中使用?spring.autoconfigure.exclude?屬性排除特定自動配置類:

    # 禁用 WebMvc 自動配置
    spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
    
  2. 通過條件注解自定義配置
    用戶可在自定義配置類中使用條件注解,覆蓋自動配置的邏輯:

    @Configuration
    @ConditionalOnProperty(name = "myapp.use-custom-mvc", havingValue = "true")
    public class CustomMvcConfiguration {// 自定義 MVC 配置,會覆蓋自動配置
    }
    
  3. 通過?@Conditional?擴展條件邏輯
    自定義條件類(實現?Condition?接口),實現更復雜的條件判斷:

    public class MyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {// 自定義條件邏輯(如檢查環境變量、系統屬性等)return context.getEnvironment().getProperty("myapp.enabled").equals("true");}
    }// 使用自定義條件
    @Configuration
    @Conditional(MyCondition.class)
    public class MySpecialConfiguration {
    }
    

四、自動化配置的優先級與加載順序

  1. 自動配置類的加載順序
    • 通過?@AutoConfigureOrder?或?@Order?注解控制加載順序,數值越小優先級越高。
    • 例如,WebMvcAutoConfiguration?會在?DispatcherServletAutoConfiguration?之后加載,確保 Servlet 容器已初始化
  2. 用戶配置 vs 自動配置
    • 用戶自定義的 Bean 或配置類(如添加?@Component?或?@Configuration?的類)會優先于自動配置,體現 “約定優于配置,但配置可覆蓋約定” 的原則。

五、總結:條件化配置的核心價值

Spring Boot 的自動化配置通過條件注解實現了 “智能加載”:

  • 避免資源浪費:僅在需要時加載配置(如非 Web 項目不會加載 MVC 配置)。
  • 靈活擴展性:用戶可通過簡單配置或注解覆蓋自動配置,無需修改框架源碼。
  • 降低使用門檻:開發者無需手動配置大量 Bean,框架自動處理依賴關系,聚焦業務邏輯。

理解條件注解的工作原理,有助于在開發中精準控制配置的生效條件,解決自動配置與自定義配置的沖突問題。

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

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

相關文章

基于cornerstone3D的dicom影像瀏覽器 第二十四章 顯示方位、坐標系、vr輪廓線

系列文章目錄 文章目錄 系列文章目錄前言一、工具欄修改二、切片窗口顯示方位文字1. 修改mprvr.js&#xff0c;添加函數getOrientationMarkers2. 修改DisplayerArea3D.vue 三、vr窗口顯示坐標系1. 修改mprvr.js 添加OrientationMarkerTool2. view3d.vue中響應工具欄事件3. 修改…

【C/C++】線程局部存儲:原理與應用詳解

文章目錄 1 基礎概念1.1 定義1.2 初始化規則1.3 全局TLS vs 局部靜態TLS 2 內存布局2.1 實現機制2.2 典型內存結構2.3 性能特點 3 使用場景/用途3.1 場景3.2 用途 4 注意事項5 對比其他技術6 示例代碼7 建議7.1 調試7.2 優化 8 學習資料9 總結 在 C 多線程編程中&#xff0c;線…

【圖像大模型】IP-Adapter:圖像提示適配器的技術解析與實踐指南

IP-Adapter&#xff1a;圖像提示適配器的技術解析與實踐指南 一、項目背景與技術價值1.1 圖像生成中的個性化控制需求1.2 IP-Adapter的核心貢獻 二、技術原理深度解析2.1 整體架構設計2.2 圖像特征編碼器2.3 訓練策略 三、項目部署與實戰指南3.1 環境配置3.2 模型下載3.3 基礎生…

MySQL-5.7 修改密碼和連接訪問權限

一、MySQL-5.7 修改密碼和連接權限設置 修改密碼語法 注意&#xff1a;rootlocalhost 和 root192.168.56.% 是兩個不同的用戶。在修改密碼時&#xff0c;兩個用戶的密碼是各自分別保存&#xff0c;如果兩個用戶密碼設置不一樣則登陸時注意登陸密碼 GRANT ALL PRIVILEGES ON …

Linux基本指令篇 —— touch指令

touch是Linux和Unix系統中一個非常基礎但實用的命令&#xff0c;主要用于操作文件的時間戳和創建空文件。下面我將詳細介紹這個命令的用法和功能。 目錄 一、基本功能 1. 創建空文件 2. 同時創建多個文件 3. 創建帶有空格的文件名&#xff08;需要使用引號&#xff09; 二、…

mysql explain使用

文章目錄 type 訪問類型性能高到低多注意type: index 出現的場景 key 實際使用的索引Extra 額外信息其他字段 通過 EXPLAIN 你可以知道&#xff1a;如是否使用索引、掃描多少行、是否需要排序或臨時表 EXPLAIN 三板斧&#xff08;type、key、Extra&#xff09; 例子&#xff1…

JMeter-SSE響應數據自動化

結構圖 背景&#xff1a; 需要寫一個JMeter腳本來進行自動化測試&#xff0c;主要是通過接口調用一些東西&#xff0c;同時要對響應的數據進行處理&#xff0c;包括不限于錯誤信息的輸出。 1.SSE(摘錄) SSE&#xff08;Server-Sent Events&#xff09;是一種基于HTTP協議、允許…

<<運算符重載 和 c_str() 的區別和聯系

例題 文章開始之前我們看下以下代碼&#xff0c;你能精準的說出正確的輸出結果并知道其原理嗎&#xff1f; void test() {string s1("hello world");cout << s1 << endl;//cout << s1.c_str() << endl;//const char* p1 "xxxx"…

python web flask專題-Flask入門指南:從安裝到核心功能詳解

Flask入門指南&#xff1a;從安裝到核心功能詳解 Flask作為Python最流行的輕量級Web框架之一&#xff0c;以其簡潔靈活的特性廣受開發者喜愛。本文將帶你從零開始學習Flask&#xff0c;涵蓋安裝配置、項目結構、應用實例、路由系統以及請求響應處理等核心知識點。 1. Flask安…

一種C# 的SM4 的 加解密的實現,一般用于醫療或者支付

一種C# 的SM4 的 加解密的實現 一般用于醫療或者支付 加密 string cipherText SM4Helper.Encrypt_test(data, key); public static string Encrypt_test(string plainText, string key) { byte[] keyBytes Encoding.ASCII.GetBytes(key); byte[] input…

“軒轅杯“云盾礪劍CTF挑戰賽 Web wp

文章目錄 ezflaskezjsezrceezssrf1.0簽到ezsql1.0ez_web1非預期預期解 ezflask ssti, 過濾了一些關鍵詞, 繞一下就行 name{{url_for["__globals__"]["__builtins__"]["eval"]("__tropmi__"[::-1])(os)["po""pen"…

Matlab快速上手五十六:詳解符號運算里假設的用法,通過假設可以設置符號變量的取值范圍,也可以通過假設設置變量屬于集合:整數、正數和實數等

1.符號變量中假設的概念 在符號數學工具箱中&#xff0c;符號變量默認范圍是全體復數&#xff0c;也就是說&#xff0c;符號運算是在全體復數域進行的&#xff0c;若需要運算中&#xff0c;不使用全體復數域&#xff0c;可以為變量設定取值范圍&#xff0c;這就用到了假設&…

【python實用小腳本-79】[HR轉型]Excel難民到數據工程師|用Python實現CSV秒轉JSON(附HRIS系統對接方案)

場景故事&#xff1a;從手動復制粘貼到自動化數據流轉 "Kelly&#xff0c;我們需要把3000名員工的考勤數據導入新HR系統&#xff0c;今天能完成嗎&#xff1f;"去年這個時候&#xff0c;作為HRIS項目負責人的我&#xff0c;面對這個需求時第一反應是打開Excel開始手…

數據透視:水安 B 證如何影響水利企業的生存指數?

某大數據公司提取了 3000 家水利企業的經營數據&#xff0c;一組關聯分析令人震驚&#xff1a;B 證配備率與企業利潤率的相關系數達 0.67—— 這意味著持證率每提升 10%&#xff0c;企業利潤率平均提高 4.2 個百分點。當我們用數據解剖這本紅本本&#xff0c;會發現它像一根無形…

從零搭建上門做飯平臺:高并發訂單系統設計

你知道為什么聰明人都在搶著做上門做飯平臺嗎&#xff1f;因為這可能是餐飲行業最后一片藍海&#xff01;傳統餐飲還在為房租人工發愁時&#xff0c;上門私廚已經輕裝上陣殺出重圍。不需要門店租金&#xff0c;不用養服務員&#xff0c;廚師直接上門服務&#xff0c;成本直降60…

openpi π? 項目部署運行邏輯(四)——機器人主控程序 main.py — aloha_real

π? 機器人主控腳本都在 examples 中&#xff1a; 可以看到包含了多種類機器人適配 此筆記首先記錄了 aloha_real 部分 aloha_real 中&#xff0c;main.py 是 openpi ALOHA 平臺上“主控執行入口”&#xff0c;負責&#xff1a; 建立與推理服務器&#xff08;serve_policy.…

利用 Python 爬蟲獲取唯品會 VIP 商品詳情:實戰指南

在當今電商競爭激烈的環境中&#xff0c;VIP 商品往往是商家的核心競爭力所在。這些商品不僅代表著品牌的高端形象&#xff0c;更是吸引高價值客戶的關鍵。因此&#xff0c;獲取 VIP 商品的詳細信息對于市場分析、競品研究以及優化自身產品策略至關重要。Python 作為一種強大的…

鴻蒙桌面快捷方式開發

桌面快捷方式開發實戰 [參考文檔] (https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-desktop-shortcuts) 在module.json5配置文件中的abilities標簽下的metadata中設置resource屬性值為$profile:shortcuts_config&#xff0c;指定應用的快捷方式配置文件&…

3分鐘學會跨瀏覽器富文本編輯器開發:精準光標定位+內容插入(附完整代碼)

一、痛點直擊&#xff1a;傳統編輯器的三大坑 作為前端開發&#xff0c;你是否遇到過以下靈魂拷問&#xff1f; ? 為什么Firefox光標能精準定位&#xff0c;IE卻永遠跳轉到開頭&#xff1f;? 圖片上傳后如何保證插入位置不偏移&#xff1f;? 跨瀏覽器兼容測試時&#xff0…

RK3562 Linux-5.10 內核HUSB311 Type-C 控制器芯片調試記錄

硬件原理&#xff1a; 1. type C 接口&#xff1a; 1.1 HUSB311芯片&#xff0c; CC1和CC2 邏輯接到HUSB311 上面&#xff0c; 接I2C0組和USBCC_INT_L USBCC_INT_L 接到GPIO0_A6 做為CC的邏輯中斷 1.2 TYPEC_DP/TYPEC_DM 接到ARM 端的USB3.0 OTG上面 1.2 TYPEC_RX1P/TYPEC…