Spring代理模式——动态代理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Heavy_Dream/article/details/79954097
2、动态代理
代理对象不需要实现接口
代理对象生成,使用到JDKAPI,动态的在内存中创建代理对象
动态代理,也叫JDK代理,接口代理

API中:
Proxy
public static Object newProxyInstance(ClassLoader loader,指定当前目标对象的使用类的加载器
                                          Class<?>[] interfaces,目标对象实现的接口类型
                                          InvocationHandler h)事件处理器
目标对象一定要实现接口,否则不能够使用动态代理
代理对象class $Proxy0 implement xxx(接口类)来完成的


假如有一个目标对象没有继承接口,那可以用Cglib


接口:

package edu.cloud.dynamic;


public interface IUserDao {
public void save() throws Exception;

public void update() throws Exception;

}

目标对象:

package edu.cloud.dynamic;


/**
 * 目标对象
 * @author huangbaida
 * @description 
 * @date 2018年1月23日
 */
public class UserDao implements IUserDao {


@Override
public void save() throws Exception {
//System.out.println("----开启事务----"); //想扩展得修改目标对象的源代码,不方便
System.out.println("----数据保存----");
}


@Override
public void update() throws Exception {
System.out.println("----数据已经修改----");
}


}

代理对象:

package edu.cloud.dynamic;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class ProxyFactory {
//目标对象
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("开启事务");

//调用目标对象的方法
Object result = method.invoke(target, args);

System.out.println("提交事务");

return result;
}
}
);

}

}

测试:

package edu.cloud.dynamic;


public class Test {


public static void main(String[] args) {
//目标对象
UserDao target = new UserDao();

//代理对象
//class com.sun.proxy.$Proxy0 内存中动态生成代理对象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();

try {
proxy.save();
proxy.update();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//$Proxy0输出它的类类型看看
System.out.println(proxy.getClass());
}


}



猜你喜欢

转载自blog.csdn.net/Heavy_Dream/article/details/79954097
今日推荐