• 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.
  • 相关阅读:
    11.7表单事件 定时器
    11.5真11.6 函数调用 数组字符串的定义和方法
    11.2 面向对象 解析
    11.1 js数据类型 作用域 原型链
    10.31js中级作用域链和this
    定时器
    生出对象的方式
    学习this
    字符串
    全局方法
  • 原文地址:https://www.cnblogs.com/yqy921/p/6557038.html
Copyright © 2020-2023  润新知