web-dev-qa-db-ja.com

Spring @Autowiredは、名前またはタイプ別にBeanを注入しますか?

初春(ワイリープレス)の本を読んでいます。第2章には、Java構成と@Autowiredの例があります。これは、この@Configurationクラスを提供します

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

そして、この通常のBeanクラス

public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

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

コードを実行すると機能します。しかし、構成で同じタイプの2つのBeanを定義したため、例外が予想されました。

私はそれが次のように機能することに気づきました:

  • springが同じタイプの複数のBeanを検出すると、フィールド名をチェックします。
    • ターゲットフィールドの名前を持つBeanが見つかった場合、そのBeanをフィールドに挿入します。

これは間違っていませんか? SpringのJava構成の処理にバグがありますか?

20
Lidovic

documentation はこれを説明しています

フォールバック一致の場合、Bean名はデフォルトの修飾子値と見なされます。したがって、入れ子になった修飾子の代わりにID「main」でBeanを定義できます要素、同じマッチング結果につながる。 ただし、この規則を使用して、特定のBeanを名前で参照できますが、@Autowiredは基本的に、オプションのセマンティック修飾子を使用したタイプ駆動型の注入に関するものです。これは、Bean名のフォールバックがあっても、修飾子の値は常に、一致するタイプのセット内でセマンティクスを狭めることを意味します。一意のBean IDへの参照を意味的に表現しない

したがって、いいえ、それはバグではありません。それは意図された動作です。 Bean ID(名前)は、タイプ別の自動配線で一致するBeanが1つも見つからない場合のフォールバックとして使用されます。

14