条件注释在Spring Boot中是如何工作的?

2022-09-04 02:46:59

我知道Spring Boot有很多注释,如,,。但我不知道这是怎么回事?@Conditional@ConditionalOnBean@ConditionalOnClass@ConditionalOnPropertyConditionalOnWebApplication

例如:

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

我的理解是,仅当在我的类路径中可用时,才会加载。但是,如果当编译器到达行时类不在我的类路径中,它将如何编译和运行,它不会引发编译器错误吗?一旦我在日食中添加这样的代码,我就得到了编译时错误。抱歉,如果这是太基本的问题,但我不知道我错过了什么来理解。MyConfigurationMyBeanMyBean@ConditionalOnClass(MyBean.class)


答案 1

Spring Boot正在编译,其中包含许多可选的依赖项;因此,当编译 Spring Boot 时,is 在类路径上。MyBean.class

现在,您的应用程序在其类路径中可能没有该值,但它在运行时不会失败。这是因为处理注释的基础结构实际上将读取配置的字节码,并且仅在存在字节码时才加载它们。请参阅@ConditionalOnClass javadocMyBean.class@ConditionalOnClassMyBean.class

现在,自动配置是一个广泛的主题,您可以在本次演讲中了解有关此内容的更多信息


答案 2

正如Spring Boot文档所说:

@ConditionalOnClass和@ConditionalOnMissingClass注释允许根据特定类的存在与否来包含配置。由于注释元数据是使用 ASM 解析的,因此您实际上可以使用 value 属性来引用实际类,即使该类实际上可能不会出现在正在运行的应用程序类路径上。如果您希望使用 String 值指定类名,也可以使用 name 属性。

因此,他们使用字节码操作库 ASM 能够在运行时分析类名,即使类不再位于类路径上。由于Spring是开源的,你甚至可以去看注释阅读代码


推荐