写在前面
:虽然使用注解方式配置事务控制很简单,用起来也很爽,但是在每个方法前都加上@xxx形式的注解,显然并不美观,也不利于代码的规范与维护,所以XML的配置方式是才是重点。
一、基于注解的事务控制
基于注解配置事务控制,相较XML配置来说更加简单,但仍需要XML提供依赖,不能完全摆脱XML。前期准备工作和XML配置大同小异,这里不做赘述,建议学习基于注解配置前先学习XML配置事务控制。
这里给出本次测试的全部XML配置,具体细节在后面依次介绍。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 配置c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybase2" />
<property name="user" value="root" />
<property name="password" value="Hudie" />
</bean>
<!-- 配置JdbcTemplate模板对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置service层 -->
<bean id="userService" class="com.gql.service.UserServiceImp">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- 配置dao层 -->
<bean id="userDao" class="com.gql.dao.UserDaoImp">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入 DataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 注解扫描器 -->
<context:component-scan base-package="com.gql.service"></context:component-scan>
<!-- 注解的事务配置 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
1.配置事务管理器
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入 DataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
2.在业务层使用@Transactional 注解
只需要在业务层实现类上加上@Transactional即可。
该注解的属性和 xml 中的属性含义一致。该注解可以出现在接口上,类上和方法上。
- 出现接口上,表示该接口的所有实现类都有事务支持。
- 出现在类上,表示类中所有方法有事务支持
- 出现在方法上,表示方法有事务支持。
- 以上三个位置的优先级:方法>类>接口
package com.gql.service;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;
import com.gql.dao.UserDao;
import com.gql.entity.User;
/**
* 类说明:
* 业务层实现类
* @guoqianliang1998.
*/
@Transactional
public class UserServiceImp implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save(User user) {
userDao.save(user);
int i = 1/0;
}
@Override
public void update(int id, User user) {
userDao.update(id, user);
}
@Override
public void delete(int id) {
userDao.delete(id);
}
@Override
public User getUser(int id) {
User user = userDao.getUser(id);
return user;
}
@Override
public List<User> getUserList(int[] ids) {
List<User> userList = userDao.getUserList(ids);
return userList;
}
@Override
public List<User> getUserList() {
List<User> list = userDao.getUserList();
return list;
}
}
3.开启 spring 对注解事务的支持
<!-- 开启 spring 对注解事务的支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
4.注解扫描器
<!-- 注解扫描器 -->
<context:component-scan base-package="com.gql.service"></context:component-scan>
转载:https://blog.csdn.net/weixin_43691058/article/details/104168944
查看评论