2010-09-20 8 views
1

J'ai essayé de lier automatiquement un haricot pour une classe de test en utilisant @Autowire, mais le haricot n'est pas câblé et je reçois cette exception:autowire de printemps ne se comporte pas comme prévu

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No matching bean of type [com.abc.MyDaoHibernateImpl] found for dependency: 
    expected at least 1 bean which qualifies as autowire candidate for this 
    dependency. 
    Dependency annotations: 
     {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Ma classe de test ressemble à ceci:

package com.abc; 

@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) 
@TransactionConfiguration(transactionManager = "hibernateTransactionManager") 
public class MyDaoHibernateImplTest 
    extends AbstractTransactionalJUnit4SpringContextTests 
{ 

    @Autowired 
    private MyDaoHibernateImpl myDao; 

    .... 
} 

Le fichier applicationContext.xml a cette définition de haricot:

<bean id="myDao" class="com.abc.MyDaoHibernateImpl"> 
    <property name="sessionFactory" ref="hibernateSessionFactory" /> 
</bean> 

quelqu'un peut-il s ee où je vais mal?

Merci d'avance pour toute suggestion.

--James

Répondre

0

Je suppose que le type réel de votre haricot est obscurci par dynamic proxy utilisé pour appliquer les aspects. Dans ce cas, vous devez utiliser l'interface plutôt que la classe pour les champs autowired (ou forcer la stratégie de proxy de classe cible avec proxy-target-class="true").

1

En tant que axtavt suggests, le ressort est un cadre qui favorise fortement l'utilisation d'interfaces. Une pratique exemplaire au printemps consiste à définir une dépendance à une interface et à laisser le ressort injecter l'implémentation. C'est tout le sens de l'injection de dépendance: vous spécifiez l'interface dont vous avez besoin, mais le conteneur injecte la classe d'implémentation qu'il sélectionne, qui peut être une classe que vous avez créée ou un proxy dynamique basé sur cette classe. Mais une classe ne doit pas connaître les détails d'implémentation de sa dépendance.

Voici une référence du Spring Proxying Mechanism. À propos du concept général d'utilisation des interfaces, vous devriez lire Effective Java by Joshua Bloch, chapitre 8, article 52: Reportez-vous aux objets par leurs interfaces. En outre, vous devriez lire Interfaces and Inheritance à partir du Tutoriel Sun Java.