我有一个实现BeanDefinitionRegistryPostProcessor的类。
我正在尝试在postProcessBeanFactory或postProcessBeanDefinitionRegistry中将AnnotationSessionFactoryBean添加到我的Spring Context中。我需要以编程方式执行此操作,以便可以在运行时配置对象。
我正在尝试做:
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry bdr) throws BeansException {
RootBeanDefinition bd = new RootBeanDefinition(
AnnotationSessionFactoryBean.class);
// fails here.. can not cast
AnnotationSessionFactoryBean asfb = (AnnotationSessionFactoryBean)bd;
bdr.registerBeanDefinition("sessionFactory", asfb);
-更新了解决方案:
必须做一个:
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setBeanClass(AnnotationSessionFactoryBean.class);
bd.getPropertyValues().add("dataSource", dataSource);
bdr.registerBeanDefinition("sessionFactory", bd);
最佳答案
bean的定义不是实际的bean,因此无法进行转换。
使用GenericBeanDefinition而不是RootBeanDefinition。然后,您可以使用bean定义的propertyValues
来设置AnnotationSessionFactoryBean所需的bean。
这样,您可以在调用registerBeanDefinition()之前执行以下操作:
bd.getPropertyValues().add("dataSource", dataSource);
bd.getPropertyValues().add("annotatedClasses", listOfClasses);
etc...
请注意,如果遇到尚未定义dataSource或其他属性的问题,则可以通过执行
RuntimeBeanReference
之类的方法将bd.getPropertyValues().add("dataSource", new RuntimeBeanReference("dataSource")
用作占位符。