【问题标题】:Why is programmatically created bean not available in the application context为什么以编程方式创建的 bean 在应用程序上下文中不可用
【发布时间】:2016-05-03 16:19:19
【问题描述】:

我有一个 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;
    }
}

【问题讨论】:

  • 您能补充一下您是如何创建该 bean 的吗?
  • 正如您在代码中看到的那样——创建一个 POJO,然后在 beanFactory 中对其进行初始化。
  • 那不是注册bean

标签: java spring


【解决方案1】:

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

初始化给定的原始bean,应用工厂回调,例如 setBeanName 和 setBeanFactory,也应用所有 bean 后处理器 (包括可能包装给定生豆的那些)。

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

返回: 要使用的 bean 实例,无论是原始的还是包装好的

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 2018-02-21
    • 1970-01-01
    • 2011-07-14
    • 2017-09-05
    • 1970-01-01
    • 2011-12-11
    • 2011-03-23
    相关资源
    最近更新 更多