事务是spring框架中一个核心的模块,事务的ACID特性想必对于学习java的同学来说都不陌生,对于spring,实现事务的底层原理其实很简单,就是通过AOP代理进行实现,而实现spring的AOP更底层的,就是使用反射机制完成的;
举例来说,当你的方法上标注了@Service之后,spring怎么知道你这个类会被纳入到整个bean的容器中进行管理呢?如果在这个类下面的某个方法上面加了@Transactionnal注解,spring怎么知道要为你的这个方法开启一个事务管理器呢?说到底,反射在这里就派上用场了,总体来说,就是通过反射,匹配类上的注解,再去匹配方法上的注解,只要找到了相应的注解,就开启相应的特性,就是这么简单,
关于spring事务,常见的有两种,一种是编程式事务,比如java代码使用Jdbc进行数据库操作而没有引入其他框架时,就需要通过手动编写事务进行处理,另一种就是我们熟知的使用spring框架,帮助我们管理事务,比如像我们在xml配置文件中,通过配置扫描包和事务管理器,就可以对相关的类进行事务管理了,下面来演示一下采用编程式事务来学习一下spring的事务特性,了解了编程式事务,xml的事务就不是难事了,
项目结构非常简单,就是几个包和一个spring的配置文件,
1、pom依赖,主要是spring相关的依赖,
5.1.2.RELEASEUTF-8UTF-81.8 org.springframework spring-core ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-aop ${spring.version} org.springframework spring-orm ${spring.version} org.aspectj aspectjrt 1.6.1 org.aspectj aspectjweaver 1.9.2 cglib cglib 3.2.10 com.mchange c3p0 0.9.5.2 mysql mysql-connector-java 5.1.40 dom4j dom4j 1.6.1
2、spring的基本配置文件,这里为了模拟原生的事务,直接配置的是 JdbcTemplate
xml version="1.0" encoding="UTF-8"?>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http: