spring在项目中实际用途
1、数据库连接池的托管、自动事务管理(不用在手动关闭session,和开启事务、持久化操作、提交事务)
2、aop的事务代理
spring管理事务一共有两种方式:
1、
<!-- 配置session工厂 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:Hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置hibernateTemplate -->
<bean name="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<!-- 读取sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 声明事务 -->
<bean name="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 读取sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 开启注解事务 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*"/>
<tx:method name="query*" read-only="true"/>
</tx:attributes>
</bean>
<!--注解可以被继承,可以添加到接口上
如果不配置<tx:advice transaction-manager="txManager"><!-- 通知注解事务管理-->
<tx:attributes>
<tx:method name="*"/>
<tx:method name="query*" read-only="true"/>
</tx:attributes>
则上图中@Transactional注解也不会起作用
-->
2、为单个bean配置事务(aop事务代理进行自动事务管理,自动数据库连接关闭)
<!-- 配置一个业务逻辑Bean -->
<bean id="test" class="com.spring.tranProxy.PersonDaoImpl">
<property name="ds" ref="dataSource" />
</bean>
<!-- 为业务逻辑Bean配置事务代理 -->
<bean id="testTrans"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 为事务代理工厂Bean注入事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<property name="target" ref="test" />
<!-- 指定事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">readOnly</prop>
</props>
</property>
</bean>
spring对数据库session的管理
观点:
1.使用getSession()返回session有两种情况。
a.当前线程有存在session,就直接返回。
b.当前线程中不存在session就重新创建一个。
如果spring配置了事务,那么session就不必关闭,在事务完成之后将被自动关闭。如果没有参与事务那就要调用session.close()关闭。
2.getSession()拿到的Session无论是否参与事务,Spring都不负责关闭,除非使用OpenSessionInView模式。