java - Spring 3 MVC + hibernate 3.5.x : Autowiring and Dependency Injection of SessionFactory

标签 java spring hibernate spring-mvc dependency-injection

我是 Spring 框架的新手;需要澄清 SessionFactory 对象依赖注入(inject)在下面的代码中如何工作。

spring-servlet.xml

<context:annotation-config />
<context:component-scan base-package="com.employee" />

<bean id="jspViewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/jdbc.properties" />

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
    p:password="${jdbc.password}" />


<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:employee.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven />
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

EmployeeDAOImpl.java

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class EmployeeDAOImpl implements EmployeeDAO {

@Autowired
private SessionFactory sessionFactory;

@Override
public void addEmployee(EmployeeForm employee) {
    sessionFactory.getCurrentSession().save(employee);
}
}

这里如何使用 SessionFactory 对象初始化 sessionFactory?

我的理解

sprng-servlet.xml文件中,sessionFactory的DI发生在以下代码中:

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

现在,如果我打开类 org.springframework.orm.hibernate3.HibernateTransactionManager 的源代码,那么我可以看到以下部分:

private SessionFactory sessionFactory;
public HibernateTransactionManager(SessionFactory sessionFactory){
    this.sessionFactory = sessionFactory;
    afterPropertiesSet();
}

public void setSessionFactory(SessionFactory sessionFactory){
    this.sessionFactory = sessionFactory;
}

public SessionFactory getSessionFactory(){
    return this.sessionFactory;
}

这意味着org.springframework.orm.hibernate3.HibernateTransactionManagersessionFactory类变量已经被初始化。

现在我的查询:

在我上面发布的代码中,EmployeeDAOImpl.java 类的 sessionFactory 是如何初始化的?我找不到类 org.springframework.orm.hibernate3.HibernateTransactionManager (发生 DI 的地方)的 sessionFactorysessionFactory 之间的任何关系> 类EmployeeDAOImpl.java(我写的)。那么它是如何工作的呢?

请解释一下 - 完全困惑!!!

最佳答案

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:employee.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

您已在上下文文件中定义了 session 工厂 bean。在应用程序引导期间,将加载 spring 上下文,并且该 session 工厂 bean 由 spring 初始化为单例实例。

<context:annotation-config /> 
<context:component-scan base-package="com.employee" />

@Autowired
private SessionFactory sessionFactory;

既然您已经启用了注释配置和组件扫描并在 DAOImp 中声明了 @Autowired,这就是 Spring 知道正确注入(inject) session 工厂 bean 的位置的原因。

此配置启用事务管理器注释。 示例:

@Transactional
public void addEmployee(EmployeeForm employee){...}

这是建议。

事务注释最好放在服务层而不是 DAO 层。您需要确保将注释放置在具体类上,除非您在组件扫描中使用接口(interface)代理。

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

这段配置设置了事务管理器 bean,它让事务管理器知道它需要管理哪个 session 工厂。

因此bean的配置

id="transactionManager"使用正确的 hibernate session 工厂设置事务管理器。

tx:annotation-driven 配置在代码级别启用基于注释的事务管理器。

希望这个解释对你有帮助。 :)

关于java - Spring 3 MVC + hibernate 3.5.x : Autowiring and Dependency Injection of SessionFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23306791/

相关文章:

java - × 274612 使用 Java 应用程序在文本区域上检索和显示 Sql 数据库数据

java - Elasticsearch 从所有文档中获取某个字段的值

java - Spring - 如果存在主 bean,则不要创建 bean

java - Spring /hibernate : Bidirectional Mapping without synchronization for JPQL queries only

java - Hibernate 在保存对象时生成 mysql 错误

java - 通过示例检查 Spring 性能和瓶颈的工具

java - 在方法中使用泛型类型信息

java - 使用 opencv 进行人脸检测时出现异常

mysql - 从 Spring 项目连接到 MySQL 数据库

Spring Cloud(Brixton RC2)eureka + feign或rest模板配置不起作用