Tut Spring @Autowired injizieren Bohnen vom Namen oder vom Typ?
Lese ich Anfang Frühjahr (wiley press) Buch. In Kapitel 2 gibt es ein Beispiel
über die Java-Konfiguration und @Autowired
. Es stellt diese @Configuration
Klasse
@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 das regelmäßige bean-Klasse
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
...
}
Wenn ich den code, es funktioniert. Aber ich erwartete eine Ausnahme, weil ich habe 2 Bohnen mit dem gleichen Typ in der Konfiguration.
Erkannte ich, dass es funktioniert wie folgt:
- wenn der Frühling trifft auf mehrere beans mit der gleichen Art überprüft Feld name.
- wenn es findet eine bean mit dem Namen des Ziel-Feld, es spritzt, die bean in das Feld ein.
Ist das nicht falsch? Ist es ein bug im Frühling, den Umgang mit der Java-Konfiguration?
- Ich völlig verstehen, warum Sie sind verwirrt von diesem -- denn it schlechtes design, IMO.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Dokumentation erklärt dies
So, Nein, es ist kein bug, das ist das beabsichtigte Verhalten. Der bean-id (name) wird als fallback verwendet werden, wenn eine Typ-autowiring nicht finden, eine einzige passende Bohne.
@Autowired
Anmerkungen haben alle Platz in der Klasse. Wieder DI sollte eine überlegung und initialisiert auf der Anwendungsebene. Klassen weiter unten in der Kette sollte kein Konzept von DI.