2013-08-31 75 views
0

我在春天的配置,这是这怎么会发生?关于Hibernate和Spring和SessionFactory的

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

,并在我的MVC控制器中的豆,我用:

@autowired 
SessionFactory sf; 

,春季可以注入Hibernate的SessionFactory的(不仅仅是bean:LocalSessionFactoryBean)

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

回答

1

你会注意到LocalSessionFactoryBean implements 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实例和春天还是会叫getObject()方法和填充它与一个SessionFactory实例上下文。

有许多这样的FactoryBean实现对Spring开发人员非常有用。

2

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

阅读the javadocthe documentation了解更多详情。

相关问题