2015-01-21 7 views
10

Używam @ComponentScan i @Component do definiowania moich fasoli szparagów. Chciałbym zadeklarować jedną z tych fasoli jako autowire-candidate=false.Jak zadeklarować moduł sprężynowy autowire-candidate = "false" podczas korzystania z adnotacji?

Można to zrobić za pomocą tego atrybutu w języku xml. Czy nie ma odpowiednika w adnotacjach?

Powodem tego chcę, ponieważ mam 2 implementacje tego samego interfejsu i nie chcę używać @Qualifier.

EDYCJA: Korzystanie z @Primary jest prawidłowym obejściem, ale kandydat na kandydata na autowira wydaje mi się przydatną funkcją z własną semantyką.

Dzięki

+2

Napisz adnotacje do preferowanego z '@ Primary'. W ten sposób nie musisz używać '@ Qualifier'. –

+0

Dzięki za komentarz. Tak, to jest jeden ze sposobów, które udało mi się przezwyciężyć, ale zastanawiam się, jak to możliwe, że w adnotacjach nie ma odpowiednika kandydata na autowira. –

+2

Wygląda na to, że Spring odrzucił koncepcję 'autowire-candidate = false' i nie jest już obsługiwana. Nie ma odpowiednika z adnotacjami, więc '@ Primary' jest tylko sposobem, jak zauważyłeś. –

Odpowiedz

5

Wygląda Wiosna odmówił autowire-candidate=false koncepcję i nie jest już obsługiwane. Nie ma analogii z adnotacjami, więc @Primary jest najlepszym obejściem, jak zauważyłeś.

Innym sposobem jest użycie niestandardowego org.springframework.beans.factory.support.AutowireCandidateResolver, który jest używany w DefaultListableBeanFactory, z logiką, która wyklucza niepożądane ziarna z kandydatów na autorów. W takim przypadku technologia będzie podobna do tej używanej dla autowire-candidate=false w SimpleAutowireCandidateResolver.

0

Możesz również użyć akcesorium do bean, aby dostroić jego widoczność.

zobaczyć Bean visibility

@Configuration 
public abstract class VisibilityConfiguration { 

    @Bean 
    public Bean publicBean() { 
     Bean bean = new Bean(); 
     bean.setDependency(hiddenBean()); 
     return bean; 
    } 

    @Bean 
    protected Bean hiddenBean() { 
     return new Bean("protected bean"); 
    } 
} 

Można wtedy @Autowire klasa Bean i będzie autowire się public Bean (bez narzeka wielu pasujące fasoli)

jako klasa definicji (chyba wbudowane) nie zezwala na uzyskanie dostępu do pracy po stronie użytkownika. byłoby użyć klasy @Configuration że instancję wszystkie fasole publikować fasolę publicznych podczas ukrywania prywatnego/chronione (zamiast bezpośrednio opisywanie klas @Component \ @Service)

także pakiet chroniony accessor może warto spróbować, aby ukryć @Component przypisane klasy. Nie wiem, czy to może zadziałać.

Powiązane problemy