Spring:08 AOP-基於cglib的動態代理

Spring:AOP-基於cglib的動態代理

cglib是一個第三方框架,專門做代理的。Spring集成了它。

cglib實現代理是**基於“類繼承”**的:代理對象是繼承目標對象的,是父子關係,子加強了父。

實現步驟:

1、創建目標對象 Target

2、創建增強對象 Advice

3、創建代理對象類 MyProxy

4、編寫測試代碼

1、創建目標對象 Target

public class Target{
    public void save() {
        System.out.println("Target: save() running...");
    }
}

2、創建增強對象 Advice

public class Advice {
    public void before(){
        System.out.println("前置增強...");
    }

    public void afterReturning(){
        System.out.println("後置增強...");
    }
}

3、創建代理對象類 MyProxy

public class MyProxy {

    // 定義目標對象、增強對象
    private Target target = new Target();
    private Advice advice = new Advice();

   public Target getProxy(){
       // 創建增強對象
       Enhancer enhancer = new Enhancer();

       // 給增強對象設置父類
       enhancer.setSuperclass(Target.class);

       // 設置回調函數
       // public void setCallback(Callback callback)
       enhancer.setCallback(new MethodInterceptor() {
           /**
            * SpringMVC中的攔截器:方法攔截器
            * @param proxy          代理對象
            * @param method         目標方法對象
            * @param args        	目標方法參數
            * @param methodProxy    方法代理
            * @return
            * @throws Throwable
            */
           @Override
           public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
               //前置增強
               advice.before();
               //反射調用目標方法
               Object obj = method.invoke(target, args);
               //後置增強
               advice.afterReturning();
               return obj;
           }
       });

       //創建代理對象
       Target proxy = (Target) enhancer.create();
       return proxy;
   }
}

4、編寫測試代碼

測試包下寫

public class CglibProxyTest {

    /**
     * 測試基於cglib的動態代理
     */
    @Test
    public void test01(){
        //創建代理對象
        Target proxy = new MyProxy().getProxy();

        //通過代理對象調用目標方法
        proxy.save();
    }
}

控制檯打印內容:

前置增強...
Target: save() running...
後置增強...

分析總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章