1 JDK自带的动态代理
1.1 JDK动态代理要求
1.2 相关代码
1.2.1 代理对象代码
package com.zgd.learn.spring.proxy.jdk;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;
public class ObjectProxy implements InvocationHandler
{
private Object object;
public ObjectProxy(Object object)
{
this.object = object;
}
public Object createProxy()
{
Object proxy = Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),
this);
return proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
System.out.println("执行前处理...");
Object result = method.invoke(object, args);
System.out.println("执行后处理...");
return result;
}
}
1.2.2 被代理对象代码
public class UserDaoImpl implements UserDao
{
@Override
public void save()
{
System.out.println("UserDaoImpl save()");
}
}
1.2.3 测试类
@Test
public void testObjcetProxy()
{
UserDao userDao = new UserDaoImpl();
UserDao proxy = (UserDao) new ObjectProxy(userDao).createProxy();
proxy.save();
}
1.2.4 运行结果
执行前处理...
UserDaoImpl save()
执行后处理...
2 cglib动态代理
2.1 cglib要求
- 可以代理没有实现接口的类,实质是产生一个被代理类的子类,所以被代理类和方法不能有final修饰
- 需要导包:cglib.jar
- final修饰的类,不能被动态代理,会产生java.lang.IllegalArgumentException: Cannot subclass final class
- 代理非final类,执行final方法,则不会产生代理效果,但不抛异常
2.2 相关代码
2.2.1 cglib的代理代码
package com.zgd.learn.spring.proxy.cglib;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor
{
public Object object;
public CglibProxy(Object object)
{
this.object = object;
}
public Object creatProxy()
{
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(object.getClass());
enhancer.setCallback(this);
Object proxy = enhancer.create();
return proxy;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
{
System.out.println("执行前处理...");
Object result = methodProxy.invoke(object, args);
System.out.println("执行后处理...");
return result;
}
}
2.2.2 被代理对象代码
public class UserService
{
public void save()
{
System.out.println("UserService save()");
}
}
2.2.3 测试类
@Test
public void testCglibProxy()
{
UserService userService = new UserService();
UserService proxy = (UserService) new CglibProxy(userService).createProxy();
proxy.save();
}
2.2.4 运行结果
执行前处理...
UserService save()
执行后处理...