2010-11-17 11 views
20

Moje sprężyny fasoli mieć konstruktora z unikalnym obowiązkowego argumentu, i udało mi się go zainicjować z konfiguracją XML:Jak wstrzykiwać wartości do konstruktora fasoli, korzystając z adnotacji

<bean name="interfaceParameters#ota" class="com.company.core.DefaultInterfaceParameters"> 
    <constructor-arg> 
    <value>OTA</value> 
    </constructor-arg> 
</bean> 

Potem korzystać z tej fasoli tak i działa dobrze.

@Resource(name = "interfaceParameters#ota") 
private InterfaceParameters interfaceParameters; 

Ale chciałbym, aby określić wartość arg contructor z annocations, coś

@Resource(name = "interfaceParameters#ota") 
@contructorArg("ota") // I know it doesn't exists! 
private InterfaceParameters interfaceParameters; 

to jest możliwe?

góry dzięki

+0

Być może odpowiedź jest podana [tutaj] (http://stackoverflow.com/a/2306468/267197). –

Odpowiedz

45

pierwsze, trzeba określić argumentu konstruktora w definicji fasoli, a nie w swoich punktach iniekcyjnych. Następnie można wykorzystać sprężyny @Value adnotacji (sprężyna 3,0)

@Component 
public class DefaultInterfaceParameters { 

    @Inject 
    public DefaultInterfaceParameters(@Value("${some.property}") String value) { 
     // assign to a field. 
    } 
} 

This is also encouraged as Spring advises constructor injection over field injection.

O ile widzę problemu, to może cię nie odpowiadał, ponieważ wydaje się, aby zdefiniować wiele ziaren tej samej klasy, inaczej nazwane. Do tego nie możesz używać adnotacji, musisz je zdefiniować w XML.

Jednak nie sądzę, że dobrze jest mieć te różne ziarna. Lepiej użyj tylko wartości ciągu. Ale nie mogę podać więcej informacji, ponieważ nie znam twoich dokładnych klas.

+0

dzięki za odpowiedź, co masz na myśli mówiąc "użyj tylko wartości ciągu"? – tbruyelle

+0

cóż, potrzebujesz łańcucha "OTA". Nie potrzebujesz do tego całego obiektu. – Bozho

+0

oh Widzę, łańcuch "OTA" jest używany w metodzie @postConstruct mojego komponentu bean i jest to informacja obowiązkowa do budowania komponentu bean. Łańcuch służy do pobierania danych z bazy danych. Każdy komponent bean tego typu zwróci różne dane dla każdej wartości ciągu. BTW masz rację co do użycia xml, ponieważ definiuję wiele komponentów dla tej samej klasy, nie mogę używać adnotacji. – tbruyelle

1

Jak powiedział Bozho, zamiast konstruktora arg można ustawić właściwość ... @ PostConstruct zostanie sprawdzony dopiero po wykonaniu wszystkich właściwości są ustawione ... tak, będzie nadal mieć swój ciąg dostępny ...

Powiązane problemy