tags:

views:

214

answers:

1

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?

+4  A: 

Hello,

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!

Espen
you can customize pretty much everything in spring, so I guess it is possible somehow, but it will probably involve some very deep digging (using a custom applicationcontext) or something like that. but I'm guessing here
seanizer
I agree and have updated my answer.
Espen