创建接口
public interface UserDao {
public void addUser();
public void deleteUser();
public void update();
public void select();
}
创建接口实现类 --> 真实对象
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("添加用户信息");
}
@Override
public void deleteUser() {
System.out.println("删除用户信息");
}
@Override
public void update() {
System.out.println("修改用户信息");
}
@Override
public void select() {
System.out.println("查询用户信息");
}
}
代理类 --> 暂时没有,由代理类调用处理程序动态生成
增强方法
public class MyLog {
public void start(String msg) {
System.out.println("开始执行" + msg + "方法");
}
public void end(String msg) {
System.out.println(msg + "执行结束");
}
}
代理类的调用处理程序
- 实现InvocationHandler接口
- 声明一个对象(用于注入被代理的对象)
- 利用构造方法,将真实对象注入
- 实现invoke方法
- 在 invoke 方法中执行真实对象的方法,并且可以进行增强
- 可在调用处理程序添加获取代理对象的方法(工具方法)
public class JDKDynamicProxy implements InvocationHandler {
private Object target;
public JDKDynamicProxy() {
}
public JDKDynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyLog log = new MyLog();
log.start(method.getName());
Object res = method.invoke(target, args);
log.end(method.getName());
return res;
}
public Object getProxy() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
测试
- 创被代理的真实对象
- 代理对象的调用程序 --> 将真实对象注入
- 获取代理对象
- 代理对象为真实对象进行代理
public class MyTest {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
JDKDynamicProxy handler = new JDKDynamicProxy(userDao);
UserDao proxy = (UserDao) handler.getProxy();
proxy.addUser();
proxy.deleteUser();
proxy.update();
proxy.select();
}
}
在来一个真实对象
public class UserDaoMySQLImpl implements UserDao {
@Override
public void addUser() {
System.out.println("MySQL添加用户信息");
}
@Override
public void deleteUser() {
System.out.println("MySQL删除用户信息");
}
@Override
public void update() {
System.out.println("MySQL修改用户信息");
}
@Override
public void select() {
System.out.println("MySQL查询用户信息");
}
}
复用代理对象调用处理程序
直接测试
public class MySQLTest {
public static void main(String[] args) {
UserDaoMySQLImpl userDaoMySQL = new UserDaoMySQLImpl();
JDKDynamicProxy handler = new JDKDynamicProxy(userDaoMySQL);
UserDao proxy = (UserDao) handler.getProxy();
proxy.addUser();
proxy.deleteUser();
proxy.update();
proxy.select();
System.out.println("---------------------------------------");
UserDaoImpl userDao = new UserDaoImpl();
JDKDynamicProxy handler1 = new JDKDynamicProxy(userDao);
UserDao proxy1 = (UserDao) handler1.getProxy();
proxy1.addUser();
}
}