这些天我看了一下《Spring FrameWork开发手册》这个技术文档,我翻阅了里面事务管理,现在在这里写下来,以后翻阅的时候可以复习一下:
个人认为Spring框架主要在于它的IOC和AOP以及事务管理,这里有时间再去介绍IOC和AOP,在Spring中事务管理可以有两种方式来进行:
1、声明式事务管理(基于注解)
2、编程式事务管理(基于xml)
大多时候都应该选择声明式事务管理,这对我们的业务代码影响最小,符合非入侵式编程。
一、声明式事务管理
Spring的声明式事务管理是通过SpringAOP实现的,Spring的声明式事务管理可以被应用到任何类(以及那个类的实例上),Spring提供了声明式的回滚规则,Spring允许你通过AOP定制事务行为。在理解Spring的声明式事务管理方面最重要的概念是:Spring事务管理是通过AOP实现的,其中的事务通知由元数据(目前基于XML或注解)驱动,代理对象与事务元数据结合产生了一个AOP代理,它使用一个PlatFormTransactionManager实现配合TranSactionInterceptor,在方法调用前后实施事务。
案例:
用maven创建一个项目名为transactionalAnnotation的项目,这里就简单的写一下:
pom.xml:
4.0.0
com.ry
transactionalAnnotation
war
0.0.1-SNAPSHOT
transactionalAnnotation Maven Webapp
http://maven.apache.org
4.2.4.RELEASE
junit
junit
3.8.1
test
org.springframework
spring-core
${springframework}
org.springframework
spring-beans
${springframework}
org.springframework
spring-web
${springframework}
org.springframework
spring-webmvc
${springframework}
org.springframework
spring-aop
${springframework}
org.springframework
spring-tx
${springframework}
org.springframework
spring-orm
${springframework}
org.springframework
spring-jdbc
${springframework}
junit
junit
4.11
test
cglib
cglib
2.2.2
org.aspectj
aspectjrt
1.8.10
aopalliance
aopalliance
1.0
org.aspectj
aspectjweaver
1.8.8
c3p0
c3p0
0.9.1.2
mysql
mysql-connector-java
5.1.30
transactionalAnnotation
在resource里面创建数据库配置文件jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm
jdbc.username=root
jdbc.password=root
接着创建spring-application.xml:
当然web.xml也必须配置
Archetype Created Web Application
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-*.xml
1
springmvc
/
创建StudentService.java:
public interface StudentService{
//基本业务 这里就不给参数了
public void addStu();
public void updateStu();
public List selectStu();
public int deleteStu();
}
创建StudentServiceImpl.java:
@Transactional
public class StudentServiceImpl implements StudentService {
// 事务:完成多个操作,只要一个中断或退出,其他操作的结果就不会被确认。即:一个整体性的操作
//为了测试事务 在这里抛出异常,阻止事务的继续进行
@Override
public void addStu() {
throw new NullPointerException();
}
@Override
public void updateStu() {
throw new NullPointerException();
}
@Override
public List selectStu() {
throw new NullPointerException();
//这里 抛出异常后 不要再加return了,不然会报错,不能通过编译
}
@Override
public int deleteStu() {
throw new NullPointerException();
}
}
接下来写一个测试:
public class TransactionTest {
@org.junit.Test
public void Test(){
ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:spring-application.xml");
StudentService stu =(StudentService) ac.getBean("studentService");
stu.selectStu();
}
}
结果是会报空指针异常,当然如果你在ServiceImpl里面添加业务方法,由于空指针异常,这时事务会发生回滚。
二、编程式事务管理
编程式事务管理是基于xml的形式,与AOP一起结合使用,下面看一下实例:
使用maven创建项目transactional,maven的pom.xml配置以及其他的配置同上,主要是spring-application.xml里面的内容不同:
这种是基于xml的配置。实际上在开发过程中会更加复杂,这里只是简单的介绍一下如何配置。