【问题标题】:Spring autowiring not working with lazy-initSpring自动装配不适用于lazy-init
【发布时间】:2014-04-30 08:02:15
【问题描述】:

当我开始集成测试时,我正在尝试使用 Spring 自动装配 sessionFactory bean。当我在测试中创建一个服务类的新实例时,我相信我需要惰性初始化。对于我的生活,我不知道为什么我的 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);
}

Test.java

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

我在测试中的“模板”变量始终为空。

【问题讨论】:

    标签: java spring autowired sessionfactory


    【解决方案1】:

    您正在自己构建 MyServiceImpl,这意味着它不是由 spring 管理的,因此 spring 不会处理您的 Autowired 注解。您需要从 spring 上下文中获取 MyServiceImpl。

    【讨论】:

    • 谢谢伙计。从理论上讲,如果我“按原样”保留测试,我是否能够以任何方式通过 Spring 注入依赖项?或者我是否需要在我的服务实现中手动设置与我的数据库的连接? (在这种情况下完全废弃 Spring 的 DI)
    • 一般来说,如果你想在 spring 之外测试 bean,或者如果你想能够模拟通常会被注入的不同依赖项,你可以使用构造函数或 setter 注入来设置它们,这样你可以手动构造它并将其设置为您需要的任何值。
    • 你的测试试图断言什么?
    • 这只是示例代码,这不是我的完整测试,也不是完整的上下文和实现。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2011-09-24
    • 2019-08-13
    • 1970-01-01
    • 2015-03-17
    • 2018-05-15
    相关资源
    最近更新 更多