Spring 3 MVC + Hibernate 3.5.x:SessionFactory的自动装配和依赖注入

时间:2014-04-26 04:54:23

标签: java spring hibernate spring-mvc dependency-injection

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

弹簧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;
}

表示sessionFactory的{​​{1}}类变量已初始化。

现在我的查询:

在我上面发布的代码中,类org.springframework.orm.hibernate3.HibernateTransactionManager的{​​{1}}如何初始化?我找不到sessionFactoryEmployeeDAOImpl.java(DI发生的地方)和sessionFactoryorg.springframework.orm.hibernate3.HibernateTransactionManager(我写的)之间的任何关系。那怎么工作呢?

请解释 - 完全糊涂!!!

1 个答案:

答案 0 :(得分:1)

<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>

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

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

@Autowired
private SessionFactory sessionFactory;

由于你已经在DAOImp中启用了annotation-config和component-scan并声明了@Autowired,这就是Spring知道正确注入会话工厂bean的地方的原因。

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

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

这是建议。

事务性注释最好放在服务层而不是DAO层。除非在组件扫描中使用interface-proxy,否则需要确保注释放在具体类上。

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

这条配置设置了事务管理器bean,它允许事务管理器知道它需要管理哪个会话工厂。

因此配置bean

ID =&#34; transactionManager的&#34;使用适当的hibernate会话工厂设置事务管理器。

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

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