我有一个实现BeanDefinitionRegistryPostProcessor的类。
我正在尝试在postProcessBeanFactory或postProcessBeanDefinitionRegistry中向我的Spring Context添加AnnotationSessionFactoryBean。我需要以编程方式执行此操作,以便我可以在运行时配置对象。
我正在尝试:
@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);
答案 0 :(得分:1)
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")
作为占位符。