我有一个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;
}
}
答案 0 :(得分:1)
AutowireCapableBeanFactory#initializeBean(Object, String)
不会将bean添加到上下文或bean工厂。 javadoc陈述
初始化给定的原始bean,应用工厂回调,例如 setBeanName和setBeanFactory,也适用于所有bean后处理器 (包括可能包装给定原始bean的那些)。
它基本上只处理传递给它的对象,就像它是作为ApplicationContext
的一部分初始化的bean一样。请注意,该方法返回Object
,即初始化的结果。
<强>返回:强> 要使用的bean实例,无论是原始实例还是包装实例