Как программно создать бобовое определение с введенными свойствами?

Я хочу программно добавить бобовое определение контексту приложения, но некоторые свойства того определения являются другими бобами от того контекста (я знаю их имена). Как я могу сделать это так, чтобы те свойства были введены?

Например:

GenericBeanDefinition beanDef = new GenericBeanDefinition();
beanDef.setBeanClass(beanClass);

MutablePropertyValues values = new MutablePropertyValues();
values.addPropertyValue("intProperty", 10);
values.addPropertyValue("stringProperty", "Hello, world");
values.addPropertyValue("beanProperty", /* What should be here? */);

beanDef.setPropertyValues(values);

Я использую Spring 3.0.

20
задан fastcodejava 28 June 2012 в 20:26
поделиться

4 ответа

Используйте RuntimeBeanReference :

values.addPropertyValue("beanProperty", new RuntimeBeanReference("beanName")); 
21
ответ дан 30 November 2019 в 00:04
поделиться

Вы можете:

  • использовать проект javaconfig.
  • используя BeanDefinitionParser - но это немного некрасиво писать.
0
ответ дан 30 November 2019 в 00:04
поделиться

Я нашел решение. Я должен использовать другое BeanDefinition в качестве свойства, например:

GenericBeanDefinition bd2 = new GenericBeanDefinition();
bd2.setBeanClass(Dependency.class);

GenericBeanDefinition bd1 = new GenericBeanDefinition();
bd1.setBeanClass(Component.class);

MutablePropertyValues values = new MutablePropertyValues();
values.addPropertyValue("dependency", bd2);

bd1.setPropertyValues(values);
2
ответ дан 30 November 2019 в 00:04
поделиться

Я бы добавил такой боб, который имеет доступ к applicationContext:

public class AppContextExtendingBean implements ApplicationContextAware{


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{

        AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();

        // do it like this
        version1(beanFactory);

        // or like this
        version2(beanFactory);

    }

    // let spring create a new bean and then manipulate it (works only for singleton beans, obviously) 
    private void version1(AutowireCapableBeanFactory beanFactory){
        MyObject newBean = (MyObject) beanFactory.createBean(MyObject.class,AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
        newBean.setBar("baz");
        newBean.setFoo("foo");
        newBean.setPhleem("phleem");
        beanFactory.initializeBean(newBean, "bean1");
    }

    // create the object manually and then inject it into the spring context
    private void version2(AutowireCapableBeanFactory beanFactory){
        MyObject myObject=new MyObject("foo","phleem");
        myObject.setBar("baz");
        beanFactory.autowireBean(myObject);
        beanFactory.initializeBean(myObject, "bean2");
    }


}
14
ответ дан 30 November 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: