3

I have some programmatically created beans that I am initializing via AutowireCapableBeanFactory.autowireBean() as shown below:

spring.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:annotation-config/>

    <bean id="MyService" class="...">
        <property name="someProp" value="primitiveValue"/>
    </bean>

    <bean id="MyBean" class="...">
        <property name="someString" value="primitiveValue"/>
    </bean>
</beans>

MyBean.java

public class MyBean implements InitializingBean {

    @Autowired MyService myService;

    private String someString;
    public void setSomeString (String someString) {
        this.someString = someString;
    }
    public void afterPropertiesSet () {}
}

Caller:

MyBean bean = new MyBean(arg1, arg2, arg3);
autowireCapableBeanFactory.autowireBean(bean);

This correctly autowires bean.myService as expected. However it does not populate primitive properties like bean.someString.

Looking at the docs and this answer, I though something like this would work:

MyBean bean = new MyBean(arg1, arg2, arg3);
autowireCapableBeanFactory.autowireBean(bean);
autowireCapableBeanFactory.initializeBean(bean, "name");

But alas, someString is still null. I have found lots of references stating what will not work to initialize class properties, but nothing showing what will work.

Any ideas?

thedarklord47
  • 3,183
  • 3
  • 26
  • 55

1 Answers1

2

Found I could use AutowireCapableBeanFactory.applyBeanPropertyValues() to accomplish what I wanted. Code to inject both @Autowired beans and primitive properties looks like this:

@Autowired AutowireCapableBeanFactory beanFactory;

...

MyBean bean = new MyBean();
beanFactory.autowireBean(bean);
beanFactory.applyBeanPropertyValues(bean, bean.getClass().getSimpleName());
thedarklord47
  • 3,183
  • 3
  • 26
  • 55