1.静态代理:代理类和被代理类继承同一个接口
被代理类:
public class IUserDao implements UserDao {
@Override
public void save() {
System.out.println("-------IUser 保存--------");
}
}
代理类:
public class StaticProxy implements UserDao{
private UserDao dao;
public StaticProxy(UserDao dao){
this.dao=dao;
}
@Override
public void save() {
System.out.println("静态代理开始");
dao.save();
System.out.println("静态代理结束");
}
}
测试:
public static void main(String[] args) {
IUserDao dao = new IUserDao();
StaticProxy proxy = new StaticProxy(dao);
proxy.save();
}
输出结果:静态代理开始
-------IUser 保存--------
静态代理结束
2.JDK动态代理:JDK的动态代理只能依靠接口实现,因为jdk重新封装的代理类继承了Proxy类。java单继承多实现
被代理类:
public class IUserService implements UserService,UserService2 {
@Override
public void save() {
System.out.println("IUserService save");
}
@Override
public void save2() {
System.out.println("IUserService save2");
}
}
处理类:
public class ProxyInvocationHandler implements InvocationHandler {
private Object target;
public ProxyInvocationHandler(Object target){
this.target=target;
}
@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 null;
}
}
测试:
public static void main(String[] args) {
//创建动态代理
ClassLoader classLoader = new IUserService().getClass().getClassLoader();//类加载器
Class<?>[] interfaces = new IUserService().getClass().getInterfaces();//对象所实现的接口
InvocationHandler handler = new ProxyInvocationHandler(new IUserService());//创造一个代理类的实例
Object proxy = Proxy.newProxyInstance(classLoader,interfaces,handler);
UserService userServiceProxy = (UserService)proxy;
userServiceProxy.save();
}
返回结果:----------开始代理------------
IUserService save
----------代理结束---------
3.Cglib动态代理:
被代理类:
public class UserService {
public void save(){
System.out.println("useservice save");
}
public void save2(){
System.out.println("userservice save2");
}
}
代理拦截器:
public class CGlibProxy implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("--------cglib before-------");
methodProxy.invokeSuper(o,objects);
System.out.println("--------cglib after-------");
return null;
}
}
测试:
public static void main(String[] args) {
Class userClass = new UserService().getClass();//代理类class
Enhancer enhancer = new Enhancer();//
enhancer.setSuperclass(userClass);
enhancer.setCallback(new CGlibProxy());
UserService service = (UserService)enhancer.create();
service.save();
}
输出:--------cglib before-------
useservice save
--------cglib after-------