gpt4 book ai didi

java - 为什么以编程方式创建的 bean 在应用程序上下文中不可用

转载 作者:行者123 更新时间:2023-11-30 07:24:23 25 4
gpt4 key购买 nike

我有一个 Spring 3.0.7 应用程序,在其中我必须用 Java 而不是 xml 初始化一些 bean。我试图找出为什么无法从应用程序上下文中检索我初始化的 bean。

当下面的代码执行时,当我调用 beanFactory.getBean("beanName") 时,我得到“org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'beanName' is Defined”。

public class BeanToCreateBeans implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
BeanObject bean = new BeanObject();
beanFactory.initializeBean(bean, "beanName");
System.out.println("bean in the application: " + beanFactory.getBean("beanName"));
}
}

为什么bean创建后无法检索?我需要能够创建 bean 并将其添加到应用程序上下文中。

更新:正如答案所述,我的代码实际上并未注册 bean,这回答了我提出的问题。因此,为了使我的代码按照我想要的方式工作,它看起来像:

public class BeanToCreateBeans implements BeanDefinitionRegistryPostProcessor, ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry bdr) throws BeansException {
BeanDefinition definition = new RootBeanDefinition(BeanObject.class);
bdr.registerBeanDefinition("beanName", definition);
AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
BeanObject bean = new BeanObject();
beanFactory.initializeBean(bean, "beanName");
System.out.println("bean in the application: " + beanFactory.getBean("beanName"));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}

最佳答案

AutowireCapableBeanFactory#initializeBean(Object, String)不会将 bean 添加到上下文或 bean 工厂。 javadoc 指出

Initialize the given raw bean, applying factory callbacks such as setBeanName and setBeanFactory, also applying all bean post processors (including ones which might wrap the given raw bean).

它基本上只是处理您传递给它的对象,就好像它是作为 ApplicationContext 的一部分初始化的 bean 一样。请注意,该方法返回一个 Object,即初始化的结果。

Returns: the bean instance to use, either the original or a wrapped one

关于java - 为什么以编程方式创建的 bean 在应用程序上下文中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37009307/

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