Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring FactoryBean and scopes working together

Tags:

java

spring

I'd like to use FactoryBeans and scopes together. Specifically, I'd like the object created and returned by a FactoryBean to be placed into a specified (perhaps custom) scope. The issue is that doing the following:

<bean class="x.y.z.TestFactoryBean" scope="test" />

Results in the FactoryBean itself being scoped, and has somewhat unpredictable behaviour on the object created by the factory. I understand why this is; the factory itself is a first-class spring-managed bean, and has its own lifecycle. However, I can't find a way to specify that the object returned from the factory should itself be scoped.

On the other hand, this does exactly what I want (as long as TestFactoryBean does NOT implement the FactoryBean interface):

<bean class="x.y.z.TestFactoryBean" name="testFactory">
<bean class="x.y.z.TestBean" factory-bean="testFactory" 
      factory-method="getObject" scope="test" />

So the real question is, how can I make Spring behave like it does for the 2nd example above, but using real FactoryBeans?

like image 596
TTar Avatar asked May 13 '10 21:05

TTar


People also ask

In which scenario we will use singleton and prototype scope?

As a rule of thumb, you should use the prototype scope for all beans that are stateful, while the singleton scope should be used for stateless beans.

Why Spring bean scope is singleton by default?

In most cases these beans are stateless, hence there is no concurrency issue here. Singleton scope in spring means single instance in a Spring context .. Spring container merely returns the same instance again and again for subsequent calls to get the bean.


1 Answers

You can't easily use a custom scope on a bean returned from a FactoryBean.

From Spring's Java documentation:

FactoryBeans can support singletons and prototypes

If you want the FactoryBean's returned bean to have the prototype scope, then you must implement the isSingleton() method like this:

public class TestFactoryBean implements FactoryBean<TestBean> {

  // the rest of the required methods are removed for simplicity reasons..

  public boolean isSingleton() {
        return false;
    }
}

To support a custom scope, you have to implement the logic yourself and it will not be very intuitive, since the FactoryBean only provides the isSingleton() method. I will rather recommend using another solution than FactoryBean for beans with custom scope.

Hope this helps!

like image 63
Espen Avatar answered Oct 11 '22 17:10

Espen