Конфигурация Consul при загрузке Spring с условным свойством

Как я могу написать класс конфигурации consul для условного свойства, которое я сделал и протестировал со свойствами,

Но вы хотите написать класс конфигурации, и эта конфигурация должна быть загружена при условии.


person Ravat Tailor    schedule 02.07.2018    source источник


Ответы (1)


Если я правильно понял ваш вопрос, вы хотите создать класс конфигурации, но загрузить эту конфигурацию, только если выполняется какое-то условие:

@Configuration
public class MyConfiguration {
      @Bean 
      public ??? myBean() {
         ....
      }
}

В этом случае вы должны использовать аннотацию @Conditional, которая впервые появилась в Spring 4.

Есть много @Conditional-подобных аннотаций, вы должны просто посмотреть ту, которая вам нужна.

  • @ConditionalOnClass
  • @ConditionalOnProperty
  • @ConditionalOnMissingProperty
  • @ConditionalOnWebApplication
  • @ConditionalOnBean
  • @ConditionalOnMissingBean
  • @ConditionalOnClass
  • .... (наверное есть и другие)

Если этого недостаточно, вы можете даже свернуть свою собственную условную логику. Поскольку это не было задано напрямую в вопросе, я просто предоставлю ссылку (одну из многих) статьи, которые показывают, как это сделать.

Итак, вы можете пойти, например:

@Configuration
@ConditionalOnProperty(value="my.consul.integration.enabled", havingValue = "true")
public class MyConfiguration {
      @Bean 
      public ??? myBean() {
         ....
      }
} 

Вы также можете поместить условную логику на уровне детализации одного компонента.

Здесь требование запуска конфигурации консула только в том случае, если включено определенное свойство (tools.consul.enabled=true из ваших комментариев)

Идея состоит в том, чтобы определить набор свойств, связанных с консулом, не в файле application.yml по умолчанию, а где-то еще, например, в файле consul-integration.properties, и прочитать этот файл с конфигурацией, которая включается только при соблюдении @ConditionOnProperty.

Пример:

@Configuration
@ConditionalOnProperty(value="tools.consul.enabled", havingValue=true) 
@PropertySources({
 @PropertySource("classpath:consul-integration.properties) 
})
public class ToolConsulSampleConfiguration {

}
person Mark Bramnik    schedule 02.07.2018
comment
Это полезно, я знаю об условном свойстве весенней загрузки, я хочу специально для spring-cloud-consul, как я могу создать класс конфигурации для этого - person Ravat Tailor; 02.07.2018
comment
О, теперь я вижу. Почему бы вам просто не использовать стартер консула, который в любом случае доступен: cloud.spring.io /spring-cloud-consul Если вам нужно условие, просто взгляните на его исходный код, в его конфигурациях уже есть множество условных выражений. Поэтому вы можете настроить свой проект для их использования. И если вы хотите переопределить любой из его bean-компонентов, вы можете сделать это с помощью своего собственного класса конфигурации. - person Mark Bramnik; 02.07.2018
comment
мои опасения, что в bootstrap.yml у меня есть все необходимые свойства, но они будут загружаться, когда приложение будет запущено, но я хочу загрузить их, когда у меня будет свое собственное свойство, например tools.consul.enabled=true, затем все свойства должны загружаться, иначе нет, есть ли способ сделать это - person Ravat Tailor; 02.07.2018
comment
Привет, я обновил ответ, чтобы рассмотреть ваш вариант использования - person Mark Bramnik; 03.07.2018