我在spring的配置中有一个bean,它是
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
在我的MVC控制器中,我使用:
@autowired
SessionFactory sf;
和spring可以注入hibernate的SessionFactory(不只是bean:LocalSessionFactoryBean)
怎么会发生这种情况,SessionFactory只是LocalSessionFactoryBean
的一个属性。
答案 0 :(得分:2)
FactoryBean是给定Spring bean类型的工厂。当Spring注入Foo
时,如果它在bean列表中找到类型为FactoryBean<Foo>
的bean,那么它会要求这个工厂创建一个Foo
,然后注入Foo
}。这允许延迟bean创建直到必要,并自定义其创建(例如,创建bean是一个复杂的过程,或需要自定义范围)。
阅读the javadoc和the 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开发人员有用。