gpt4 book ai didi

java - 使用JavaConfig时Spring bean定义类名为null

转载 作者:行者123 更新时间:2023-11-30 03:10:40 26 4
gpt4 key购买 nike

我正在实现BeanFactoryPostProcessor并且我正在尝试提取bean定义类名:

@Component
public class MyFactory implements BeanFactoryPostProcessor{

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
for (String name : beanDefinitionNames) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);

// 'null' when using JavaConfig, 'java.lang.String' when using XML
System.out.println(beanDefinition.getBeanClassName());
}

}

}

当我通过 XML 配置我的 beans 时,我可以毫无问题地获取类名:

<bean id="arbitraryString" class="java.lang.String"/>

<bean class="com.test.MyFactory"/>

但是,当我使用 JavaConfig 并在那里定义一个 bean(一个用于演示目的的简单字符串)时,类名将为 null:

@Bean 
public String arbitraryString () {
return "the bean definition class name will be null";
}

我尝试搜索此内容,但无法理解我是否做错了什么或者这是预期的行为。除了加载上下文(无论是 XML 还是配置类)之外,我在 main 方法中没有执行任何其他操作。

最佳答案

我研究了一下,我想我知道问题可能是什么(不确定我是否正确,或者我的解释是否正确)。然而,这似乎是问题所在:

在 JavaConfig 类中定义 beans 会导致 spring 初始化该类。然而,我认为这里的顺序很重要:

它将获取您的配置类,检索所有 @Bean 注释的方法,然后创建这些对象。

现在我相信您所指的“root bean”是一个实现类,以防您实例化该类。这看起来很自然,但是 spring XML 和 spring javaconfig 之间有一个界限。

在 XML 中:

所有 bean 都被定义为类。它们是通过调用该类的构造函数来实例化的。

在 JavaConfig 中:

该 bean 不再是一个独立的 bean。它被视为工厂 bean。所以bean实际上并没有根bean类,它有一个工厂bean和一个工厂方法。如何从方法定义中设置根类?您可以将根 bean 设置为类,但这在大多数类中并不适用。工厂可以返回返回类的任何实现,因此在创建 BeanDefinition 对象时,没有可用的根 bean。

这可以通过将你的 appconfig 标记为静态(工厂方法)来观察。现在,没有工厂 bean,因为在扫描配置类时,它还没有被创建。这意味着,spring 将使用 CGI 创建一个实现,即根 bean。然而,这并不是您所期望的 root bean。例如,在我的测试中:

com.*.*.AppConfig$$EnhancerBySpringCGLIB$$1d5cc574

这是我在创建静态 bean 时得到的输出。

总共:

JavaConfig 的作用就像一个工厂,因此在定义形成时不知道创建的 bean。

Xml 定义良好,显式设置实现类,因此给出了根 bean。

需要生成静态bean,因为工厂不存在,但类仍然需要创建。

我希望有帮助:)

-- 阿图尔

编辑:最后一点,这是预期的行为:)

关于java - 使用JavaConfig时Spring bean定义类名为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33697722/

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