2015-08-14 7 views
7

Ho la seguente configurazione in cui ho due bean Spring con lo stesso nome da due diverse classi di configurazione.Avvio a molla che non si lamenta di due fagioli con lo stesso nome

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.client.RestTemplate; 

@Configuration 
public class RestTemplateConfiguration { 

    @Bean 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.client.RestTemplate; 

@Configuration 
public class OtherRestTemplateConfiguration { 

    @Bean 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 

E sto iniettando (e l'utilizzo) questo fagiolo in questo modo:

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.springframework.web.client.RestTemplate; 

@Component 
public class SomeComponent { 

    @Autowired 
    private RestTemplate restTemplate; 

} 

Ora, la mia domanda è: perché è la primavera non si lamenta di avere più fagioli con il stesso nome? Mi aspetterei un'eccezione qui e dover aggiungere un'annotazione @Primary per assicurarmi che venga utilizzata quella corretta.

Nota a margine: anche se aggiungo @Primary, non è ancora in grado di iniettare sempre quello corretto.

+1

Non si può avere fagioli con lo stesso nome, il risultato finale sarà un singolo chicco come un chicco sovrascrive l'altro, a causa lo stesso nome. Quindi c'è un solo fagiolo nel contesto. Per ottenere più bean date loro nomi diversi e annotatene uno con '@ Primary'. –

risposta

3

Uno dei fagioli è prevalente altro perché si utilizza lo stesso nome. Se nomi diversi sono stati utilizzati come @ Paweł-Glowacz suggerito, quindi in caso di utilizzo

@Autowired 
private RestTemplate myRestTemplate; 

primavera si lamentano perché trova due fagioli con le stesso tipo RestTemplate e non sa quale utilizzare. Quindi applica @Primary a uno di essi.

Più spiegazione qui: more info

+0

Sto già iniettando il fagiolo per nome e la primavera non si lamenta. Aggiornata la domanda. – wjans

+1

non si lamenta perché il primo viene cancellato dal secondo, perché viene usato lo stesso nome :) date un'occhiata ai log, dovreste trovare il messaggio che inizia con 'Overriding bean definition for bean 'restTemplate'' – freakman

+0

Ok, quindi uno di essi viene cancellato . Ma anche se aggiungo '@ Primary' a quello corretto, non lo prendo ancora. (Questo è quello che stavo provando in primo luogo). La parte di log sovrascritta menziona anche la sostituzione di '... primary = true ...' con '... primary = false ...' – wjans

0

È necessario un nome che i fagioli così:

@Configuration 
public class RestTemplateConfiguration { 

    @Bean(name="bean1") 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 

E

@Configuration 
public class OtherRestTemplateConfiguration { 

    @Bean(name="bean2") 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 
+0

Non voglio distinguere tra i due. Vorrei annotare quello che vorrei usare con '@ Primary', ma la mia domanda è perché non si scontra senza l'annotazione. – wjans

+0

Quando si contrassegna con '@ Bean', si dice a molla che:" Ehi amico, gestirai gli oggetti ". Quindi la primavera crea dei proxy per quegli oggetti. Sotto la gestione delle molle con annotazione '@ Bean' primavera bisogno di avere fagioli unici. Nell'esempio precedente, per fare in modo che ciò accada, è necessario contrassegnare i bean con nomi univoci per risolvere il conflitto in attesa di una chiamata. Senza annotazione '@ Bean' primavera non saprai nulla di quei fagioli e non ci saranno errori –

+0

Sì, lo capisco, ma perché non si lamenta quando hanno lo stesso nome? – wjans

Problemi correlati