1 Spring的声明式事务使用步骤(XML版本):
给当前项目增加Spring事务依赖包spring-tx.jar
2 给Spring的配置文件增加事务的头部文件声明
前xmlns:tx="http://www.springframework.org/schema/tx"
后http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
3 配置事务管理器
<!-- 配置spring的事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTranscationManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
4 配置声明式事务的规则
<!-- 配置事务管理策略 transaction-manager="transactionManager的值和事务管理器的id保持一致 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<!-- 配置具体的策略 -->
<tx:attributes>
<!-- 增删改查的方法 timeout="10"超时时间,-1指的是无限 rollback-for遇到?允许回滚-->
<tx:method name="get*" propagation="REQUIRED" timeout="10"/>
<tx:method name="add*" propagation="REQUIRES_NEW" rollback-for="SQLException"/>
<tx:method name="update*" propagation="REQUIRED" timeout="10"/>
<tx:method name="delte*" propagation="REQUIRED" timeout="10"/>
</tx:attributes>
</tx:advice>
5 事务的增强处理:
<!-- 事务策略的配置应用 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* com.oupeng.service..*.*(..))" id="p1"/>
<!-- 增强处理 -->
<aop:advisor advice-ref="txadvice" pointcut-ref="p1"/>
</aop:config>
6 测试
@Test
public void test1() {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
List<User> list=new ArrayList();
UserService us=(UserService) context.getBean("userService1");
User user=new User();
user.setUserName("赵");
user.setUserRole(2);
list=us.findUserList(user);
for(User u:list){
System.out.println(u.getUserCode()+"\t"+u.getUserName()+"\t"+u.getAddress()+"\t"+u.getUserRoleName());
}
}
2 Spring声明式事务的注解版本:
注释掉上文配置事务管理策略、事务的增强处理配置
1 给业务类增加注解 @Transactional
2 给业务类的方法增加具体的注解策略: @Transactional(propagation=Propagation.REQUIRED)
package com.oupeng.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.oupeng.dao.UserMapper;
import com.oupeng.pojo.User;
import com.oupeng.service.UserService;
@Transactional
@Service("userService1")
public class UserServiceImpl implements UserService {
//注入数据访问层依赖(写接口松耦合,面向接口编程)
@Autowired
private UserMapper userMapper;
@Transactional(propagation = Propagation.REQUIRED)
public UserMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public List<User> findUserList(User user) {
return userMapper.getUserList(user);
}
@Override
public boolean addNewUser(User user) {
int result=userMapper.add(user);
return result>0;
}
}
3 在spring的配置文件启用事务的注解支持:
<!--启用事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
3 XML版本和注解事务的分析:
xml版本:集中配置事务管理,利于后期软件的维护,配置工作量偏大,影响配置文件的可阅读性
注解版:使用简单、小巧、灵活,缺陷:和java代码糅合到一块,硬编码,不利于后期的维护
4 Spring的自动装配:
- 按照类型自动装配
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 构造注入sqlSessionFactory -->
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
<bean id="userService" class="com.oupeng.service.impl.UserServiceImpl" autowire="byType">
<!-- 完成数据访问层对象的注入 -->
<property name="userMapper" ref="userMapper"></property>
<!-- <property name="userMapper" ref="userMapperProxy"></property> -->
</bean>
- 按照名称自动装配
<bean id="userService" class="com.oupeng.service.impl.UserServiceImpl" autowire="byName">
<!-- 完成数据访问层对象的注入 -->
<property name="userMapper" ref="userMapper"></property>
<!-- <property name="userMapper" ref="userMapperProxy"></property> -->
</bean>
...http://www.springframework.org/schema/tx/spring-tx-3.2.xsd" default-autowire="byname">
5 数据源优化配置:
<!-- 配置数据源方式2 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="Location">
<value>classpath:database.properties</value>
</property>
</bean>
<bean id="dataSource1"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="username" value="${jdbc.username}"></property>
</bean>
<!-- jndi配置 -->
<!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
注入jndi的数据源名 <property name="jndiName"> <value> java:comp/env/jdbc/smbms </value>
</property> </bean> -->
6 Spring配置文件的拆分:
为什么拆分:项目配置需要的信息过多,不利于配置文件的配置、容易引起错误,影响可阅读性
拆分的方式:
按照系统的功能模块拆分:
applicationContext-user.xml
applicationContext-provider.xml
applicationContext-bill.xml
按照多层开发思想拆分:
范例:
加载引入到applicationContext.xml
<!-- 加载拆分的配置文件 -->
<import resource="applicationContext-dao.xml"/>
<import resource="applicationContext-service.xml"/>
<!-- 配置数据源 -->
数据访问层拆分配置(applicationContext-dao.xml)
<?xml version="1.0" encoding="UTF-8"?>
<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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd" default-autowire="byType">
<!-- 配置数据访问层组件 -->
<bean id="userMapper" class="com.oupeng.dao.impl.UserMapperImpl">
<!-- 注入sqlSessionTemplate -->
<property name="sqlSession" ref="sqlSessionTemplate"></property>
</bean>
</beans>
业务逻辑层拆分配置(applicationContext-service.xml)
<?xml version="1.0" encoding="UTF-8"?>
<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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"
default-autowire="byType">
<!-- 业务逻辑层组件 -->
<bean id="userService" class="com.oupeng.service.impl.UserServiceImpl"
autowire="byName">
<!-- 完成数据访问层对象的注入 -->
<!-- <property name="userMapper" ref="userMapper"></property> <property
name="userMapper" ref="userMapperProxy"></property> -->
</bean>
</beans>