J'essaie d'utiliser l'annotation @Autowired avec mon interface générique Dao comme ceci:Spring 3 DI en utilisant l'interface générique DAO
public interface DaoContainer<E extends DomainObject> {
public int numberOfItems();
// Other methods omitted for brevity
}
J'utilise cette interface dans mon contrôleur de manière suivante:
@Configurable
public class HelloWorld {
@Autowired
private DaoContainer<Notification> notificationContainer;
@Autowired
private DaoContainer<User> userContainer;
// Implementation omitted for brevity
}
J'ai configuré mon contexte d'application avec la configuration suivante
<context:spring-configured />
<context:component-scan base-package="com.organization.sample">
<context:exclude-filter expression="org.springframework.stereotype.Controller"
type="annotation" />
</context:component-scan>
<tx:annotation-driven />
Cela ne fonctionne que partiall y, puisque Spring crée et injecte seulement une instance de mon DaoContainer, à savoir DaoContainer. En d'autres termes, si je demande userContainer.numberOfItems(); Je reçois le nombre de notificationContainer.numberOfItems()
J'ai essayé d'utiliser des interfaces fortement typées pour marquer la mise en œuvre correcte comme ceci:
public interface NotificationContainer extends DaoContainer<Notification> { }
public interface UserContainer extends DaoContainer<User> { }
Et puis utilisé ces interfaces comme ceci:
@Configurable
public class HelloWorld {
@Autowired
private NotificationContainer notificationContainer;
@Autowired
private UserContainer userContainer;
// Implementation omitted...
}
Malheureusement, cela ne parvient pas à BeanCreationException:
org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.organization.sample.dao.NotificationContainer com.organization.sample.HelloWorld.notificationContainer; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.organization.sample.NotificationContainer] 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)}
maintenant, Je suis un peu confus comment devrais-je procéder ou utilise plusieurs Dao même possible. Toute aide serait grandement appréciée :)
Je ne vois aucune classe d'implémentation pour vos interfaces. Combien y en a-t-il et à quoi ressemblent-ils? – skaffman
Je n'avais pas d'implémentations explicites pour les interfaces, puisque j'espérais pouvoir utiliser la classe dao générique (c'est-à-dire DaoContainer). Je pourrais créer des implémentations explicites (comme Espen l'a souligné dans sa réponse). Cela ne me semble pas raisonnable, puisque j'essaie de tirer le meilleur parti des génériques Java. Cependant, j'ai DaoContainerImpl . –
Peders
peut-être http://stackoverflow.com/questions/502994/spring-ioc-and-generic-interface-type/511417#511417 est une solution –