解決Spring Boot多模塊自動配置失效問題

前言

在Spring Boot多模塊項目中,模塊間配置不生效是一個復雜但可解決的問題,尤其涉及自動配置類、依賴沖突、條件注解以及IDE配置。


一、問題背景與場景

1.1 場景描述

假設存在兩個模塊:

  • 模塊A:提供通用配置(如跨域配置、全局異常處理、攔截器)。
  • 模塊B:引用模塊A,但模塊A的配置未生效(如跨域配置無效、異常處理器未捕獲異常)。

1.2 核心問題

  1. 自動配置類未被加載:模塊A的@AutoConfiguration類未在模塊B中生效。
  2. 依賴沖突:第三方庫間接引入了與模塊A沖突的依賴(如日志框架版本不一致)。
  3. 條件注解限制:配置類因@ConditionalOnClass等條件未滿足而跳過。
  4. 包掃描路徑錯誤:模塊B未掃描到模塊A的包路徑。

二、解決方案

2.1 步驟1:聲明自動配置類

2.1.1 使用META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

在模塊A的src/main/resources目錄下創建以下路徑:

src/main/resources/
└── META-INF/└── spring/└── org.springframework.boot.autoconfigure.AutoConfiguration.imports

文件內容為一行一個自動配置類的全限定名:

com.example.moduleA.config.ResourcesConfig
2.1.2 代碼示例:自動配置類
// 模塊A的ResourcesConfig.java
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET) // 僅在Servlet環境生效
public class ResourcesConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 全局性能攔截器registry.addInterceptor(new PlusWebInvokeTimeInterceptor()).addPathPatterns("/**") // 攔截所有路徑.excludePathPatterns("/actuator/**"); // 排除監控端點}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 靜態資源處理(如Swagger)registry.addResourceHandler("/docs/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");}/*** 跨域配置(通過@Bean注冊)*/@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);config.addAllowedOriginPattern("*"); // 允許所有源config.addAllowedHeader("*"); // 允許所有請求頭config.addAllowedMethod("*"); // 允許所有HTTP方法config.setMaxAge(1800L); // 預檢請求緩存時間UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}

2.2 步驟2:確保全局異常處理器生效

2.2.1 全局異常處理器代碼
// 模塊A的GlobalExceptionHandler.java
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(HttpRequestMethodNotSupportedException.class)public ResponseEntity<String> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, HttpServletRequest request) {log.error("請求地址'{}', 不支持'{}'請求", request.getRequestURI(), e.getMethod());return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).body("請求方法不支持: " + e.getMethod());}@ExceptionHandler(ServiceException.class)public ResponseEntity<ErrorResponse> handleServiceException(ServiceException e, HttpServletRequest request) {log.error("業務異常: {}", e.getMessage());return ResponseEntity.status(e.getStatusCode()).body(new ErrorResponse(e.getCode(), e.getMessage()));}@ExceptionHandler(Exception.class)public ResponseEntity<String> handleGlobalException(Exception e) {log.error("全局異常: {}", e.getMessage(), e);return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("系統內部錯誤");}private static class ErrorResponse {private final int code;private final String message;public ErrorResponse(int code, String message) {this.code = code;this.message = message;}}
}

2.3 步驟3:檢查依賴傳遞與沖突

2.3.1 排除間接依賴沖突

假設模塊B引用了mybatis-spring-boot-starter,而該依賴間接引入了spring-boot-starter-logging(導致日志框架沖突)。需在POM中排除:

<!-- 模塊B的pom.xml -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.1</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>
2.3.2 檢查依賴樹

使用Maven或Gradle命令查看依賴樹:

# Maven
mvn dependency:tree | grep -i logback# Gradle
./gradlew dependencies --configuration compileClasspath

2.4 步驟4:確保包掃描路徑正確

2.4.1 顯式指定掃描路徑

在模塊B的啟動類中設置scanBasePackages

// 模塊B的啟動類
@SpringBootApplication(scanBasePackages = {"com.example.moduleA.config","com.example.moduleA.handler","com.example.moduleB.controller"}
)
public class ModuleBApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(ModuleBApplication.class);application.setAdditionalProfiles("dev"); // 激活開發環境配置application.run(args);}
}
2.4.2 包結構優化

