在持久层DAO层中,对数据库操作有影响的增、删、改都需要开启事物,并在执行完增删改之后要提交事物。但如果每个方法都这样写的话,那么代码变显得冗余,采用动态代理的方式来实现这种需求的话,可以使代码更清晰简洁,并且将事物和数据操作解耦。下面是简单的模拟一下此案例,没有真正的数据库连接和事物,只是简单的模拟。
2 . Transaction.java
4. PersonDaoImpl.java
6. 测试类PersonDaoTest.java
7.结果
1.Person.java
package cn.it.spring.proxy.dao;
public class Person {
private Integer pid;
private String pnameString;
//省略set和get方法,还有构造函数
}
2 . Transaction.java
package cn.it.spring.proxy.dao;
/**
* 模拟事物类
* @author Administrator
*
*/
public class Transaction {
/**
* 开启事物
*/
public void beginTransaction(){
System.out.println("beginTransaction");
}
/**
* 提交事物
*/
public void commit(){
System.out.println("commit");
}
}
3. PersonDao.java
package cn.it.spring.proxy.dao;
import java.util.List;
public interface PersonDao {
public void savePerson();
public void deletePerson();
public void updatePerson();
public List<Person> getPersons();
}
4. PersonDaoImpl.java
package cn.it.spring.proxy.dao;
import java.util.ArrayList;
import java.util.List;
public class PersonDaoImpl implements PersonDao {
@Override
public void savePerson() {
System.out.println("savePerson");
}
@Override
public void deletePerson() {
System.out.println("deletePerson");
}
@Override
public void updatePerson() {
System.out.println("updatePerson");
}
@Override
public List<Person> getPersons() {
List<Person> persons = new ArrayList<>();
Person person1 = new Person(1, "person1");
Person person2 = new Person(2, "person2");
persons.add(person1);
persons.add(person2);
return persons;
}
}
5.MyInterceptor.java
package cn.it.spring.proxy.dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInterceptor implements InvocationHandler {
private Object target;
private Transaction transaction;
public MyInterceptor(Object target, Transaction transaction) {
super();
this.target = target;
this.transaction = transaction;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("savePerson")
|| method.getName().equals("deletePerson")
|| method.getName().equals("updatePerson")) {
//开启事物
transaction.beginTransaction();
method.invoke(target, args);//执行目标对象的目标方法
//提交事物
transaction.commit();
return null;
}else {
return method.invoke(target, args);
}
}
}
6. 测试类PersonDaoTest.java
package cn.it.spring.proxy.dao;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class PersonDaoTest {
@Test
public void test(){
Transaction transaction = new Transaction();
PersonDao target = new PersonDaoImpl();
MyInterceptor interceptor = new MyInterceptor(target, transaction);
PersonDao personDao = (PersonDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor);
personDao.deletePerson();
System.out.println("=============================");
personDao.savePerson();
System.out.println("=============================");
personDao.updatePerson();
System.out.println("=============================");
for(Person person : personDao.getPersons()){
System.out.println(person.getPnameString());
}
}
}
7.结果