使用JDK动态代理的步骤:
1、写一个继承InvocationHandler接口的TransactionHandler(Handler类是用来添加要附加在被代理类上执行的逻辑;比如:做日志,定义事务边界,权限检查等)
public class TransactionHandler implements InvocationHandler {
private Object target;
public TransactionHandler(Object target) {
super();
this.target = target;
}
@Override
public void invoke(Object o, Method m) {
System.out.println("Transaction Start");
try {
m.invoke(target);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Transaction Commit");
}
}
2、jdk只能代理继承了接口的类;所以,第二步定义接口UserMgr和被代理类UserMgrImpl
package com.bjsxt.proxy.test;
public interface UserMgr {
void addUser();
}
package com.bjsxt.proxy.test;
public class UserMgrImpl implements UserMgr {
@Override
public void addUser() {
System.out.println("1: 插入记录到user表");
System.out.println("2: 做日志在另外一张表");
}
}
3、在客户端使用代理
public class Client {
public static void main(String[] args) throws Exception {
//new出被代理类
UserMgr mgr = new UserMgrImpl();
//new出Handler
InvocationHandler h = new TransactionHandler(mgr);
//由proxynew出代理类
UserMgr u = (UserMgr)Proxy.newProxyInstance(UserMgr.class,h);
//执行被代理内的逻辑时,会执行Handler中添加的逻辑
u.addUser();
}
}