2015-05-20 35 views
6

Sto leggendo il libro di inizio primavera (wiley press). Nel capitolo 2 c'è un esempio sulla configurazione Java e @Autowired. Esso fornisce questo @Configuration classeSpring @Autowired inserisce i fagioli per nome o per tipo?

@Configuration 
public class Ch2BeanConfiguration { 

    @Bean 
    public AccountService accountService() { 
     AccountServiceImpl bean = new AccountServiceImpl(); 
     return bean; 
    } 

    @Bean 
    public AccountDao accountDao() { 
     AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl(); 
     //depedencies of accountDao bean will be injected here... 
     return bean; 
    } 

    @Bean 
    public AccountDao accountDaoJdbc() { 
     AccountDaoJdbcImpl bean = new AccountDaoJdbcImpl(); 
     return bean; 
    } 
} 

e questa classe di fagioli regolare

public class AccountServiceImpl implements AccountService { 

    @Autowired 
    private AccountDao accountDao; 

    public void setAccountDao(AccountDao accountDao) { 
     this.accountDao = accountDao; 
    } 
    ... 
} 

Quando eseguo il codice, funziona. Ma mi aspettavo un'eccezione perché ho definito 2 bean con lo stesso tipo nella configurazione.

ho capito che funziona così:

  • se Primavera incontra più fagioli con le stesso tipo di verifica nome del campo.
    • se trova un bean con il nome del campo obiettivo, inietta quel bean nel campo.

Non è questo che non va? C'è un bug nella gestione di Spring della configurazione di Java?

risposta

5

Il documentation spiega questo

per una partita di ripiego, il nome del bean è considerato un qualificatore predefinito valore. Quindi è possibile definire il bean con un ID "main" invece dell'elemento qualificatore nidificato , che porta allo stesso risultato di corrispondenza. Tuttavia, sebbene sia possibile utilizzare questa convenzione per fare riferimento a specifici bean per nome, @Autowired riguarda fondamentalmente l'iniezione di tipo con qualificatori semantici opzionali. Ciò significa che i valori del qualificatore, anche con il fallback del nome del bean, hanno sempre semantica restringente all'interno del set di corrispondenze di tipo; essi non semanticamente esprimono una riferimento ad un ID di fagioli unico

Quindi, no, non è un bug, che è il comportamento previsto. L'id del bean (nome) sarà usato come fallback se un autowiring di tipo non trova un singolo bean corrispondente.