如何在Spring中使用@ConfigurationProperties和@Conditional

问题描述 投票:0回答:1

我喜欢

@ConfigurationProperites
强大的打字和重构能力。我想要条件 bean,但不想使用
@ConditionalOnProperty
,因为它需要原始属性名称。

我尝试过这个方法

@Conditional(SecurityEnabledCondition.class)
@Bean ...


public class SecurityEnabledCondition implements Condition {

  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    ClientProperties clientProperties = context.getBeanFactory().getBean(ClientProperties.class);
    return clientProperties.isSecured();
  }
}

但是找不到 Bean,因为

Condition
并不是设计来与 Bean 交互的。如何在Spring中将@ConfigurationProperties与@Conditional一起使用?

java spring spring-boot configuration configurationproperties
1个回答
0
投票

Condition
实现不应与 bean 交互。这在该类的 javadoc 中有明确说明。

条件必须遵循与

BeanFactoryPostProcessor
相同的限制,并注意不要与 bean 实例交互。

这是因为他们在流程的早期就在

BeanFactory
上进行操作,当时还没有任何豆子。如果您现在开始与 Bean 进行交互,将会导致 Bean 过早初始化等等。因此你不应该这样做。

您应该使用

@ConditionalOnProperty
并指定要检查的属性,或者您必须检查自定义
SecurityEnabledCondition
内的属性。但不要试图从上下文中获取 Bean。

© www.soinside.com 2019 - 2024. All rights reserved.