確保模塊A的包路徑是模塊B啟動類的子包:

com.example
├── moduleA
│   ├── config
│   │   └── ResourcesConfig.java
│   └── handler
│       └── GlobalExceptionHandler.java
└── moduleB├── controller│   └── UserController.java└── ModuleBApplication.java

2.5 步驟5:驗證條件注解

2.5.1 示例:基于屬性的條件
// 模塊A的FeatureAutoConfiguration.java
@Configuration
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
public class FeatureAutoConfiguration {@Beanpublic FeatureService featureService() {return new FeatureServiceImpl();}
}

application.yml中激活條件:

feature:enabled: true

2.6 步驟6:IDEA路徑問題排查

2.6.1 確保目錄結構正確
  • 錯誤路徑:IDEA可能將META-INF/spring顯示為META-INF.spring
  • 解決方法
    1. 刪除錯誤路徑。
    2. 右鍵src/main/resourcesNew → Directory → 輸入META-INF/spring
    3. 創建AutoConfiguration.imports文件。

三、核心知識點詳解

3.1 Spring Boot自動配置機制

3.1.1 核心組件
  1. 條件注解
    • @ConditionalOnClass:類路徑存在指定類時生效。
    • @ConditionalOnMissingBean:容器中無指定Bean時生效。
    • @ConditionalOnProperty:屬性存在且符合條件時生效。
    • @ConditionalOnWebApplication:僅在Web環境生效。
  2. 自動配置類
    • 通過@AutoConfiguration標注,配合AutoConfiguration.imports文件聲明。
  3. 加載流程
    • Spring Boot 2.x:通過spring.factories文件加載自動配置類。
    • Spring Boot 3.x:推薦使用AutoConfiguration.imports
3.1.2 新舊機制對比
特性spring.factories(舊)AutoConfiguration.imports(新)
文件路徑META-INF/spring.factoriesMETA-INF/spring/org...AutoConfiguration.imports
格式需聲明EnableAutoConfiguration直接列出類名,無需鍵值對
性能全局掃描,可能加載冗余配置按需加載,性能更優

3.2 依賴管理

3.2.1 排除依賴沖突
<!-- 模塊B的pom.xml -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>
3.2.2 引入必要依賴
<!-- 引入log4j2 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

3.3 條件注解進階用法

3.3.1 組合條件
@Configuration
@ConditionalOnClass(RedisClient.class) // 類路徑存在RedisClient
@ConditionalOnProperty(name = "redis.enabled", matchIfMissing = true) // 屬性存在或未配置時生效
public class RedisAutoConfig {// 配置邏輯
}
3.3.2 優先級控制
@AutoConfiguration(after = AnotherConfig.class)
public class MyConfig {// 該配置類將在AnotherConfig之后加載
}

3.4 多模塊包掃描

3.4.1 動態掃描策略
// 使用@Import動態導入配置類
@Import({DatabaseAutoConfiguration.class, LoggingAutoConfiguration.class})
public class ModuleBApplication {// ...
}

四、常見陷阱與解決方案

4.1 陷阱1:IDEA路徑錯誤

  • 現象META-INF/spring目錄被錯誤顯示為META-INF.spring
  • 解決
    1. 刪除錯誤路徑。
    2. 右鍵src/main/resourcesNew → Directory → 輸入META-INF/spring
    3. 重新創建AutoConfiguration.imports文件。

4.2 陷阱2:配置文件覆蓋

  • 現象:模塊B的application.yml覆蓋模塊A的配置。
  • 解決
    1. 將模塊A的配置文件放置在src/main/resources/config/目錄下。
    2. 在模塊B中指定激活配置文件:
      spring:config:activate:on-profile: moduleA
      

4.3 陷阱3:未激活Profile

  • 現象:環境特定配置未生效。
  • 解決
    # 啟動時指定Profile
    java -jar app.jar --spring.profiles.active=dev
    

