代理模式的定义(应用场景):
1.不直接访问真实的引用目标对象
2.对引用目标对象进行业务扩展
优点:1.不需要目标对象的现有业务逻辑的基础下,对目标对象进行扩展
2. 解耦
缺点:1.客户端和目标对象之间增加一个代理对象,可能导致请求变慢
2.导致额外的类生成
3.增加了系统的复杂性
静态代理:在程序运行前代理类的字节码文件就已经生成
动态代理:1.基于JAVA的反射机制-JDK动态代理
2.基于JAVA底层的字节码技术-CGLIB动态代理
//业务接口
public interface IRealTarget {
void Request();
}
//业务逻辑实现
public class RealTarget implements IRealTarget {
@Override
public void Request() {
System.out.println("============RealTarget 业务逻辑中");
}
}
//静态代理
public class MyProxy implements IRealTarget {
@Override
public void Request() {
this.preRequest();
new RealTarget().Request();//真实对象
this.postRequest();
}
private void preRequest() {
//TODO
System.out.println("==========代理类的前置处理");
}
private void postRequest() {
//TODO
System.out.println("==========代理类的后置处理");
}
public static void main(String[] args) {
//TEST 1
new MyProxy().Request();
}
}
package com.cloud.Proxy;
import java.lang.reflect.Proxy;
public class MyProxy implements IRealTarget {
@Override
public void Request() {
this.preRequest();
new RealTarget().Request();//真实对象
this.postRequest();
}
public void preRequest() {
//TODO
System.out.println("==========代理类的前置处理");
}
public void postRequest() {
//TODO
System.out.println("==========代理类的后置处理");
}
public static void main(String[] args) {
//TEST 1
// new MyProxy().Request();
//TEST 2
IRealTarget realTargetProxy = (IRealTarget) MyProxy.newProxyInstance(new RealTarget());
System.out.println(realTargetProxy.getClass().getName());
realTargetProxy.Request();
}
//匿名内部类实现 或者 实现InvocationHandler.invoke()
public static Object newProxyInstance(Object realTarget) {
return Proxy.newProxyInstance(realTarget.getClass().getClassLoader(), realTarget.getClass().getInterfaces(), (proxy, method, args) -> {
new MyProxy().preRequest();//前置处理
Object object = method.invoke(realTarget, args);
new MyProxy().postRequest();//后置处理
return object;
});
}
}
package com.cloud.Proxy; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class MyProxy implements IRealTarget { static { System.out.println("====================静态代码块===================="); } @Override public void Request() { this.preRequest(); new RealTarget().Request();//真实对象 postRequest(); } public void preRequest() { //TODO System.out.println("==========代理类的前置处理"); } public static void postRequest() { //TODO System.out.println("==========代理类的后置处理"); } public static void main(String[] args) { //TEST 1 // new MyProxy().Request(); //TEST 2 // IRealTarget realTargetProxy = (IRealTarget) MyProxy.newProxyInstance(new RealTarget()); // System.out.println(realTargetProxy.getClass().getName()); // realTargetProxy.Request(); //TEST 3 IRealTarget realTargetProxy = CglibProxy.newProxyInstance(RealTarget.class); System.out.println(realTargetProxy.getClass().getName()); realTargetProxy.Request(); } //JDKProxy:匿名内部类实现 或者 实现InvocationHandler.invoke() // public static Object newProxyInstance(Object realTarget) { // return Proxy.newProxyInstance(realTarget.getClass().getClassLoader(), realTarget.getClass().getInterfaces(), (proxy, method, args) -> { // { // System.out.println("====================代码块===================="); // } // new MyProxy().preRequest();//前置处理 // Object object = method.invoke(realTarget, args); // postRequest();//后置处理 // return object; // }); // } } //CGLIB:实现MethodInterceptor.intercept() class CglibProxy implements MethodInterceptor { public static <T extends IRealTarget> IRealTarget newProxyInstance(Class<T> targetClazz) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(targetClazz); enhancer.setCallback(new CglibProxy()); return (IRealTarget) enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { new MyProxy().preRequest();//前置处理 Object object = proxy.invokeSuper(obj, args); MyProxy.postRequest();//后置处理 return object; } }