1. 程式人生 > 其它 >3.後臺配置、環境變數、日誌、異常處理、二次封裝Response、路由元件

3.後臺配置、環境變數、日誌、異常處理、二次封裝Response、路由元件

CGLIB動態代理

  • CGLib使用位元組碼技術生成代理類,在JDK1.6之前比java反射效率高,到jdk1.8的時候jdk的代理效率高於cglib代理

  • cglib不能對生命為final的類或者方法進行代理,因為cglib的原理是動態生成被代理類的子類

CGLIN是第三方提供的包,需要引入jar包
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2.2</version>
</dependency>
程式碼
//火車站
public class TrainStation {
    public void sell() {
        System.out.println("火車站賣票!");
    }
}

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

/**
 * 代理工廠
 * @author
lyn */ public class ProxyFactory implements MethodInterceptor { private TrainStation target = new TrainStation(); public TrainStation getProxyObject() { //建立Enhancer物件,類似於JDK動態代理的Proxy類,下一步就是設定幾個引數 Enhancer enhancer = new Enhancer(); //設定父類的位元組碼物件 enhancer.setSuperclass(target.getClass());
//設定回撥函式 enhancer.setCallback(this); //建立代理物件 return (TrainStation) enhancer.create(); } /** * @param o 代理物件 * @param method 真實物件中的方法的Method例項 * @param args 實際引數 * @param methodProxy 代理物件中的方法的method例項 * @return * @throws Throwable */ @Override public TrainStation intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("代理點收取一些服務費用(CGLIB動態代理方式)"); return (TrainStation) methodProxy.invokeSuper(o, args); } } //測試 public class ProxyClient { public static void main(String[] args) { TrainStation proxyObject = new ProxyFactory().getProxyObject(); proxyObject.sell(); } }