2010-05-13 14 views
8

FactoryBeans ve kapsamları birlikte kullanmak isterim. Özellikle, bir FactoryBean tarafından oluşturulan ve belirtilen (belki de özel) bir kapsam içine yerleştirilmek üzere döndürülen nesneyi istiyorum. sorun aşağıdaki neden duruyor: kendisi kapsamlı olan FactoryBean içindeSpring FactoryBean ve birlikte çalışma kapsamları

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

Sonuçları ve fabrikanın yarattığı nesne üzerinde biraz öngörülemeyen davranışları vardır. Bunun neden olduğunu anlıyorum; Fabrika kendisi birinci sınıf bir bahar yönetimli fasulye ve kendi yaşam döngüsüne sahiptir. Bununla birlikte, fabrikadan döndürülen nesnenin kendisinin kapsamının belirlenmesi gerektiğini belirtmenin bir yolunu bulamıyorum. Ben öyle gibi İlkbahar davranmasını nasıl yapabiliriz,

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

Yani asıl soru şu: Diğer taraftan

, bu şimdiye (sürece TestFactoryBean FactoryBean arabirimini uygulamak DEĞİLDİR gibi) istediğiniz tam olarak ne yapar Yukarıdaki ikinci örnek için, ancak gerçek FactoryBeans kullanarak?

cevap

6

FactoryBean'dan dönen bir fasulye üzerinde özel bir kapsamı kolayca kullanamazsınız. Spring'in Java documentation itibaren

: Eğer FactoryBean 'ler o zaman böyle isSingleton() yöntemi uygulamalıdır, prototip bir kapsama sahip olmaları fasulye döndü istiyorsanız

FactoryBeans singletons ve prototipler

destekleyebilir :

public class TestFactoryBean implements FactoryBean<TestBean> { 

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

    public boolean isSingleton() { 
     return false; 
    } 
} 

Özel kapsamı desteklemek için mantığı kendiniz uygulamak ve FactoryBean yalnızca isSingleton() yöntemini sağladığından çok sezgisel olmayacaktır. Özel kapsamlı fasulye için FactoryBean'dan başka bir çözüm önermeyi tercih edeceğim.

Bu yardımcı olur umarız!

+1

İlkbaharda hemen hemen her şeyi özelleştirebilirsiniz, bu yüzden bir şekilde mümkün olabilir, ama muhtemelen bazı çok derin kazma (özel bir uygulamacontext kullanarak) veya benzeri bir şey içerir. ama sanırım burada –

+0

kabul ediyorum ve cevabımı güncelledim. – Espen

2

Özel tutucu çekirdeği kullanarak aynı sorunu çözdüm.

Fabrika fasulye:

@Component 
@Configurable() 
public class EventBusFactory implements FactoryBean<EventBus> { 
    @Override 
    public EventBus getObject() throws Exception { 
     return new SimpleEventBus(); 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return EventBus.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return false; 
    } 
} 

Bean sahibi:

@Configurable 
@Component 
@Scope("session") 
public class EventBusHolder { 

    @Autowired 
    private EventBus eventBus; 

    public EventBus getEventBus() { 
     return eventBus; 
    } 

    public void setEventBus(EventBus eventBus) { 
     this.eventBus = eventBus; 
    } 
} 

Sonra yerine gerekli varlığın tutucu kullanın.

@Component 
@Configurable 
@Scope("session") 
public class UicPlaceController extends PlaceController { 

    @Autowired 
    public UicPlaceController(EventBusHolder eventBus) { 
     super(eventBus.getEventBus()); 
    } 
    ... 
} 

Çözüm biraz çirkin görünüyor, ancak yine de sorunu çözüyor.

+0

Bu, Tutucu ile çalışmanın geliştirilebileceğini tahmin ediyorum, ama şimdilik bana çalışıyor. – uthark

İlgili konular