怎么会发生这种情况?关于hibernate和spring以及SessionFactory

时间:2013-08-31 15:55:15

标签: spring hibernate spring-mvc

我在spring的配置中有一个bean,它是

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

在我的MVC控制器中,我使用:

@autowired
SessionFactory sf;

和spring可以注入hibernate的SessionFactory(不只是bean:LocalSessionFactoryBean)

怎么会发生这种情况,SessionFactory只是LocalSessionFactoryBean的一个属性。

2 个答案:

答案 0 :(得分:2)

FactoryBean是给定Spring bean类型的工厂。当Spring注入Foo时,如果它在bean列表中找到类型为FactoryBean<Foo>的bean,那么它会要求这个工厂创建一个Foo,然后注入Foo }。这允许延迟bean创建直到必要,并自定义其创建(例如,创建bean是一个复杂的过程,或需要自定义范围)。

阅读the javadocthe documentation了解详情。

答案 1 :(得分:1)

您会注意到LocalSessionFactoryBean实施FactoryBean<SessionFactory>。 Spring使用此接口创建其他类型的bean。在这种情况下,SessionFactory

简单来说,Spring会在getObject()的实例上调用LocalSessionFactoryBean,它将返回SessionFactory实例。为了说明发生了什么,采用Java配置方式声明bean。

@Bean 
public SessionFactory sessionFactory() throws IOException {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource());
    Properties hibernateProperties = new Properties();
    sessionFactoryBean.setHibernateProperties(hibernateProperties);
    sessionFactoryBean.afterPropertiesSet();

    return sessionFactoryBean.getObject();
}

您也可以返回一个LocalSessionFactoryBean实例,而Spring仍然会调用getObject()方法并使用SessionFactory实例填充其上下文。

有大量此类FactoryBean实现对Spring开发人员有用。