gpt4 book ai didi

java - 如果 @Configuration 类包含不可解析的类引用,Spring 如何调用 @Bean 方法

转载 作者:行者123 更新时间:2023-11-29 04:12:06 24 4
gpt4 key购买 nike

Spring 可以使用 ClassReader 解析 @Configuration

假设我们有以下场景

我们有一个带有多个 @Bean 定义的自动配置类

其中一个 @Bean 已通过所有条件,而第二个 @Bean 已通过 @ConditionalOnClass 且该类不在类路径中

@Configuration
class CustomConfiguration {
@Bean
@ConditionalOnClass(String.class)
String knownClass() {
return "Hello";
}

@Bean
@ConditionalOnClass(MissingClass.class)
MissingClass secondBean() {
return new MissingClass();
}
}

在这种情况下,我有几个问题

  1. Spring Boot AutoConfiguration 是否将第一个 bean 注册到 ApplicationContext 中?
  2. 如果 (1) 为真,我在第一个 @Bean 方法中的断点是否会在调试期间命中
  3. 如果 (2) 为真,*AutoConfiguration 类如何加载到 JVM 中,因为此类将引用其他类(来自第二个 @Bean),这些类在类加载时无法解析
  4. 如果 (2) 为假,spring 是否会在运行时仅使用第一个 @Bean 方法生成一个类并调用该方法?

谢谢

最佳答案

一般来说,出于这个原因,您应该避免在 @Bean 方法上使用 @ConditionalOnClassreference documentation 中涵盖了这种情况。建议使用单独的 @Configuration 类来隔离 @ConditionalOnClass 条件。

回答您的具体问题:

  1. 是的,只要能加载配置类就注册第一个bean
  2. 是的,第一个@Bean 方法中的断点应该在调试期间命中
  3. 这取决于如何引用无法解析的类。如果它仅在 @Bean 方法体内使用,则该类应该会成功加载。如果在 @Bean 方法(通常是返回类型)的签名中使用无法解析的类,则该类将无法加载。
  4. 不适用

如上面链接的文档中所述,不用担心 3 中描述的场景以及什么会起作用,什么不会起作用,而是使用一个单独的、可能嵌套的 @Configuration 类和一个类级条件是推荐的方法。对于您的具体示例,它看起来像这样:

@Configuration
class CustomConfiguration {

@Bean
@ConditionalOnClass(String.class)
String knownClass() {
return "Hello";
}

@Configuration
@ConditionalOnClass(MissingClass.class)
static class DoubtfulBeanConfiguration {

@Bean
MissingClass missingClass() {
return new MissingClass();
}

}

}

关于java - 如果 @Configuration 类包含不可解析的类引用,Spring 如何调用 @Bean 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54536340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com