Spring整合Hibernate配置中LocalSessionFactoryBean注入SessionFactory原理问询
核心底层原理:Spring FactoryBean 接口机制
你观察到的矛盾本质是Spring对FactoryBean接口的特殊处理逻辑:
- Spring中所有实现了
org.springframework.beans.factory.FactoryBean接口的类,都会被容器当做特殊工厂Bean处理 - 当你向容器请求该Bean时,默认返回的是
FactoryBean接口定义的getObject()方法的返回值,而非FactoryBean本身的实例 LocalSessionFactoryBean刚好实现了FactoryBean<SessionFactory>接口,它的getObject()方法返回的就是标准的HibernateSessionFactory实例
对应你两种配置的具体运行逻辑
XML配置场景
你定义的id="sessionFactory"的Bean虽然class是LocalSessionFactoryBean,但容器对外暴露的实际Bean类型是SessionFactory,所以txManager里注入ref="sessionFactory"时,拿到的就是getObject()返回的SessionFactory实例,不存在类型不匹配问题。
Java配置场景
你在@Bean方法里返回LocalSessionFactoryBean时,Spring会自动识别它是FactoryBean,会在容器初始化阶段调用它的getObject()方法,将返回的SessionFactory注册为对应名称的Bean。所以你在transactionManager方法的入参声明SessionFactory类型时,容器会自动注入这个提前生成的SessionFactory实例,完全符合类型要求。
补充小知识
如果你确实需要获取LocalSessionFactoryBean本身的实例,可以在Bean名称前加&前缀获取,比如context.getBean("&sessionFactory")就能拿到LocalSessionFactoryBean的原生实例。
内容的提问来源于stack exchange,提问作者Summit2
相关产品推荐
相关产品推荐