4.4 陷阱4:Spring Boot 3.x兼容性問題

  • 現象spring.factories配置失效。
  • 解決
    1. 將配置遷移到新路徑:
      # 模塊A的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
      com.example.moduleA.config.ResourcesConfig
      com.example.moduleA.handler.GlobalExceptionHandler
      
    2. 參考我在網上看到的博客的說明。

五、驗證配置生效的方法

5.1 啟動日志檢查

  • 日志級別
    logging.level.root=DEBUG
    
  • 關鍵日志
    Positive matches:- ResourcesConfig (com.example.moduleA.config.ResourcesConfig)- GlobalExceptionHandler (com.example.moduleA.handler.GlobalExceptionHandler)
    

5.2 Bean注入驗證

// 模塊B的測試類
@RestController
public class HealthCheckController {@Autowiredprivate CorsFilter corsFilter;@GetMapping("/health/cors")public String health() {return "CorsFilter: " + corsFilter.getClass().getName();}
}

5.3 跨域配置測試

5.3.1 測試步驟
  1. 發送帶有Origin頭的請求:
    curl -H "Origin: https://test.com" -X GET http://localhost:8080/api/test
    
  2. 預期響應頭
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
    

5.4 異常處理器驗證

5.4.1 測試業務異常
// 模塊B的Controller
@RestController
public class TestController {@GetMapping("/test")public ResponseEntity<String> test() {throw new ServiceException("自定義異常", HttpStatus.BAD_REQUEST);}
}

預期響應

{"code": 400,"message": "自定義異常"
}

六、完整解決方案代碼示例

6.1 模塊A的POM配置

<!-- 模塊A的pom.xml -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>

6.2 模塊B的POM配置

<!-- 模塊B的pom.xml -->
<dependencies><dependency><groupId>com.example</groupId><artifactId>moduleA</artifactId><version>1.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

6.3 模塊B的啟動類

// 模塊B的啟動類
@SpringBootApplication(scanBasePackages = {"com.example.moduleA.config","com.example.moduleA.handler","com.example.moduleB.controller"}
)
public class ModuleBApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(ModuleBApplication.class);application.setAdditionalProfiles("dev"); // 激活開發環境配置application.run(args);}
}

6.4 模塊A的自動配置文件

# 模塊A的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.moduleA.config.ResourcesConfig
com.example.moduleA.handler.GlobalExceptionHandler

七、總結與最佳實踐(代碼視角)

7.1 核心總結

  1. 自動配置類必須通過AutoConfiguration.imports顯式聲明
    • 例如:在模塊A的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中列出所有自動配置類。
  2. Bean注冊需通過@Bean或實現WebMvcConfigurer
    • CorsFilter通過@Bean注冊,WebMvcConfigurer方法需在@AutoConfiguration類中實現。
  3. 包掃描路徑必須覆蓋所有模塊
    • 模塊B的啟動類需顯式掃描模塊A的包路徑。

7.2 最佳實踐代碼模板

7.2.1 模塊A的自動配置類模板
@AutoConfiguration
@ConditionalOnClass(DispatcherServlet.class) // 依賴Servlet環境
public class ResourcesConfig implements WebMvcConfigurer {// 跨域、攔截器等配置@Beanpublic GlobalExceptionHandler globalExceptionHandler() {return new GlobalExceptionHandler(); // 手動注冊異常處理器}
}
7.2.2 全局異常處理器模板
@Slf4j
@RestControllerAdvice(basePackages = {"com.example.moduleA", "com.example.moduleB"})
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleGlobalException(Exception e) {log.error("全局異常: {}", e.getMessage(), e);return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("系統內部錯誤");}
}

八、附錄:工具與命令

8.1 依賴樹分析

mvn dependency:tree

8.2 日志級別調試

java -jar app.jar --logging.level.root=DEBUG

8.3 模塊間依賴驗證

# Gradle檢查依賴沖突
./gradlew dependencies --configuration compileClasspath

九、補充


1. @AutoConfiguration注解詳解

