Аннотация Spring Boot @Condition, знаете ли вы условие комбинации

Spring Boot

предыдущий постВы должны знать, как использовать аннотацию @ConfigurationProperties, этого достаточно.описывает как пройти@ConfigurationPropertiesАннотации гибко считывают свойства конфигурации, в этой статье рассказывается, как гибко настраивать Spring Beans.

написать впереди

Когда мы создаем приложение Spring, иногда мы хотим загрузить bean-компонент в контекст приложения только при соблюдении определенных условий.В эпоху Spring 4.0 мы можем передать@ConditionalАннотация для достижения такого рода операции

Мы видели@ConditionalПараметр, полученный аннотацией, является универсальным классом интерфейса extends Condition, то есть мы хотим использовать@ConditionalАннотация, вам нужно только реализовать интерфейс Condition и переопределить его методы:

Обратите внимание, что метод соответствия интерфейса возвращает логический тип, который похож на нашу пользовательскую аннотацию проверки, которая используется для определения того, выполняются ли заданные условия. Также обратите внимание, что приведенные выше аннотации и интерфейсы находятся вorg.springframework.context.annotationв упаковке

Наконец-то наступила эра Spring Boot.@ConditionalОн уточняется на основе аннотаций, и нет необходимости представлять сложное рекомендательное письмо (реализуя интерфейс Условие), достаточно провести заранее определенные@ConditionalOnXxxxБилеты для аннотированных печатей, если они проверены, попадут в лобби контекста приложения.

Детали аннотации

Пара весенних ботинок@ConditionalАннотации уточняются для нас, и эти аннотации определены вorg.springframework.boot.autoconfigure.conditionпод пакетом

Открывая эти 13 аннотаций одну за другой, мы обнаруживаем, что эти аннотации имеют одинаковую мета-аннотацию:

По этим отметкам мы можем понять следующее:

  • Может применяться к TYPE, то есть все классы (@Configuration, @Component, @Service, @Repository или @Controller), которые Spring автоматически сканирует, могут быть добавлены путем добавления соответствующего@ConditionalOnXxxxопределить, следует ли загружать

  • может применяться к METHOD, поэтому методы, отмеченные @Bean, также могут применять эти аннотации

  • все использовано@ConditionalЧтобы отметить аннотациями, пользовательские условия, такие как OnBeanCondition, все еще реализуют интерфейс Condition.Нет ничего загадочного в смене супа или смене лекарства.Это просто более образная инкапсуляция.Давайте посмотрим на диаграмму зависимостей классов:

На самом деле, вы можете понять значение этих аннотаций, посмотрев на буквальное значение этих аннотаций, но нам все равно нужно объяснить конкретное использование и некоторые меры предосторожности.Я объясню сверху вниз в зависимости от частоты личного использования:

@ConditionalOnProperty

Нет сомнения, что эта аннотация является вершиной списка

Интерпретация этого условия такова: bean-компонент MyCondition будет загружен только тогда, когда mybean.enable имеет значение true в файле application.properties или application.yml.Если совпадений нет, он также будет загружен, так как matchIfMissing = true, значение по умолчанию значение ложно.

@ConditionalOnBean и ConditionalOnMissingBean

Иногда нам нужно, чтобы bean-компонент был загружен, когда он уже существует в контексте приложения, тогда мы будем использовать@ConditionalOnBeanаннотация:

Наоборот, иногда нам нужно, чтобы bean-компонент был загружен, когда он не существует в контексте приложения, тогда мы будем использовать@ConditionalOnMissingBeanаннотация

@ConditionalOnClass и @ConditionalOnMissingClass

Не подумайте, что я говорю ерунду, это то же самое, что и выше, но определить, существует ли класс в пути к классам, это не слишком много объяснит.

@ConditionalOnExpression

Если у нас есть несколько более сложных свойств конфигурации, которые нужно оценивать вместе, мы можем использовать это выражение:

MyModule загружается только тогда, когда оба свойства истинны, вот способ раскрыть предыдущую статьюВы должны знать, как использовать аннотацию @ConfigurationProperties, этого достаточно.Soul Quest 3, который:trueТо есть: если для свойства не задано значение, установите для свойства значение по умолчанию true, по сути, это@VaueСпецификация аннотаций, все SpEL могут быть применены здесь.

Написав это, у меня закончились мои обычные, и я должен стиснуть зубы и представить несколько других материалов 😄, шучу, давайте продолжим:

@ConditionalOnSingleCandidate

Эта аннотация похожа на @ConditionalOnBean, чтобы лучше проиллюстрировать использование этой аннотации (на самом деле это才疏学浅), я могу только перевести аннотацию класса

Только указанный класс уже существует в BeanFactory, и можно определить, что единственный кандидат успешно соответствует

BeanFactory существует для нескольких экземпляров bean-компонентов, но с указанным первичным кандидатом (обычно используется в классах@PrimaryПримечание), также будет успешно совпадать. По сути, автосвязывание завершится успешно, если bean-компонент соответствует определенному типу.

В настоящее время условие соответствует только определениям bean-компонентов, которые были обработаны контекстом приложения.Поэтому настоятельно рекомендуется использовать это условие только в классах автоматической настройки.Если bean-кандидат создается другой автоматической настройкой, убедитесь, что использование условия выполняется после

@ConditionalOnResource

Если компонент, который мы хотим загрузить, зависит от того, существует ли указанный ресурс в пути к классам, мы можем использовать эту аннотацию.

