Je lis le livre du début du printemps (Wiley Press). Dans le chapitre 2, il y a un exemple de Java et @Autowired
. Il fournit ce @Configuration
classe
@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;
}
}
et cette classe régulière de haricots
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
...
}
Lorsque j'exécute le code, cela fonctionne. Mais je m'attendais à une exception car j'ai défini 2 beans avec le même type dans la configuration.
J'ai réalisé que cela fonctionne comme ceci:
N'est-ce pas faux? Existe-t-il un bogue dans la gestion par Spring de la configuration Java?
Le documentation explique cela
Pour une correspondance de secours, le nom du bean est considéré comme une valeur de qualificatif par défaut. Ainsi, vous pouvez définir le bean avec un id "main" au lieu du qualificatif imbriqué , conduisant au même résultat correspondant. Cependant, bien que vous puissiez utiliser cette convention pour faire référence à des beans spécifiques par leur nom,
@Autowired
concerne fondamentalement l'injection pilotée par type avec des qualificatifs sémantiques facultatifs . Cela signifie que les valeurs de qualificatif, même avec le repli du nom du bean, ont toujours une sémantique plus étroite dans l'ensemble des correspondances de type; ils n'expriment pas sémantiquement une référence à un identifiant de bean unique
Donc, non, ce n'est pas un bug, c'est le comportement recherché. L'identifiant de bean (nom) sera utilisé comme solution de rechange si un câblage automatique par type ne trouve pas un bean correspondant unique.