动态代理实现步骤
无论是jdk还是cglib还是静态代理 步骤都是一样 不过是生成代理对象时的方式不一样 jdk是通过类加载器 创建出来代理对象
cglib需要引入第三方的jar包 其实先逻辑是给被代理对象创建一个子类 在子类的方法上进行加强 在其重写的父类方法的时候 在调用父类的方法
jdk代理代码
private Object target;// 维护一个目标对象
public ProxyFactory(Object target) {
this.target = target;
}
// 生成要代理的对象的代理对象
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("事务开启");
try{
Object returnValue = method.invoke(target, args);
}catch(Exception es){
System.out.println("事务回滚");
}
System.out.println("事务提交");
return null;
}
});
}
测试
@Test
public void testCglibProxy(){
//目标对象
Dao target = new Dao();
System.out.println(target.getClass());
//代理对象
Dao proxy = (Dao) new ProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());
//执行代理对象方法
proxy.save();
}
cglib
private Object target;// 维护一个目标对象
public ProxyFactory(Object target) {
this.target = target;
}
// 为目标对象生成代理对象
public Object getProxyInstance() {。
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("事务开启");
try{
Object returnValue = method.invoke(target, args);
}catch(Exception es){
System.out.println("事务回滚");
}
System.out.println("事务提交");
return null;
}
});
}
测试
@Test
public void testDynamicProxy (){
Dao target = new Dao();
System.out.println(target.getClass()); //目标对象
IUserDao proxy = (Dao) new ProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass()); //代理对象
proxy.save(); //执行代理对象的
}
虽然jdk动态代理是基于反射完成的 但其效率不必cglib慢 spring中大部分使用的jdk动态代理
静态代理是基于动态代理衍生出的一种开发习惯
这里就不上代码 简单说一下思路
创建一个 静态代理工程 其构造需要一个代理对象的实现类作为参数 这个工厂需要与被代理对象实现同一个接口 重写其方法 在工厂重写的方法中调用被代理对象重写的方法 即可实现
自主学习 有不对的地方 请多多指教