说明
起初了解代理的时候并不了解它的实质作用,但是当对于一个大量的方法需要进行一个相同的处理时,我们的代码就会出现大幅度的重复,也会给后期维护带来及其巨大的困难,在这种情况下使用代理做增强显得极为便捷,以下内容仅展示一个简单的代理使用的小Demo,仅作为学习笔记。
// 首先设计接口
public interface UserDao {
void insert();
void delete();
void update();
void select();
}
/**
* 构造代理对象
* @author Lenovo
*/
public class DaoProxy implements InvocationHandler {
// 需要代理的目标对象
private Object target;
public DaoProxy(Object target) {
this.target = target;
}
// 生成一个代理对象并返回
public Object getDaoProxy() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
/**
* 代理内容,此处需要实现代理的逻辑
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 调用前增强
System.out.println("等待数据库服务...");
// 此处为调用原方法
Object result = method.invoke(target, args);
// 调用后增强
System.out.println("功能调用结束");
return result;
}
}
// 主方法
public class Main {
public static void main(String[] args) {
System.out.println("---------未作增强-----------");
UserDao userDao = new UserDaoImpl();
userDao.insert();
System.out.println("---------代理增强----------");
DaoProxy daoProxy = new DaoProxy(userDao);
UserDao userDaoProxy = (UserDao) daoProxy.getDaoProxy();
userDaoProxy.insert();
}
}
演示结果