1、接口
package AOP.proxy;
/**
* Created by Administrator on 2019/6/11.
*/
public interface PersonDao {
public void savePerson();
}
2、目标实现类
package AOP.proxy;
/**
* Created by Administrator on 2019/6/11.
*/
public class PersonDaoImpl implements PersonDao {
@Override
public void savePerson() {
System.out.println("保存成功");
}
}
3、事物类
package AOP.proxy;
/**
* Created by Administrator on 2019/6/11.
*/
public class Transaction {
public void beginTransaction() {
System.out.println("开启事物");
}
public void Commit() {
System.out.println("提交事物");
}
}
4、代理类
package AOP.proxy;
/**
* Created by Administrator on 2019/6/11.
*/
public class PersonProxy implements PersonDao {
private PersonDao personDao;
private Transaction transaction;
public PersonProxy(PersonDao personDao,Transaction transaction) {
this.personDao = personDao;
this.transaction=transaction;
}
@Override
public void savePerson() {
/*开启事物
执行目标方法
事物提交
* */
transaction.beginTransaction();
personDao.savePerson();
transaction.Commit();
}
}
5、单元测试
package AOP.proxy;
import org.junit.Test;
/**
* Created by Administrator on 2019/6/11.
*/
public class ProxyTest {
@Test
public void ProxyTest() {
PersonDao personDao = new PersonDaoImpl();
Transaction transaction= new Transaction();
PersonProxy personProxy = new PersonProxy(personDao,transaction);
personProxy.savePerson();
}
}
6、结果
开启事物
保存成功
提交事物
7、总结
目标:操作hibernate的时候,不在每次save、update的时候,开启和提交事物。
1、静态代理模式并没有做到事物的重用
2、假如Dao层有100个类,100个proxy,接口中有多少个方法,在proxy层就要实现多少个方法,有多少个方法,就要开启和提交多个事物
3、如果一个proxy实现了多个接口,如果其中的一个借口发生变化(添加一个方法),那么proxy也要做相应的变化。