2012-01-07 14 views
14

Potrzebuję utworzyć obiekt, który jest kompletny bez argumentu konstruktora. Coś podobnego do tego:Spring bean z dynamiczną wartością konstruktora

Chciałbym, żeby to ziarno fasoli było wiosenne, tak, żebym mógł później użyć Spring AOP.

<bean id="myBean" class="A" singleton="false"> 
</bean> 

Jednak mój fasola potrzebuje timeout być przekazywane jako dynamicznej wartości - czy istnieje sposób, aby utworzyć sprężynę udało fasoli o wartości dynamicznego jest injedcted w konstruktorze?

+0

Możesz być zainteresowany [SPR-7431] (https://jira.springsource.org/browse/SPR-7431). –

Odpowiedz

25

BeanFactory ma metodę getBean(String name, Object... args) które, zgodnie z javadoc, pozwala określić argumenty konstruktora, które są używane do nadpisania własnych argumentów definicji komponentu bean. Możesz więc umieścić domyślną wartość w pliku fasoli, a następnie określić "rzeczywiste" wartości środowiska wykonawczego, gdy jest to wymagane, np.

<bean id="myBean" class="A" scope="prototype"> 
    <constructor-arg value="0"/> <!-- dummy value --> 
</bean> 

, a następnie:

getBean("myBean", myTimeoutValue); 

nie próbowałem ten sam, ale to powinno działać.

P.S. scope="prototype" jest teraz lepszym rozwiązaniem niż singleton="false", co jest przestarzałą składnią - jest bardziej jednoznaczne, ale robi to samo.

+1

jak to osiągnąć za pomocą adnotacji ...? Mam na myśli @Autowired @ Parameter1 (value = "xxx", type = "String") <- jak w ten sposób? –

+0

Wydaje się, że to dzika składnia, ale działa dla mnie. –

+0

@PatrickJeon Wygląda to bardzo interesująco. Jednak nie mogę znaleźć żadnej dokumentacji na poparcie tego, ani nie wiem, co powinno zostać zaimportowane. "@ Parametr1" nie jest rozpoznawany. Otrzymuję sugestie zarówno dla Hibernate, jak i JUnit, z których żadna nie wydaje się odpowiednia. Wszelkie wskazówki będą mile widziane. –

1

dwie opcje sprężyna (gra słów nie przeznaczonych) do głowy:


1. utworzyć fabrykę limitu czasu, i użyć jej jako parametr konstruktora. Możesz utworzyć komponent bean, który implementuje FactoryBean, a jego zadaniem jest tworzenie innych komponentów. Jeśli więc masz coś, co generuje sól do szyfrowania, możesz go zwrócić z obiektu getObject() obiektu EncryptionSalt. W twoim przypadku chcesz generować liczby całkowite.

Oto przykład: http://www.java2s.com/Code/Java/Spring/SpringFactoryBeanDemo.htm


2. utworzyć fasola limitu czasu, która otacza int, który jest dynamicznie ustawić i zostawić, że w „prototypu” stanie więc jest tworzony za każdym razem Zamiast Przechodząc do kłopotów związanych z tworzeniem fabryki, obiekt EncryptionSalt mógłby zostać zadeklarowany jako prototypowy komponent bean, więc po jego wprowadzeniu za każdym razem tworzony jest nowy obiekt. Umieść logikę w konstruktorze lub w innym miejscu.


To zależy od tego, jaką wartość ma mieć czas oczekiwania.

+0

Chcę, aby limit czasu był zwykłą wartością całkowitą. czy możesz podać przykłady obu podejść tutaj wymienionych? – Shamik

+0

Rozwinąłem w mojej odpowiedzi dla ciebie. –

1

Zrób to wyraźnie:

interface Bean { 
    void setTimeout(int timeout); 
} 

class BeanImpl implements Bean { 
    private int timeout; 

    @Override 
    public void setTimeout(int timeout) { 
     this.timeout = timeout; 
    } 
    ... 
} 

<bean id="bean" class="BeanImpl" scope="prototype"> 
    ... 
    <!-- Nothing about timeout here --> 
    ... 
</bean> 

class Client { 
    private Bean bean; 
    public void setBean(Bean bean) { 
     this.bean = bean; 
    } 
    ... 
    public void methodThatUsesBean() { 
     int timeout = calculateTimeout(); 
     bean.setTimeout(timeout); 
     ... 
    } 
} 
Powiązane problemy