2013-10-28 13 views
6

W CDI, mogę to zrobić:Czy jest odpowiednik kwalifikatora CDI @Default na wiosnę?

// Qualifier annotation 
@Qualifier 
@inteface Specific{} 

interface A {} 

class DefaultImpl implements A {} 

@Specific 
class SpecificImpl implements A {} 

, a następnie w klasie:

@Inject 
A default; 

@Inject 
@Specific 
A specific; 

Działa powodu @Default eliminacjach automatycznie przypisany do punktów wtrysku nie podania żadnych kwalifikatorów.

Ale pracuję ze Spring i nie mogłem tego wykonać.

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException 

Problemem jest to, że zastrzyki „Default” (bez kwalifikatorów) są już wykorzystywane w partii kodu nie mogę zmienić, i muszę dostarczyć inną możliwą realizację A dla moich użytkowników.

Jestem świadomy, że mogę wprowadzić moją nową implementację po nazwie fasoli, ale chciałbym tego uniknąć.

Czy jest coś na wiosnę, które może mi w tym pomóc?

Odpowiedz

11

Ktoś wskazał na mnie, że @Primary robi dokładnie to. Próbowałem i działa idealnie:

@Primary 
class DefaultImpl implements A {} 

W moim przypadku DefaultImpl był w xml:

<bean id="defaultImpl" class="DefaultImpl" primary="true"/> 
0

mógłby Dodałem to jako komentarz, ale chciałem dodać kod formatowania wyjaśnić mój punkt i to jest powód, dla którego dodam wyraźną odpowiedź.

Dodając do tego, co pan powiedział, rzeczywiście można wykorzystać konkretnego meta adnotacji w ciągu wiosny również, zgodnie z poniższymi wytycznymi:

Redefine @Specific z wiosennym konkretnego org.springframework.beans.factory.annotation.Qualifier adnotacji w ten sposób:

import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.context.annotation.Primary; 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Qualifier 
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Primary 
public @interface Specific { 
} 

Oznakowałem także specjalną adnotację z adnotacją @Primary również teraz.

Mając to na miejscu starego kod powinien po prostu pracować:

@Specific 
class DefaultImpl implements A {} 
+0

Ale w moim przypadku, DefaultImpl nie jest '@ Specific'. To SpecificImpl musi być '@ Specific'. DefaultImpl musi mieć wartość 'Primary' – baraber

Powiązane problemy