先来解释一下 spring AOP是怎么实现事务的管理的
配置事务文件如下图:
dao 接口
dao 实现层
service 接口
service impl
测试代码:
public class BookTest {
public static void main(String[] args) throws Exception{
ApplicationContext app = new ClassPathXmlApplicationContext("applicationcontext.xml");
Book book = new Book();
book.setBookName("11");
BookService service = app.getBean(BookService.class);
service.saveBook(book);
System.out.println("ok");
}
}
public static void main(String[] args) throws Exception{
ApplicationContext app = new ClassPathXmlApplicationContext("applicationcontext.xml");
Book book = new Book();
book.setBookName("11");
BookService service = app.getBean(BookService.class);
service.saveBook(book);
System.out.println("ok");
}
}
我们通过app.getBean(BookService.class) 获取业务类,然后调用 saveBook(book) 方法,这样spring就能对 saveBook方法进行拦截 ,进行事务处理。
spring是怎么做的呢?
其实在这里 spring 是通过 AOP的动态代理机制来 实现事务的管理的。
app.getBean(BookService.class); 其结果返回的是一个代理类,该代理为saveBook添加了事务管理代码。如下:
public class Myproxy implements BookService {
private BookService bookService;
public Myproxy(BookService bookService){
this.bookService=bookService;
}
public void saveBook(Book book){
try{
// 启动事务代码;
bookService.saveBook(Book book);
// 提交事务代码
}catch(Exception e){
// 回滚操作
}
}
}