2010-02-23 8 views
6

Wiosną można było utworzyć instancję dowolnej klasy, definiując odpowiedni komponent bean w Xml conf. Możliwe było również utworzenie więcej niż jednego komponentu bean dla tej samej klasy o różnych parametrach .....jak utworzyć więcej niż jeden komponent CDI/Weld dla jednej klasy?

Czy takie funkcje są również dostępne w CDI, a mianowicie czy możliwe jest tworzenie różnych instancji tej samej klasy przy różnych inicjalizacjach parametry?

Czy można również utworzyć komponent bez zmiany klasy ... Mam na myśli bez dodawania adnotacji?

ADDED

Pozwolę sobie zrobić przykład.

<bean id="someBean1" class="org.mm.MyBean"> 
    <property name="x" value="xx"/> 
    <property name="y" value="yy"/> 
    <property name="z" value="zz"/>  
</bean> 
<bean id="someBean2" class="org.mm.MyBean"> 
    <property name="x" value="other value"/> 
    <property name="y" value="yy2"/> 
    <property name="z" value="zz2"/>  
</bean> 

W jaki sposób można utworzyć instancję dwóch instancji tej samej klasy i zainicjować je przy użyciu różnych wartości pól?

Odpowiedz

4

dwie opcje miarę widzę:

  • Bez dalszego poznania swojej usecase, zakładam, że albo chce zapewnić pewną alternatywną implementację (mock-) zagadnień badawczych lub konfiguracyjnych (słownie inny PaymentProvider dla OrderService). To jest obsługiwany przez samą specyfikację, rzucić okiem na @Alternativehere (i nie powtórzyć mój początkowy błąd i zapomnij aktywować alternatyw w beans.xml)

  • Aby uzyskać Wiosna stylu XML konfiguracji można użyj Seam 3 Config, która zapewnia konfigurację XML w opisany sposób. BTW, to była część JSR 299, ale została usunięta z specyfikacji bez względu na przyczynę.

+0

Udzielono odpowiedzi w 2011 r. Jaki jest obecny status w EE7? – banterCZ

+0

Nie mam pojęcia. Może zacznij nowe pytanie? –

+0

Tutaj jest pytanie http://stackoverflow.com/questions/25153624/how-to-instantiate-more-cdi-beans-for-one-class – banterCZ

2

istnieje kilka sposobów, aby to zrobić.

E.g. użyj @New

prywatny @Inject @Nowy YourBean yb; prywatny @Inject @Nowy YourBean yb2;

Zmusza pojemnik do utworzenia nowej instancji, niezależnie od tego, jaki zakres pierwotnie miał komponent bean.

Innym sposobem byłoby po prostu zdefiniować YourBean jako @Dependent scoped (który jest btw (obecnie) domyślny, jeśli klasa nie jest w ogóle adnotowana).

+0

a co z właściwościami? czy zostaną wstrzyknięte? – smikesh

2

Można łatwo korzystać z metod producentów, a jeśli masz wiele instancji, które powinny być tworzone za pomocą metody, użyj kwalifikatorów CDI, aby rozróżnić różne typy instancji.

Możesz również użyć Seam Config, aby to zrobić Spring way, ale myślę, że metody producenta są bardziej eleganckim sposobem na zrobienie tego. w zależności od przypadku użycia istnieje inna opcja, która jest @ Alternatywna.

Powiązane problemy