Как работает условная Аннотация В Spring Boot?

Я понимаю, что Spring Boot имеет много @Conditional аннотации вроде @ConditionalOnBean, @ConditionalOnClass, @ConditionalOnProperty, ConditionalOnWebApplication. Но я не знаю, как это работает?

Например:

@Configuration    
@ConditionalOnClass(MyBean.class)
public class MyConfiguration{
    // omitted       
}

то, что я понял,MyConfiguration будет загружен только если MyBean доступно в моем пути к классам. Но как он будет компилироваться и работать, если MyBean класс не находится в моем пути к классу, поскольку компилятор достигает @ConditionalOnClass(MyBean.class) line, не будет ли это ошибка компилятора? Как только я добавлю такой код в свой eclipse, Я получаю ошибку времени компиляции. Извините, если это слишком простой вопрос, но я не знаю, что мне не хватает, чтобы понять.

3 ответов


Spring Boot компилируется с большим количеством дополнительных зависимостей; поэтому, когда Spring Boot компилируется,MyBean.class на пути к классу.

теперь ваше приложение может не иметь, что MyBean.class в пути к классам, но он не терпит неудачу во время выполнения. Это потому, что инфраструктура, которая обрабатывает @ConditionalOnClass аннотации фактически прочитают байт-код конфигурации и будут загружать их только в том случае, если это MyBean.class присутствует. См.@ConditionalOnClass javadoc.

теперь авто-конфигурация-это широкая тема, и вы можете узнать подробнее об этом в этом разговоре.


Как Документация По Весенней Загрузке говорит:

аннотации @ConditionalOnClass и @ConditionalOnMissingClass позволяет включать конфигурацию на основе наличия или отсутствия конкретных классов. Из-за того, что метаданные аннотаций анализ с помощью ASM вы можете использовать атрибут value для ссылки на реальный класс, даже если этот класс может фактически не отображаться на работающем classpath приложения. Вы также можете использовать атрибут name если вы предпочитаете указать имя класса, используя строковое значение.

поэтому они используют библиотеку манипуляции байт-кодом ASM уметь разбирать имена классов во время выполнения, даже если классы уже не в classpath. Поскольку весна является открытым исходным кодом, вы даже можете просто посмотреть на аннотация читать код.


вы обычно используете Optional зависимости:

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <optional>true</optional>
</dependency>