DaoImpl类:
public class PersonDaoImpl implements PersonDao{
@Override
public void savePerson() {
System.out.println("save person");
}
@Override
public void updatePerson() {
System.out.println("update person");
}
@Override
public void deletePerson() {
System.out.println("delete person");
}
@Override
public List<Person> getPerson() {
Person person = new Person();
person.setPid(1L);
person.setPname("aaa");
List<Person> personList = new ArrayList<Person>();
personList.add(person);
for(Person person2:personList){
System.out.println(person2.getPname());
}
return personList;
}
}
Transaction类:
public class Transaction {
public void beginTransaction(){
System.out.println("begin transaction");
}
public void commit(){
System.out.println("commit");
}
}
DaoInteceptor类:
public class PersonDaoInteceptor implements InvocationHandler{
private Transaction transaction;
private Object target;
public PersonDaoInteceptor(Transaction transaction,Object target){
this.transaction = transaction;
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
Object obj;
String methodName = method.getName();
if("savePerson".equals(methodName)||"updatePerson".equals(methodName)||"deletePerson".equals(methodName)){
this.transaction.beginTransaction();
obj = method.invoke(this.target, args); // 调用目标类的目标方法
this.transaction.commit();
}else{
obj = method.invoke(this.target, args); // 调用目标类的目标方法
}
return obj;
}
}
测试:
public class PersonDaoTest {
@Test
public void test(){
Transaction transaction = new Transaction();
PersonDao target = new PersonDaoImpl();
PersonDaoInteceptor inteceptor = new PersonDaoInteceptor(transaction, target);
PersonDao proxy = (PersonDao)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), inteceptor);
proxy.getPerson();
}
}
jdk动态代理说明:
目标类和代理类实现了共同的接口
拦截器必须实现InvocationHandler接口,而这个接口中invoke方法体的内容就是代理对象方法体的内容
当客户端用代理对象调用方法的时候,invoke方法执行