Spring autowiring не работает с lazy-init

Я пытаюсь автоматически связать свой компонент sessionFactory с Spring, когда запускаю интеграционный тест. Поскольку я создаю новый экземпляр класса обслуживания в своем тесте, я считаю, что мне нужно выполнить отложенную инициализацию. На всю жизнь я понятия не имею, почему мой sessionFactory продолжает быть нулевым. Пожалуйста помоги!

applicationContext.xml

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    lazy-init="true">
    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

MyServiceImpl.java

@Autowired
SessionFactory sessionFactory;

public HibernateTemplate getHibernateTemplate() {
    return new HibernateTemplate(this.sessionFactory);
}

Тест.java

public void test() {
    MyServiceImpl impl = (MyServiceImpl) Class.forName("foo.package.MyServiceImpl").newInstance();
    HibernateTemplate template = impl.getHibernateTemplate();
}

Моя переменная «шаблон» в тесте всегда равна нулю.


person wild_nothing    schedule 22.03.2014    source источник


Ответы (1)


Вы сами создаете MyServiceImpl, что означает, что он не управляется Spring, поэтому Spring не обрабатывает вашу аннотацию Autowired. Вам нужно получить MyServiceImpl из контекста Spring.

person digitaljoel    schedule 22.03.2014
comment
Спасибо друг. Теоретически, если я оставлю тест как есть, смогу ли я каким-либо образом внедрить зависимости через Spring? Или мне нужно будет вручную настроить соединение с моей БД в моей реализации службы? (в этом случае полностью отказаться от Spring DI) - person wild_nothing; 23.03.2014
comment
Как правило, если вы хотите протестировать bean-компонент вне Spring или если вы хотите иметь возможность имитировать различные зависимости, которые обычно вводятся, вы должны настроить их с помощью конструктора или внедрения сеттера, чтобы вы могли вручную создать его и установить для него значение любое значение, которое вам нужно. - person digitaljoel; 23.03.2014
comment
Что ваш тест пытается доказать? - person Emerson Farrugia; 23.03.2014
comment
Это всего лишь пример кода, это не мой полный тест, не полный контекст и реализация. - person wild_nothing; 23.03.2014