2010-05-13 18 views
8

Chciałbym używać razem FactoryBeans i zakresów. W szczególności chciałbym, aby obiekt utworzony i zwrócony przez FactoryBean został umieszczony w określonym (być może niestandardowym) zakresie. Problem jest, że w następujący sposób:Spring FactoryBean i lunety współpracujące ze sobą

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

Wyniki w FactoryBean sama jest określania zakresów i ma nieco nieprzewidywalne zachowanie na obiekcie stworzonym przez fabrykę. Rozumiem, dlaczego tak jest; Sama fabryka jest pierwszorzędną sprężyną zarządzaną przez sprężynę i ma swój własny cykl życia. Nie mogę jednak znaleźć sposobu na określenie, czy obiekt zwrócony z fabryki powinien być objęty zasięgiem.

Z drugiej strony, to jest dokładnie to, co chcę (o ile TestFactoryBean nie implementuje interfejsu FactoryBean):

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

Więc prawdziwe pytanie brzmi, jak mogę uczynić Wiosna zachowywać się jak to robi dla drugiego przykładu powyżej, ale używając prawdziwego FactoryBeans?

Odpowiedz

6

Nie można łatwo użyć niestandardowego zakresu na ziarnie zwróconym z FactoryBean.

od wiosny za Java documentation:

FactoryBeans może obsługiwać pojedynczych i prototypów

Jeśli chcesz, FactoryBean „s zwrócone fasoli mieć zakres prototyp, trzeba zaimplementować metody takie jak to isSingleton() :

public class TestFactoryBean implements FactoryBean<TestBean> { 

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

    public boolean isSingleton() { 
     return false; 
    } 
} 

Aby obsługiwać niestandardowy zakres, należy implementować logikę samodzielnie i nie będzie to zbyt intuicyjne, ponieważ metoda FactoryBean zapewnia tylko metodę . Raczej zalecam użycie innego rozwiązania niż dla fasoli o niestandardowym zasięgu.

Mam nadzieję, że to pomoże!

+1

można dostosować prawie wszystko na wiosnę, więc myślę, że jest to możliwe, ale prawdopodobnie będzie to wymagało bardzo głębokiego kopania (przy użyciu niestandardowego kontekstu aplikacji) lub czegoś podobnego. ale zgaduję tutaj –

+0

Zgadzam się i zaktualizowałem moją odpowiedź. – Espen

2

Rozwiązałem ten sam problem, używając niestandardowej fasoli.

Fabryka fasola:

@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 posiadacz:

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

    @Autowired 
    private EventBus eventBus; 

    public EventBus getEventBus() { 
     return eventBus; 
    } 

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

I wtedy użyć uchwytu zamiast żądanej jednostki.

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

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

Rozwiązanie wygląda trochę brzydko, ale mimo to rozwiązuje problem.

+0

Myślę, że ta praca z Holder może zostać ulepszona, ale na razie to działa. – uthark

Powiązane problemy