バックグラウンド:
Spring 2.5 / Java / Tomcatアプリケーションがあります。アプリケーション全体で多くの場所で使用されている次のBeanがあります
public class HibernateDeviceDao implements DeviceDao
そして次の新しいBean:
public class JdbcDeviceDao implements DeviceDao
最初のBeanはそのように構成されています(パッケージ内のすべてのBeanが含まれています)
<context:component-scan base-package="com.initech.service.dao.hibernate" />
2番目の(新しい)Beanは個別に構成されます
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
これにより、(もちろん)サーバーの起動時に例外が発生します。
ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionException:タイプ[com.sevenp.mobile.samplemgmt.service.dao.DeviceDao]の一意のBeanが定義されていません:一致する単一のBeanが予期されていますが、2:[deviceDao、jdbcDeviceDao]が見つかりました
このように豆を自動配線しようとするクラスから
@Autowired
private DeviceDao hibernateDevicDao;
同じインターフェースを実装する2つのBeanがあるためです。
質問:
ように豆を構成することは可能ですか
1.既にHibernateDeviceDao
自動配線されている既存のクラスを変更する必要はありません
2.次のように、2番目の(新しい)Beanを引き続き使用できます。
@Autowired
@Qualifier("jdbcDeviceDao")
HibernateDeviceDao
つまり、自動ワイヤリングされるデフォルトのBeanとしてBean を構成する方法が必要です。同時にJdbcDeviceDao
、@Qualifier
アノテーションで明示的に指定するときに、の使用を許可します。
私がすでに試したこと:
プロパティを設定してみた
autowire-candidate="false"
JdbcDeviceDaoのBean構成:
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
Springドキュメントはそれを言うので
別のBeanの自動配線要件を満たすために一致する候補を探すときに、このBeanを考慮する必要があるかどうかを示します。これは名前による明示的な参照には影響を与えないことに注意してください。指定されたBeanがautowire候補としてマークされていなくても解決されます。*
これはJdbcDeviceDao
、@Qualifier
アノテーションを使用して自動ワイヤリングし、HibernateDeviceDao
デフォルトのBeanとして使用できることを意味すると解釈しました。しかし、サーバーの起動時に次のエラーメッセージが表示されるため、私の解釈は正しくなかったようです。
タイプ[クラスcom.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]の不満足な依存関係:少なくとも1つの一致するBeanが期待されます
私が修飾子を使ってBeanを自動配線しようとしたクラスから来ています:
@Autowired
@Qualifier("jdbcDeviceDao")
解決:
@Resourceアノテーションを試すというskaffmanの提案は機能しました。したがって、設定ではjdbcDeviceDaoのautowire-candidateがfalseに設定されています。jdbcDeviceDaoを使用するときは、@ Resourceアノテーション(@Qualifierではなく)を使用して参照します。
@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;