@ConditionalOnProperty 和 "defaultValue":真

@ConditionalOnProperty and "defaultValue": true

我有一个带有一些 AOP 逻辑的启动器。请查看我的自动配置:

@Configuration
@EnableAspectJAutoProxy
@ConditionalOnProperty("simple-security.enabled")
public class AopAutoConfiguration {

    @Bean
    internal fun securedControllerMethodAspect() = SecuredControllerMethodAspect()
}

如您所见,我正在使用 @ConditionalOnProperty("simple-security.enabled") 注释。 现在,看看我的 additional-spring-configuration-metadata.json:

{
  "properties": [
    {
      "name": "simple-security.enabled",
      "type": "java.lang.Boolean",
      "description": "Whether to enable simple security.",
      "sourceType": "dev.d1s.security.properties.SimpleSecurityConfigurationProperties",
      "defaultValue": true
    }
  ]
}

所以,我的问题很简单:为什么 Spring 在计算条件时不考虑此 属性 的 defaultValue 值?

文件 additional-spring-configuration-metadata.json 不决定 spring 的行为方式,而是给用户提示如何使用您的自动配置。在这种情况下,提示与您实施的内容不准确。

如果您希望 Spring 在未设置 simple-security.enabled 和设置为 true 时表现相同,您可以使用 matchIfMissing 参数注释 @ConditionalOnProperty.

以上可以改写为:


@ConditionalOnProperty("simple-security.enabled", matchIfMissing = true)

或者,simple-security.enabled 的默认值可以在 class dev.d1s.security.properties.SimpleSecurityConfigurationProperties.

中设置

像这样:

/**
 * @property enabled Whether to enable simple security. Enabled by default. 
 */
@ConfigurationProperties(prefix = "simple-security")
data class SimpleSecurityConfigurationProperties(
    var enabled: Boolean = true
)

P/s:我建议您让 Spring 生成元数据,而不是手动编写。可以参考这个文档:https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html#appendix.configuration-metadata.annotation-processor