Automatische Verdrahtung von zwei Beans, die dieselbe Schnittstelle implementieren - wie wird die Standard-Bean auf automatische Verdrahtung eingestellt?

Hintergrund:

Ich habe eine Spring 2.5 / Java / Tomcat-Anwendung. Es gibt die folgende Bohne, die in der gesamten Anwendung an vielen Stellen verwendet wird

<code>public class HibernateDeviceDao implements DeviceDao
</code>

und die folgende Bohne, die neu ist:

<code>public class JdbcDeviceDao implements DeviceDao
</code>

Die erste Bean ist so konfiguriert (alle Beans im Paket sind enthalten)

<code><context:component-scan base-package="com.initech.service.dao.hibernate" />
</code>

Die zweite (neue) Bean wird separat konfiguriert

<code><bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
    <property name="dataSource" ref="jdbcDataSource">
</bean>
</code>

Dies führt (natürlich) zu einer Ausnahme beim Starten des Servers:

verschachtelte Ausnahme ist org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine eindeutige Bean des Typs [com.sevenp.mobile.samplemgmt.service.dao.DeviceDao] ist definiert: erwartete einzelne übereinstimmende Bean, aber gefunden 2: [deviceDao, jdbcDeviceDao]

von einer Klasse, die versucht, die Bohne wie folgt automatisch zu verdrahten

<code>@Autowired
private DeviceDao hibernateDevicDao;
</code>

weil zwei Beans dieselbe Schnittstelle implementieren.

Die Frage:

Ist es möglich die Beans so zu konfigurieren

1. Ich muss keine Änderungen an vorhandenen Klassen vornehmen, die bereits dieHibernateDeviceDao automatisch verdrahtet

2. kann die zweite (neue) Bohne immer noch wie folgt verwenden:

<code>@Autowired
@Qualifier("jdbcDeviceDao")
</code>

Das heißt Ich brauche eine Möglichkeit, die zu konfigurierenHibernateDeviceDao Bean als Standard-Bean, die automatisch verkabelt werden soll und gleichzeitig die Verwendung einesJdbcDeviceDao bei ausdrücklicher Angabe mit dem@Qualifier Anmerkung.

Was ich schon ausprobiert habe:

Ich habe versucht, die Eigenschaft einzustellen

<code>autowire-candidate="false"
</code>

in der Bean-Konfiguration für JdbcDeviceDao:

<code><bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
    <property name="dataSource" ref="jdbcDataSource"/>
</bean>
</code>

weil die Frühlingsdokumentation das sagt

Gibt an, ob diese Bean berücksichtigt werden soll, wenn nach passenden Kandidaten gesucht wird, um die Anforderungen für die automatische Verdrahtung einer anderen Bean zu erfüllen.Beachten Sie, dass dies keine Auswirkungen auf explizite Verweise nach Namen hat, die auch dann aufgelöst werden, wenn die angegebene Bean nicht als Autowire-Kandidat markiert ist. *

was ich dahingehend interpretierte, dass ich noch autowire könnteJdbcDeviceDao Verwendung der@Qualifier Anmerkung und haben dieHibernateDeviceDao als Standardbohne. Anscheinend war meine Interpretation jedoch nicht korrekt, da dies zu der folgenden Fehlermeldung beim Starten des Servers führt:

Unbefriedigte Abhängigkeit vom Typ [Klasse com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]: mindestens 1 passende Bean erwartet

Ich komme aus der Klasse, in der ich versucht habe, die Bohne mit einem Qualifier automatisch zu verdrahten:

<code>@Autowired
@Qualifier("jdbcDeviceDao")
</code>
Lösung:

Skaffman's Vorschlag Die @Resource Annotation funktionierte. In der Konfiguration wurde der Autowire-Kandidat für "jdbcDeviceDao" auf "false" gesetzt. Bei Verwendung von "jdbcDeviceDao" verweise ich mit der Annotation "@Resource" (anstelle von "@Qualifier") darauf:

<code>@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;
</code>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage