Весной автопровода не ведет себя, как ожидалось - PullRequest
1 голос
/ 20 сентября 2010

Я попытался автоматически подключить компонент для тестового класса, используя @Autowire, однако компонент не подключен, и я получил следующее исключение:

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)}

Мой тестовый класс выглядит так:

package com.abc;

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

    @Autowired
    private MyDaoHibernateImpl myDao;

    ....
}

Файл applicationContext.xml имеет следующее определение компонента:

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

Кто-нибудь может увидеть, где я иду не так?

Заранее спасибо за любые предложения.

- Джеймс

Ответы [ 2 ]

1 голос
/ 21 сентября 2010

Как подсказывает axtavt , spring - это фреймворк, который сильно способствует использованию интерфейсов.Лучшая практика Spring - определить зависимость от интерфейса и позволить Spring внедрить реализацию.В этом весь смысл внедрения зависимости: вы указываете нужный интерфейс, но контейнер будет внедрять выбранный класс реализации, который может быть либо созданным вами классом, либо динамическим прокси-сервером на основе этого класса.Но класс не должен знать подробности реализации своей зависимости.

Вот ссылка на Механизм проксирования пружин .

Об общей концепции использования интерфейсов вам следуетчитать Эффективная Java от Джошуа Блоха , глава 8, пункт 52: Ссылаться на объекты по их интерфейсам.Также вы должны прочитать Интерфейсы и наследование из Sun Java Tutorial.

0 голосов
/ 20 сентября 2010

Полагаю, фактический тип вашего компонента скрыт динамическим прокси , используемым для применения аспектов.В этом случае вам нужно использовать интерфейс, а не класс для полей с автоматическим связыванием (или использовать стратегию прокси целевого класса с помощью proxy-target-class="true").

...