Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring FactoryBean method with arguments

I'm instantiating some beans by XML configuration and instance factory methods:

<bean id="galleryBeanFactory" class="de.tikron.webapp.gallery.bean.XmlGalleryBeanFactory" />

<bean id="pictureBean" factory-bean="galleryBeanFactory" factory-method="createPictureBean" scope="prototype" />

I instantiate my prototype beans programmatic by BeanFactory.getBean("bean", arguments...):

BeanFactory bf = ContextLoader.getCurrentWebApplicationContext();
PictureBean pictureBean = (PictureBean) bf.getBean("pictureBean", picture);

With Spring 3 I want to change to annotated java-based bean configuration. Here is my FactoryBean:

@Configuration
public class AnnotatedGalleryBeanFactory implements GalleryBeanFactory

  @Bean
  @Scope(BeanDefinition.SCOPE_PROTOTYPE)
  protected PictureBean createPictureBean(Picture picture) {
    PictureBean bean = new PictureBean();
    bean.setPicture(picture);
    return bean;
  }
}

My Question: How can I pass parameters here? The code above results into org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [...model.Picture] found for dependency.

like image 370
marsman Avatar asked Dec 20 '22 16:12

marsman


1 Answers

With a bean definition like

@Bean
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
protected PictureBean createPictureBean(Picture picture) {
    PictureBean bean = new PictureBean();
    bean.setPicture(picture);
    return bean;
}

the bean definition name is createPictureBean. You can invoke it every time using BeanFactory#getBean(String, Object...) like so

ApplicationContext ctx = ...; // instantiate the AnnotationConfigApplicationContext 
Picture picture = ...; // get a Picture instance
PictureBean pictureBean = (PictureBean) ctx.getBean("createPictureBean", picture);

Spring will use the arguments given (picture in this case) to invoke the @Bean method.

If you weren't providing arguments, Spring would try to autowire arguments when invoking the method but would fail because there was no Picture bean in the context.

like image 136
Sotirios Delimanolis Avatar answered Dec 22 '22 04:12

Sotirios Delimanolis