Видеть этот logback.xml не очень приятно, когда мы вводим сторонние классы инструментов, такие какDozerВы можете добавить похожие переключатели

Следующий действительно непопулярен.У всех есть впечатление.Если вам это нужно,то вы можете хотя бы подумать об использовании этих аннотаций для достижения гибкой настройки.

@ConditionalOnJndi

Загружать bean-компонент, только если указанный ресурс загружается через JNDI

@ConditionalOnJava

Компоненты загружаются только в том случае, если указанная версия Java запущена.

@ConditionalOnWebApplication и @ConditionalOnNotWebApplication

Этот bean-компонент будет загружаться только при запуске в веб-приложении.

Напротив, bean-компонент загружается только в не-веб-среде.

@ConditionalOnCloudPlatform

От этой аннотации у меня перехватывает дыхание. Указанный bean-компонент загружается только при работе на указанной облачной платформе.org.springframework.boot.cloudСледующий класс типа enum, можете открыть и посмотреть сами:

На этом этапе мы представили 13 аннотаций, которые нам предоставил Spring Boot, но это еще не все.Следующие непопулярные знания, которые вам нужно знать:

Условия комбинации

Сочетание условий И

Если мы хотим применить несколько условий вместе, и отношение условий равноand, нам просто нужно использовать несколько в классе@ConditionalOnXxxxВот именно (вас тоже называют непопулярным?), конечно, можно и по наследствуAllNestedConditionsКласс инкапсулирует наши многочисленные условия

Таким образом, существует комбинированное условие и, и указанный компонент загружается только в том случае, если выполняются все внутренние условия.

Сочетание условий ИЛИ

Если мы хотим, чтобы комбинированное условие былоorотношения, что нам делать? Мы можем унаследоватьAnyNestedConditionЧтобы выполнить это требование, пример кода такой же, как и выше, вы можете открыть его самостоятельно.AnyNestedConditionкласс, см. описание класса

Комбинация условий НЕТ

С и и или должно быть не (не), мы можем передать наследованиеNoneNestedConditionsВыполнив это требование, вы можете проверить его самостоятельно

пользовательская аннотация

Применение многоусловной логики реализуется через комбинирование, нам нужно применить эти условия комбинирования, а также нужно настроить аннотации, на самом деле, как было сказано в начале статьи, достаточно имитировать встроенные 13 аннотаций:

просто пройти@ConditionalВ аннотации указывается наш пользовательский класс условий, а затем он применяется там, где вы хотите его использовать.

Я все еще рекомендую всем смотреть RabbitMqRabbitAutoConfigurationКласс, все основные аннотации в этом классе используются (просто посмотрите на этот класс), каждый смотрит на структуру, чтобы лучше понять и изучить эти аннотации:

GitHub.com/spring-pro — это…

Суммировать

На этом этапе вы узнали, как гибко настраивать bean-компоненты. В сочетании с предыдущими статьями я считаю, что определение будет более гибким. Надеюсь, вы сможете открыть IDE и просмотреть эти аннотации самостоятельно, чтобы узнать больше о конкретном содержании.

вопрос души

  1. SpringBoot добавил веб-стартер, как можно изменить его на не-веб-приложение?
  2. В Java8 Stream также есть такие операции, как findAny и findAll. Все они совпадают. Использовали ли вы его?
  3. Посмотрите на следующий код. Если в пути к классам нет класса MyBean, компиляция сообщит об ошибке. В чем польза этой аннотации?
@Configuration    
@ConditionalOnClass(MyBean.class)
public class MyConfiguration{
    // omitted       
}
```## 提高效率工具

![](http://rgyb.sunluomeng.top/%E5%85%AC%E4%BC%97%E8%B4%A6%E5%8F%B7%E6%96%87%E7%AB%A0/%E6%84%9F%E6%83%B3%E4%B8%8E%E6%80%BB%E7%BB%93/_image/2019-06-18/b.png) 

--------

## 推荐阅读
+ [红黑树,超强动静图详解,简单易懂](https://mp.weixin.qq.com/s/ilND8u_8HGSTSrJiMB4X8g)
+ [双亲委派模型:大厂高频面试题,轻松搞定](https://mp.weixin.qq.com/s/Dnr1jLebvBUHnziZzSfcrA)
+ [面试还不知道BeanFactory和ApplicationContext的区别?](https://mp.weixin.qq.com/s/YBQB086ADBjHUmwrFQrWew)
+ [如何设计好的RESTful API](https://mp.weixin.qq.com/s/hR1TqkVzwZ_T8fuMnsM4hQ)
+ [程序猿为什么要看源码?](https://mp.weixin.qq.com/s/V7h8O6pVFQ-nr_iA2SNqtw)

--------
> ### 欢迎持续关注公众号:「日拱一兵」
> - 前沿 Java 技术干货分享 
> - 高效工具汇总 
> - 面试问题分析与解答 
> - 技术资料领取
**后续会推出 「多线程」以及「ElasticSearch」等连载内容**
> 以读侦探小说思维轻松趣味学习 Java 技术栈相关知识,本着将复杂问题简单化,抽象问题具体化和图形化原则逐步分解技术问题,技术持续更新,请持续关注......

![](http://rgyb.sunluomeng.top/%E5%85%AC%E4%BC%97%E8%B4%A6%E5%8F%B7%E6%96%87%E7%AB%A0/%E6%84%9F%E6%83%B3%E4%B8%8E%E6%80%BB%E7%BB%93/_image/2019-06-18/a%20%281%29.png)