1.1 基本概念

  • 定義
    @AutoConfiguration 是Spring Boot 3.x引入的注解,用于標記一個類為自動配置類,其作用是簡化自動配置類的聲明,無需在META-INF/spring.factories中手動注冊。
  • 作用
    1. 自動注冊到Spring容器:被@AutoConfiguration標注的類會被Spring Boot自動識別為自動配置類。
    2. 按需加載:結合條件注解(如@ConditionalOnClass),僅在滿足條件時生效。
    3. 模塊化配置:適用于多模塊項目,將配置邏輯封裝到獨立模塊中。

1.2 @AutoConfiguration與@Configuration的區別

特性@AutoConfiguration@Configuration
作用自動配置類,無需手動注冊普通配置類,需通過其他方式注冊
自動注冊自動注冊到Spring容器(需配合AutoConfiguration.imports需顯式注冊(如通過組件掃描或@Import
適用場景自動配置場景(如多模塊共享配置)通用配置類(如自定義Bean)
是否需要額外配置需在AutoConfiguration.imports文件中聲明無需額外配置(但需被Spring容器掃描)
依賴關系通常與@Conditional注解結合可獨立使用,但需手動管理Bean依賴

1.3 @AutoConfiguration的使用場景

場景1:多模塊共享配置
// 模塊A的ResourcesConfig.java
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
public class ResourcesConfig implements WebMvcConfigurer {// 跨域配置、攔截器等
}
  • 關鍵點
    • 通過@AutoConfiguration標記為自動配置類。
    • 在模塊A的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中聲明該類。
    • 模塊B引用模塊A后,無需手動導入,Spring Boot會自動加載。
場景2:替代舊版spring.factories
# Spring Boot 2.x的spring.factories(需手動注冊)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.moduleA.config.ResourcesConfig,\
com.example.moduleA.handler.GlobalExceptionHandler
  • Spring Boot 3.x的改進
    使用@AutoConfiguration + AutoConfiguration.imports文件,無需維護冗長的spring.factories

2. @Bean注解詳解

2.1 基本概念

  • 定義
    @Bean 是Spring框架的核心注解,用于將方法返回的對象注冊為Spring容器管理的Bean
  • 作用
    1. 顯式聲明Bean:開發者通過方法定義Bean的創建邏輯。
    2. 依賴注入:方法參數支持依賴注入(如@Autowired)。
    3. 靈活控制:可指定Bean作用域、初始化方法、條件等。
    4. 作用域控制:通過@Scope指定Bean的作用域(如singleton、prototype)。

2.2 @Bean的使用場景

場景1:定義基礎Bean
@Configuration
public class DataSourceConfig {@Bean@ConditionalOnMissingBean(DataSource.class) // 僅當容器中沒有DataSource時生效public DataSource dataSource() {HikariDataSource ds = new HikariDataSource();ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");return ds;}
}
  • 關鍵點
    • 通過@BeandataSource()方法返回的HikariDataSource注冊為Bean。
    • 結合@ConditionalOnMissingBean避免與用戶自定義Bean沖突。
場景2:注冊第三方庫Bean
@Configuration
public class JsonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));return mapper;}
}
  • 關鍵點
    • 將第三方庫的ObjectMapper注冊為Spring Bean,方便全局使用。
場景3:作用域控制
@Bean
@Scope("prototype") // 每次請求創建新實例
public MyPrototypeBean prototypeBean() {return new MyPrototypeBean();
}

3. @Configuration與@Bean的協作關系

3.1 基礎配置類結構

@Configuration // 標記為配置類
public class MyAutoConfiguration {@Bean // 定義Beanpublic MyService myService() {return new MyServiceImpl();}
}
  • 關鍵點
    • @Configuration是配置類的“身份標識”。
    • @Bean是配置類中定義Bean的“工具”。

4. 為什么必須使用@AutoConfiguration?能否用@Configuration替代?

4.1 必須使用@AutoConfiguration的情況
  • 場景:在多模塊項目中,模塊A的配置需被模塊B自動加載
  • 原因
    1. @AutoConfiguration配合AutoConfiguration.imports文件,無需手動注冊
    2. 如果僅用@Configuration,需通過以下方式顯式加載:
      • 在模塊B的啟動類中指定掃描路徑。
      • 通過@Import(ResourcesConfig.class)導入。
      • spring.factories中注冊(Spring Boot 2.x方式)。
  • 結論:在Spring Boot 3.x中,@AutoConfiguration是更簡潔的解決方案。
