<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 配置属性占位符配置器 -->
<bean id="placeHolder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<!-- 配置DBCP数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.mysql.className}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.user}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</bean>
<!--
配置SessionFactory,如果Hibernate的映射方式采用注解,那么SessionFactory对象的bean为AnnotationSessionFactoryBean
如果映射文件采用的是.hbm.xml可以使用该bean也可以使用LocalSessionFactoryBean
-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<!-- 配置Hibernate属性,如二级缓存的开启关闭,查询缓存的开启关闭、数据库方言等 -->
<props>
<prop key="hibernate.dialect">${jdbc.mysql.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/sms/entity/Student.hbm.xml</value>
<value>com/sms/entity/Course.hbm.xml</value>
<value>com/sms/entity/Teacher.hbm.xml</value>
</list>
</property>
</bean>
<!-- 1.配置Hibernate事务管理器 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 2.事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="do*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 3.哪些类哪些方法使用事务 -->
<aop:config>
<aop:pointcut id="allServiceMethod" expression="* com.sms.service.impl.*Impl.*(..)"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allServiceMethod"/>
</aop:config>
<!-- 配置HibernateTemplate以简化Hibernate应用的开发-->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
execution(* com.sms.service.impl.*Impl.*(..))
表示com.sms.service.impl包下所有的类的所有方法。
第一个*代表所有的返回值类型。
第二个*代表所有的以Impl结尾的类
第三个*代表类所有的方法
最后一个代表所有的参数。
xml配置文件说明~!
实施事务的步骤
1.定义资源,DataSource
2.定义事务管理器(定义资源的事务)
3.定义事务通知:定义如何实施事务(实施事务的方法名和对应的事务属性)
需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性。
4.定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象(一定是业务逻辑层)
5.Spring织入事务通知到目标对象(AOP代理)
环绕通知
Before: 开启事务
业务逻辑
After: 提交或回滚事务
本质
1.利用模板设计模式+aop将不可以变的事务管理提取出去。
2.利用环绕通知实施事务的开启和关闭。
3.需要Spring一致的异常体系支持。