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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With