gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:05:18 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com