Spring——JDK动态代理
动态代理
静态代理会为每一个业务增强都提供一个代理类, 由代理类来创建代理对象, 而动态代理并不存在代理类, 代理对象直接由代理生成工具动态生成.
JDK动态代理
- JDK动态代理是使用 java.lang.reflect 包下的代理类来实现. JDK动态代理动态代理必须要有接口.
- JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理,需要指定一个类加载器,然后生成的代理对象实现类的接口或类的类型,接着处理额外功能.
JDK动态代理制能对实现了接口的类生成代理,而不是针对类
//定义两个dao接口
public interface DeptDao {public int addDept();
public int updateDept();
}
//实现dao接口中的两个方法
public class DeptDaoImpl implements DeptDao{
public int addDept() {
System.out.println("添加部门到数据库中");
return 0;
}
public int updateDept() {
System.out.println("更新部门信息");
return 0;
}
}
实现代理
//jdk动态代理:代理类实现一个接口
public class DyProxy<T> implements InvocationHandler {
public DyProxy() {
}
public DyProxy(T target) {
this.target = target;
}
//声明属性:接收所代理的对象
private T target;
public T getTarget() {
return target;
}
public void setTarget(T target) {
this.target = target;
}
//执行invoke方法就是执行所代理对象的方法
//proxy:所代理的对象
//method:所要执行的方法
//args:要执行方法的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理对象执行的所代理对象的方法
//声明变量来存放执行代理对象方法的返回值
Object o=null;
System.out.println("动态代理开始执行……");
try {
o=method.invoke(target, args);
} catch (IllegalAccessException e) {
e.printStackTrace();
System.out.println("动态代理对象执行方法时发成异常");
} catch (IllegalArgumentException e) {
e.printStackTrace();
System.out.println("动态代理对象执行方法时发成异常");
} catch (InvocationTargetException e) {
e.printStackTrace();
System.out.println("动态代理对象执行方法时发成异常");
} finally {
System.out.println("动态代理执行结束!");
}
return o;
}
}
测试
public class TestProxy {
public static void main(String[] args) {
//创建代理对象
UserDaoProxy userDaoProxy=new UserDaoProxy();
//声明一个实现类
DeptDaoImpl ddi=new DeptDaoImpl();
//使用代理
InvocationHandler deptProxy=new DyProxy<DeptDaoImpl>(ddi);
DeptDao proxy= (DeptDao) Proxy.newProxyInstance(DeptDao.class.getClassLoader(),
new Class[]{DeptDao.class},
deptProxy);
proxy.addDept();
//还可以给UserDaoImpl做代理
UserDaoImpl udimpl=new UserDaoImpl();
InvocationHandler userProxy=new DyProxy<UserDaoImpl>(udimpl);
//把代理对象 和被代理的绑定在一起
UserDao proxy2=(UserDao)Proxy.newProxyInstance(UserDao.class.getClassLoader(),
new Class[]{UserDao.class},
userProxy);
proxy2.registerUser();
}
}
还没有评论,来说两句吧...