java - 条件注释在 Spring Boot 中如何工作?

标签 java spring spring-boot

我知道 Spring Boot 有很多 @Conditional 注释,例如 @ConditionalOnBean@ConditionalOnClass@ConditionalOnPropertyConditionalOnWebApplication。但我不知道这是如何工作的?

例如:

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

我的理解是,只有当 MyBean 在我的类路径中可用时,才会加载 MyConfiguration。但是,当编译器到达 @ConditionalOnClass(MyBean.class) 行时,如果 MyBean 类不在我的类路径中,它将如何编译和运行,它不会抛出编译器错误吗?一旦我在我的 eclipse 中添加这样的代码,我就会收到编译时错误。对不起,如果这是一个太基本的问题,但我不知道我缺少什么来理解。

最佳答案

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

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

现在自动配置是一个广泛的学科,你可以学习more about this in this talk .

关于java - 条件注释在 Spring Boot 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46224199/

相关文章:

java - 使用mockito和spring mock的authowired bean的Mock方法

java - 分别分析字符串的每个单词

java - JUnit 5 : Inject spring components to Extension (BeforeAllCallback/AfterAllCallback)

spring-boot - Spring启动登录mysql数据库

java - 如何使用一致的数据针对 Oracle UCM 执行集成测试?

java - 无法在线程的构造函数中初始化 PrintWriter 字段

java - 缓存驱逐在没有 key 的情况下不起作用,并且方法没有参数?

java - bean 的 Spring session 范围究竟是如何工作的? Web 上下文中 bean 的默认范围是什么?

java - 错误 : AnnotationException: mappedBy reference an unknown target entity property

spring-boot - 在 Spring Boot 集成测试中使用 TestContainers 填充数据库