zoukankan      html  css  js  c++  java
  • Spring AOP 中的两种动态代理

    Spring AOP 主要用到的 动态代理,在spring aop的实现中,采用了两种方式,一种是基于接口的动态代理,另外

    一种是基于类的动态代理。

    在谈动态代理前,先谈下设计模式中的代理模式:

    代理模式:为另一对象提供一个替身或占位符以控制对这个对象的访问。

    类图如下:

    1,基于接口的动态代理必须首先要定义接口:

    代码如下:

    package com.tong.qiu.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * Created by ywb 
     */
    public interface Subject {
        void doSomething();
        void somethingElse(String arg);
    }
    
    class DynamicProxyHandler implements InvocationHandler {
        private Object proxied;
        public DynamicProxyHandler(Object proxied) {
            this.proxied = proxied;
        }
        public Object
        invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            System.out.println("**** proxy: " + proxy.getClass() +
                    ", method: " + method + ", args: " + args);
            if(args != null)
                for(Object arg : args)
                    System.out.println("  " + arg);
            return method.invoke(proxied, args);
        }
    }
    
    class RealObject implements Subject {
        public void doSomething() {
            System.out.println("doSomething");
        }
        public void somethingElse(String arg) {
            System.out.println("somethingElse " + arg);
        }
    }
    
    class SimpleDynamicProxy {
        public static void consumer(Subject iface) {
            iface.doSomething();
            iface.somethingElse("bonobo");
        }
        public static void main(String[] args) {
            RealObject real = new RealObject();
            consumer(real);
    
            Subject proxy = (Subject) Proxy.newProxyInstance(//此处生成代理对象
                    Subject.class.getClassLoader(),
                    new Class[]{ Subject.class },
                    new DynamicProxyHandler(real));
            consumer(proxy);
        }
    }
    

    2.基于类的动态代理

    spring 使用CGLIB来生成  

    When things go wrong,don't go with them.
  • 相关阅读:
    两道挺有意思的思考题
    IEEE浮点数表示法
    MD5 Bump Mapping
    MD5 PolyBump + DetailBump
    DOOM3 MD5渲染方式的另一种猜测
    Relief Mapping
    如何计算投影纹理坐标
    Toon Shading, step 3
    c++数组初始化赋值
    c++重载部分运算符以及输入输出运算符
  • 原文地址:https://www.cnblogs.com/yqy921/p/6557038.html
Copyright © 2011-2022 走看看