使用@ConditionalOnProperty遇到的錯誤


前提

在配置多數據源時報錯,錯誤如下所示:

Description: The dependencies of some of the beans in the application context form a cycle

提示程序上下文中某些Bean的依賴性形成一個循環,猜測可能是使用@ConditionalOnProperty注解有條件的注冊Bean時出現的問題。

@conditionalonproperty 僅在存在環境屬性中具有特定值的情況下才啟用 bean 注冊。


配置文件:

spring:
  datasource:
    local:
      jdbc-url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true@characterEncoding=utf-8
      username: root
      password: 123
      driver-class-name: com.mysql.cj.jdbc.Driver
    remote:
      jdbc-url: jdbc:mysql://192.168.1.200:3306/test?serverTimezone=UTC&useUnicode=true@characterEncoding=utf-8
      username: root
      password: 123
      driver-class-name: com.mysql.cj.jdbc.Driver

注入數據源:

@Configuration
@ConditionalOnClass(DataSource.class)			// 必須存在的類
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)		// 允許在自動配置類之間進行排序,只會影響其Bean的定義順序
@PropertySource("classpath:application.yml")	
public class DataSourceConfig {

    @Bean
    @ConditionalOnProperty(prefix = "spring.datasource", name = "remote")	// 根據配置的屬性值有條件地創建bean
    @ConditionalOnMissingBean							// 如果BeanFactory中沒有包含DataSource類型的Bean,則進行條件匹配
    public DataSource remoteDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConditionalOnProperty(prefix = "spring.datasource", name = "local")
    @ConditionalOnMissingBean(name = "localDataSource")
    public DataSource localDataSource() {
        return DataSourceBuilder.create().build();
    }
}

方法

查詢官網后發現@ConditionalOnProperty注解屬性配置錯誤。

  • value別名。

  • prefix屬性的前綴。 如果未指定,前綴會自動以.(圓點符號)結尾。 一個有效的前綴由一個或多個用點分隔的單詞定義(例如: acme.system.feature)。

  • name要測試的屬性的名稱。 如果已定義前綴,則將其用於計算每個屬性的完整鍵。 例如,如果前綴為 app.config,而一個值為 my-value,則全鍵為 app.config.my-value。使用-(短橫線連接符)分隔單詞,例如:my-long-property

  • havingValue屬性期望值的字符串表示形式。如果屬性根本不包含在 Environment 中,則會查詢 matchIfMissing ()屬性。 缺省情況下,缺少的屬性不匹配。此條件無法可靠地匹配集合屬性。

  • matchIfMissing如果未設置屬性,條件是否應匹配。 默認為false。


將注解改為以下形式:

@ConditionalOnProperty(prefix = "spring.datasource.remote", name = "jdbc-url")	// name隨意測試一個屬性即可,即username、password等
// 或者
@ConditionalOnProperty(prefix = "spring.datasource", name = "remote", matchIfMissing = true)

參考

https://www.baeldung.com/spring-conditionalonproperty
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM