Injecting a prototype bean into a singleton bean
Injection happens only once, when the Spring context is started. If bean has prototype
scope, Spring will create new prototype bean for every injection. But prototype bean will not be created every time you call its methods. Lets consider next example:
<bean id="firstRequestProcessor" class="com.injection.testing.RequestProcessor">
<property name="validator" ref="validator" />
</bean>
<bean id="secondRequestProcessor" class="com.injection.testing.RequestProcessor">
<property name="validator" ref="validator" />
</bean>
<bean id="validator" class="com.injection.testing.RequestValidator" scope="prototype" />
In this case both of RequestProcessor
beans will have its own instance of RequestValidator
bean.
Lookup method is the method, you should call every time when you need new instance of prototype bean. It's better to make this method abstract
, because anyway Spring will override this method automatically. For example:
public class abstract RequestProcessor {
public void handleRequest(String requestId){
System.out.println("Request ID : "+ requestId);
RequestValidator validator = createValidator(); //here Spring will create new instance of prototype bean
validator.validate(requestId);
}
protected abstract RequestValidator createValidator();
}
Note, that createValidator
returns instance of RequestValidator
and has not any parameters. Also you don't need private class variable validator
. In this case bean's configuration will looks like:
<bean id="requestProcessor" class="com.injection.testing.RequestProcessor" >
<lookup-method name="createValidator" bean="validator" />
</bean>
<bean id="validator" class="com.injection.testing.RequestValidator" scope="prototype" />
Now every time you call createValidator
method, Spring will create new instance of validator
bean.
You can find more details in documentation.