Я пытаюсь использовать @Autowired аннотации с моим общим интерфейсом Dao, как это:Spring 3 DI с использованием универсального интерфейса DAO
public interface DaoContainer<E extends DomainObject> {
public int numberOfItems();
// Other methods omitted for brevity
}
Я использую этот интерфейс в моем контроллере в следующем виде:
@Configurable
public class HelloWorld {
@Autowired
private DaoContainer<Notification> notificationContainer;
@Autowired
private DaoContainer<User> userContainer;
// Implementation omitted for brevity
}
Я настроил свой контекст приложения с следующей конфигурацией
<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 />
Это работает только partiall y, поскольку Spring создает и вводит только один экземпляр моего DaoContainer, а именно DaoContainer. Другими словами, если я попрошу userContainer.numberOfItems(); Я получаю количество notificationContainer.numberOfItems()
Я пытался использовать строго типизированные интерфейсы, чтобы отметить правильное выполнение так:
public interface NotificationContainer extends DaoContainer<Notification> { }
public interface UserContainer extends DaoContainer<User> { }
А затем использовал эти интерфейсы, как это:
@Configurable
public class HelloWorld {
@Autowired
private NotificationContainer notificationContainer;
@Autowired
private UserContainer userContainer;
// Implementation omitted...
}
к сожалению, это не в 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)}
Теперь, Я немного запутался, как мне следует продолжить или использовать несколько Дао. Любая помощь будет принята с благодарностью :)
Я не вижу классов реализации для ваших интерфейсов. Сколько их там, и на что они похожи? – skaffman
У меня не было явных реализаций для интерфейсов, так как я надеялся, что могу использовать общий класс dao (т. Е. DaoContainer). Я мог бы создать явные реализации (как указал Эспен в своем ответе). Это просто не кажется разумным, так как я стараюсь как можно больше использовать Java-дженерики. Однако у меня есть DaoContainerImpl . –
Peders
возможно http://stackoverflow.com/questions/502994/spring-ioc-and-generic-interface-type/511417#511417 - это решение –