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

时间:2016-05-03 16:19:19

标签: java spring

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

当下面的代码执行时,我得到" org.springframework.beans.factory.NoSuchBeanDefinitionException:没有bean命名为' beanName'已定义"当我调用beanFactory.getBean(" beanName")。

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;
    }
}

1 个答案:

答案 0 :(得分:1)

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

  

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

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

  

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