AnnotationSessionFactoryBean

AnnotationSessionFactoryBean

我有一个实现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")用作占位符。

09-27 14:24