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. PersonDaoImpl.java
package cn.it.spring.proxy.dao;
import java.util.ArrayList;
import java.util.List;
//此處沒有實現PersonDao接口
public class PersonDaoImpl{
public void savePerson() {
System.out.println("savePerson");
}
public void deletePerson() {
System.out.println("deletePerson");
}
public void updatePerson() {
System.out.println("updatePerson");
}
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;
}
}
4.MyInterceptor.java
package cn.it.spring.proxy.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class MyInterceptor implements MethodInterceptor{
private Object target;
private Transaction transaction;
public MyInterceptor(Object target, Transaction transaction) {
super();
this.target = target;
this.transaction = transaction;
}
/**
* 產生代理對象
*/
public Object createProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setCallback(this);//回調函數 攔截器
enhancer.setSuperclass(this.target.getClass());//設置代理對象的父類
return enhancer.create();
}
@Override
public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
if(method.getName().equals("updatePerson")
||method.getName().equals("savePerson")
||method.getName().endsWith("deletePerson")){
transaction.beginTransaction();
method.invoke(target, arg2);//目標對象的目標方法
transaction.commit();
return null;
}else{
return method.invoke(this.target, arg2);//目標對象的目標方法
}
}
}
5. 測試類PersonDaoTest.java
package cn.it.spring.proxy.cglib;
import org.junit.Test;
public class PersonDaoImplTest {
@Test
public void test(){
PersonDaoImpl target = new PersonDaoImpl();
Transaction transaction = new Transaction();
MyInterceptor interceptor = new MyInterceptor(target, transaction);
PersonDaoImpl proxy = (PersonDaoImpl) interceptor.createProxy();
proxy.savePerson();
System.out.println("=============================");
proxy.deletePerson();
System.out.println("=============================");
proxy.updatePerson();
System.out.println("=============================");
for(Person person : proxy.getPersons()){
System.out.println(person.getPnameString());
}
}
}
6.結果