4.2 @Configuration的替代方案
// 方案1:在模塊B啟動類中顯式掃描模塊A的包
@SpringBootApplication(scanBasePackages = {"com.example.moduleA", "com.example.moduleB"})
public class ModuleBApplication { ... }// 方案2:使用@Import導入配置類
@Configuration
@Import(ResourcesConfig.class)
public class ModuleBConfig { ... }
  • 缺點
    • 需手動維護包路徑或導入關系,耦合性更高
    • 不具備條件化加載能力(除非手動添加@Conditional注解)。

5. 示例代碼中的關鍵注解解析

5.1 ResourcesConfig示例
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
public class ResourcesConfig implements WebMvcConfigurer {@Beanpublic CorsFilter corsFilter() { ... }@Overridepublic void addInterceptors(InterceptorRegistry registry) { ... }
}
  • 關鍵點
    1. @AutoConfiguration:聲明為自動配置類。
    2. @ConditionalOnWebApplication:僅在Servlet環境生效。
    3. @Bean:將CorsFilter注冊為Bean。
    4. 實現WebMvcConfigurer:通過繼承接口直接擴展Spring MVC配置。
5.2 全局異常處理器示例
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleGlobalException(Exception e) { ... }
}
  • 關鍵點
    • @RestControllerAdvice:標記為全局異常處理類。
    • 無需@Bean,因為Spring通過組件掃描自動識別。

6. 常見問題與解答

Q1:為什么我的自動配置類未被加載?
  • 可能原因
    1. 未在AutoConfiguration.imports文件中聲明類。
    2. 依賴未正確引入(如模塊B未依賴模塊A)。
    3. 條件注解未滿足(如@ConditionalOnClass的類不存在)。
  • 解決方案
    • 檢查AutoConfiguration.imports文件路徑是否正確。
    • 確保模塊B的POM中包含模塊A的依賴。
    • 在啟動日志中搜索Positive matches,確認條件是否滿足。
Q2:@Bean和@Component的區別?
注解作用范圍使用場景
@Bean方法級在配置類中定義Bean的創建邏輯
@Component類級通過組件掃描自動注冊Bean
Q3:為什么自動配置類需要實現WebMvcConfigurer?
  • 原因
    Spring MVC的擴展機制允許通過實現WebMvcConfigurer接口或使用@Bean注冊WebMvcConfigurer來添加攔截器、跨域配置等。
  • 示例
    @Override
    public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor());
    }
    

7. 完整自動配置類代碼示例

