Próbuję użyć @Autowired adnotacji z moim rodzajowego interfejsu Dao jak ten:Wiosna 3 DI użyciu rodzajowy interfejs DAO
public interface DaoContainer<E extends DomainObject> {
public int numberOfItems();
// Other methods omitted for brevity
}
używam tego interfejsu w moim kontrolera w następujący sposób:
@Configurable
public class HelloWorld {
@Autowired
private DaoContainer<Notification> notificationContainer;
@Autowired
private DaoContainer<User> userContainer;
// Implementation omitted for brevity
}
mam skonfigurowane moje kontekstu aplikacji z następującej konfiguracji
<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 />
ta działa tylko partiall y, ponieważ Spring tworzy i wstrzykuje tylko jedną instancję mojego DaoContainer, mianowicie DaoContainer. Innymi słowy, jeśli zapytam userContainer.numberOfItems(); Mam liczbę notificationContainer.numberOfItems()
Próbowałem użyć silnie typami interfejsów zaznaczyć prawidłową realizację takiego:
public interface NotificationContainer extends DaoContainer<Notification> { }
public interface UserContainer extends DaoContainer<User> { }
a następnie wykorzystywane te interfejsy tak:
@Configurable
public class HelloWorld {
@Autowired
private NotificationContainer notificationContainer;
@Autowired
private UserContainer userContainer;
// Implementation omitted...
}
Niestety to nie 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)}
teraz Jestem nieco zdezorientowany, w jaki sposób powinienem kontynuować, czy też używać wielu Dao, nawet możliwych. Jakakolwiek pomoc byłaby bardzo doceniana :)
Nie widzę żadnych klas implementacji dla twoich interfejsów. Ile tam jest i jak one wyglądają? – skaffman
Nie miałem jawnych implementacji dla interfejsów, ponieważ miałem nadzieję, że mogę użyć ogólnej klasy dao (to jest DaoContainer). Mógłbym stworzyć wyraźne implementacje (jak zauważył Espen w swojej odpowiedzi). To po prostu nie wydaje się rozsądne, ponieważ staram się jak najwięcej wykorzystywać generyczne Java. Jednak mam DaoContainerImpl . –
Peders
może http://stackoverflow.com/questions/502994/spring-ioc-and-generic-interface-type/511417#511417 jest rozwiązaniem –