以编程方式添加AnnotationSessionFactoryBean

时间:2010-12-28 01:09:11

标签: java spring runtime

我有一个实现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);

1 个答案:

答案 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")作为占位符。