// 模塊A的ResourcesConfig.java
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
public class ResourcesConfig implements WebMvcConfigurer {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedOriginPattern("*");config.addAllowedMethod("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}@Beanpublic MyInterceptor myInterceptor() {return new MyInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor()).addPathPatterns("/**");}@Bean@ConditionalOnMissingBeanpublic MyService myService() {return new MyServiceImpl();}
}

8. 關鍵配置文件說明

8.1 AutoConfiguration.imports文件
# 模塊A的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.moduleA.config.ResourcesConfig
  • 作用
    告知Spring Boot哪些類是自動配置類,無需手動注冊到spring.factories
8.2 spring.factories(Spring Boot 2.x兼容)
# 模塊A的META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.moduleA.config.ResourcesConfig,\
com.example.moduleA.handler.GlobalExceptionHandler
  • 兼容性說明
    Spring Boot 3.x支持同時使用兩種方式,但推薦使用@AutoConfiguration

9. 總結:注解選擇決策樹

是否自動配置
是:AutoConfig
聲明配置
否:手動配置
注冊方式
方式1:@Import
方式2:@ComponentScan
定義Bean
@Bean注解
需在配置類中定義
其他場景
組件注解
組件掃描加載

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

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

相關文章

WEBSTORM前端 —— 第2章:CSS —— 第4節:盒子模型

目錄 1.畫盒子 2.Pxcook軟件 3.盒子模型——組成 4.盒子模型 ——邊框線 5.盒子模型——內外邊距 6.盒子模型——尺寸計算 7.清除默認樣式 8.盒子模型——元素溢出 9.外邊距問題 ①合并現象 ②塌陷問題 10.行內元素——內外邊距問題 11.盒子模型——圓角 12.盒子…

Kafka和flume整合

需求1&#xff1a;利用flume監控某目錄中新生成的文件&#xff0c;將監控到的變更數據發送給kafka&#xff0c;kafka將收到的數據打印到控制臺&#xff1a; 在flume/conf下添加.conf文件&#xff0c; vi flume-kafka.conf # 定義 Agent 組件 a1.sourcesr1 a1.sinksk1 a1.c…

Idea 如何配合 grep console過濾并分析文件

這里寫自定義目錄標題 [grep console插件]()右擊打開文件目錄&#xff0c;選擇 tail in console 同時可以添加自己的快捷鍵。 ![新的改變](https://i-blog.csdnimg.cn/direct/03423e27cf6c40c5abd2d53982547b61.png) 隨后會在idea的菜單欄中出現tail菜單。這里&#xff0c;接下…

怎樣學習Electron

學習 Electron 是一個很好的選擇&#xff0c;特別是如果你想構建跨平臺的桌面應用程序&#xff0c;并且已經有前端開發經驗。以下是一個循序漸進的學習指南&#xff0c;幫助你從零開始掌握 Electron。 1. 基礎知識 HTML/CSS/JavaScript 確保你對這些基礎技術有扎實的理解&am…

MySQL 大數據量分頁查詢優化指南

問題分析 當對包含50萬條記錄的edu_test表進行分頁查詢時&#xff0c;發現隨著分頁越深入&#xff0c;查詢時間越長&#xff1a; limit 0,10&#xff1a;0.05秒limit 200000,10&#xff1a;0.14秒limit 499000,10&#xff1a;0.21秒 通過EXPLAIN分析發現&#xff0c;limit o…

【仿真】Ubuntu 22.04 安裝MuJoCo 3.3.2

官方GIthub下載: https://github.com/google-deepmind/mujoco/releases 官網&#xff1a;MuJoCo — Advanced Physics Simulation 文檔&#xff1a;Overview - MuJoCo Documentation 主要參考&#xff1a;Ubuntu 22.04 安裝Mujoco 3.22 - RobotStudent的文章 - 知乎 簡…

最新字節跳動運維云原生面經分享

繼續分享最新的go面經。 今天分享的是組織內部的朋友在字節的go運維工程師崗位的云原生方向的面經&#xff0c;涉及Prometheus、Kubernetes、CI/CD、網絡代理、MySQL主從、Redis哨兵、系統調優及基礎命令行工具等知識點&#xff0c;問題我都整理在下面了 面經詳解 Prometheus …

PyQt6實例_pyqtgraph散點圖顯示工具_代碼分享

目錄 描述&#xff1a; 效果&#xff1a; 代碼&#xff1a; 返回結果對象 字符型橫坐標 通用散點圖工具 工具主界面 使用舉例 描述&#xff1a; 1 本例結合實際應用場景描述散點圖的使用。在財報分析中&#xff0c;需要將數值放在同行業中進行比較&#xff0c;從而判…

純C協程框架NtyCo

原文是由寫的&#xff0c;寫的真的很好&#xff0c;原文鏈接&#xff1a;純c協程框架NtyCo實現與原理-CSDN博客 1.為什么會有協程&#xff0c;協程解決了什么問題&#xff1f; 網絡IO優化 在CS&#xff0c;BS的開發模式下&#xff0c;服務器的吞吐量是一個受關注的參數&#x…

信息系統項目管理師——第10章 項目進度管理 筆記

10項目進度管理 1.規劃進度管理&#xff1a;項目章程、項目管理計劃&#xff08;開發方法、范圍管理計劃&#xff09;、事業環境因素、組織過程資產——專家判斷、數據分析&#xff08;備選方案分析&#xff09;、會議——進度管理計劃 2.定義活動&#xff1a;WBS進一步分解&am…

通過門店銷售明細表用SQL得到每月每個門店的銷冠和按月的同比環比數據

假設我在Snowflake里有銷售表&#xff0c;包含ID主鍵、門店ID、日期、銷售員姓名和銷售額&#xff0c;需要統計出每個月所有門店和各門店銷售額最高的人&#xff0c;不一定是一個人&#xff0c;以及他所在的門店ID和月總銷售額。 統計每個月份下&#xff0c;各門店內銷售額最高…

移遠通信LG69T賦能零跑B10:高精度定位護航,共赴汽車智聯未來

當前&#xff0c;汽車行業正以前所未有的速度邁向智能化時代&#xff0c;組合輔助駕駛技術已然成為車廠突出重圍的關鍵所在。高精度定位技術作為實現車輛精準感知與高效協同的基石&#xff0c;其重要性日益凸顯。 作為全球領先的物聯網及車聯網整體解決方案供應商&#xff0c;移…

jmeter-Beashell獲取http請求體json

在JMeter中&#xff0c;使用BeanShell處理器或BeanShell Sampler來獲取HTTP請求體中的JSON數據是很常見的需求。這通常用于在測試計劃中處理和修改請求體&#xff0c;或者在響應后進行驗證。以下是一些步驟和示例代碼&#xff0c;幫助你使用BeanShell來獲取HTTP請求體中的JSON數…

若干查找算法

一、順序查找 1.原理 2.代碼 #if 0 const int FindBySeq(const vector<int>& ListSeq, const int KeyData) {int retrIdx -1;int size ListSeq.size();for(int i 0; i < size; i) {if (ListSeq.at(i) KeyData){retrIdx i;break;}}return retrIdx; } #else c…

Uniapp(vue):生命周期

目錄 一、Vue生命周期二、Uniapp中頁面的生命周期三、執行順序比較一、Vue生命周期 setup():是在beforeCreate和created之前運行的,所以可以用setup代替這兩個鉤子函數。onBeforeMount():已經完成了模板的編譯,但是組件還未掛載到DOM上的函數。onMounted():組件掛載到DOM完…

Prometheus監控

1、docker - prometheusgrafana監控與集成到spring boot 服務_grafana spring boot-CSDN博客 2、【IT運維】普羅米修斯基本介紹及監控平臺部署&#xff08;PrometheusGrafana&#xff09;-CSDN博客 3、Prometheus監控SpringBoot-CSDN博客 4、springboot集成普羅米修斯-CSDN博客…

C#進階學習(十四)反射的概念以及關鍵類Type

目錄 本文末尾有相關類中的總結&#xff0c;如有需要直接跳到最后即可 前置知識&#xff1a; 1、程序集&#xff08;Assembly&#xff09; 2、元數據&#xff08;Metadata&#xff09; 3、中間語言&#xff08;IL, Intermediate Language&#xff09; 中間語言&#xff08;…

Kotlin中的also、apply、invoke用法詳解

以下是 Kotlin 中作用域函數(let、run、with、also、apply)和 invoke 操作符的完整總結,結合代碼示例和對比說明,幫助您理解它們的用法和區別。 一、作用域函數:簡化對象操作 作用域函數用于在對象的上下文中執行代碼塊,并根據函數的不同返回對象本身或 lambda 的結果。…

Ubuntu實現遠程文件傳輸

目錄 安裝 FileZillaUbuntu 配套設置實現文件傳輸 在Ubuntu系統中&#xff0c;實現遠程文件傳輸的方法有多種&#xff0c;常見的包括使用SSH&#xff08;Secure Shell&#xff09;的SCP&#xff08;Secure Copy Protocol&#xff09;命令、SFTP&#xff08;SSH File Transfer P…

TEC制冷片詳解(STM32)

目錄 一、介紹 二、傳感器原理 1.原理圖 2.引腳描述 三、程序設計 main文件 jdq.h文件 jdq.c文件 四、實驗效果 五、資料獲取 項目分享 一、介紹 半導體制冷片&#xff08;又稱熱電模塊&#xff09;&#xff0c;是利用半導體材料的珀耳帖效應制造的一種新型制冷元件…