web-dev-qa-db-fra.com

Spring @Autowired injecte-t-il des haricots par nom ou par type?

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:

  • si Spring rencontre plusieurs beans de même type, il vérifie le nom du champ.
    • s'il trouve un bean avec le nom du champ cible, il injecte ce bean dans le champ.

N'est-ce pas faux? Existe-t-il un bogue dans la gestion par Spring de la configuration Java?

20
Lidovic

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.

14