我是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}}如何初始化?我找不到sessionFactory
类EmployeeDAOImpl.java
(DI发生的地方)和sessionFactory
类org.springframework.orm.hibernate3.HibernateTransactionManager
(我写的)之间的任何关系。那怎么工作呢?
请解释 - 完全糊涂!!!
答案 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:注释驱动的配置在代码级别启用基于注释的事务管理器。
希望这些解释对你有所帮助。 :)