Программно добавить AnnotationSessionFactoryBean - PullRequest
0 голосов
/ 28 декабря 2010

У меня есть класс, который реализует BeanDefinitionRegistryPostProcessor.

Я пытаюсь добавить AnnotationSessionFactoryBean в мой Spring-контекст в postProcessBeanFactory или postProcessBeanDefinitionRegistry. Мне нужно сделать это программно, чтобы я мог настроить объект во время выполнения.

Я пытаюсь сделать:

@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 Ответ

1 голос
/ 28 декабря 2010

Определение бина не фактического бина, поэтому вы не можете разыгрывать.

Используйте GenericBeanDefinition вместо RootBeanDefinition.Затем вы можете использовать propertyValues определения компонента для установки необходимых компонентов для AnnotationSessionFactoryBean.

Таким образом, вы можете сделать что-то вроде следующего перед вызовом registerBeanDefinition ():

bd.getPropertyValues().add("dataSource", dataSource);
bd.getPropertyValues().add("annotatedClasses", listOfClasses);
etc...

Обратите внимание, что если вы столкнетесь с проблемами, когда dataSource или другие свойства еще не определены, вы можете вместо этого использовать RuntimeBeanReference в качестве заполнителя, выполнив что-то вроде bd.getPropertyValues().add("dataSource", new RuntimeBeanReference("dataSource").

...