バックグラウンド:
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]
このように Bean を自動配線しようとしているクラスから
@Autowired
private DeviceDao hibernateDevicDao;
同じインターフェースを実装する 2 つの Bean があるためです。
質問:
そのように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 がオートワイヤー候補としてマークされていなくても解決される、名前による明示的な参照には影響しないことに注意してください。
これは、注釈をJdbcDeviceDao
使用して自動配線し、デフォルトの Beanを使用できることを意味すると解釈しました。ただし、サーバーの起動時に次のエラーメッセージが表示されるため、私の解釈は明らかに正しくありませんでした。@Qualifier
HibernateDeviceDao
タイプ [class 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;