2015-05-20 10 views
6

Ich lese Anfang Frühling (Wiley Press) Buch. In Kapitel 2 gibt es ein Beispiel über Java-Konfiguration und @Autowired. Es bietet diese @Configuration KlasseWird Spring @Autowired Bohnen nach Name oder nach Typ injizieren?

@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; 
    } 
} 

und diese regelmäßig Bean-Klasse

public class AccountServiceImpl implements AccountService { 

    @Autowired 
    private AccountDao accountDao; 

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

Wenn ich den Code ausführen, es funktioniert. Aber ich habe eine Ausnahme erwartet, weil ich 2 Beans vom gleichen Typ in der Konfiguration definiert habe.

Ich erkennen, dass es funktioniert wie folgt:

  • wenn Frühling Feldnamen mehrere Bohnen mit gleichem Typ begegnet prüft.
    • Wenn eine Bean mit dem Namen des Zielfelds gefunden wird, wird diese Bean in das Feld injiziert.

Ist das nicht falsch? Gibt es einen Fehler bei der Handhabung der Java-Konfiguration in Spring?

Antwort

5

Die documentation dieses

Für ein Ausweichspiel erklärt, die Bohne Name wird ein Standard Qualifier Wert betrachtet. Sie können also die Bean mit der ID "main" anstelle des verschachtelten Qualifier-Elements definieren, was zu demselben Ergebnis führt. Obwohl Sie diese Konvention verwenden können, um auf spezifische Bohnen nach Namen zu verweisen, ist @Autowired grundsätzlich über Typ-driven Injektion mit optionalen semantischen Qualifikatoren. Dies bedeutet, dass Qualifier-Werte, auch mit dem Bean-Namen-Fallback, immer eine einschränkende Semantik innerhalb der Menge der Typübereinstimmungen haben; sie nicht semantisch einen Verweis auf eine einzigartige bean id

Also, nein, es ist kein Fehler ausdrücken, dass das beabsichtigte Verhalten. Die Bean-ID (Name) wird als Fallback verwendet, wenn ein autonomes By-Type-Verfahren keine einzelne übereinstimmende Bean findet.