静态代理:
代理和被代理对象在代理之前是确定的,他们都实现相同的接口或继承相同的抽象类
public interface Hello {
void say(String name);
}
····························································
public class HelloImpl implements Hello {
public void say(String name) {
System.out.println("Hello " + name);
}
}
····························································
public class HelloProxy implements Hello {
private Hello hello;
public HelloProxy(Hello hello) {
this.hello = hello;
}
public void before() {...}
public void after() {...}
public void say(String name) {
before();
this.hello.say(name);
after();
}
}
····························································
public class Test {
public static void main(String[] args) {
Hello hello = new HelloImpl();
HelloProxy helloProxy = new HelloProxy(hello);
helloProxy.say("proxy");
}
}
//Before
//Hello proxy
//After
JDK动态代理:
被代理对象需要实现一组interface,代理类必须实现InvocationHandler
接口
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target, args);
after();
return result;
}
public void before() {...}
public void after() {...}
}
····························································
public class Test {
public static void main(String[] args) {
Hello hello = new HelloImpl();
DynamicProxy dynamicProxy = new DynamicProxy(hello);
Hello helloDynamicProxy = (Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), dynamicProxy);
helloDynamicProxy.say("DynamicProxy");
}
}
//Before
//Hello DynamicProxy
//After
CGlib动态代理:
对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
public class CGLibProxy implements MethodInterceptor {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
before();
Object result = methodProxy.invokeSuper(o, objects);
after();
return result;
}
public void before() {...}
public void after() {...}
}
····························································
public class Test {
public static void main(String[] args) {
CGLibProxy cgLibProxy = new CGLibProxy();
Hello helloCglibProxy = (Hello) Enhancer.create(HelloImpl.class, cgLibProxy);
helloCglibProxy.say("CGLibProxy");
}
}
//Before
//Hello CGLibProxy
//After