程序设计优化——(2)代理模式之动态代理

  简介:动态代理是指在运行时,动态生成代理类。即代理类的字节码将在运行时生成并载入当前的ClassLoader。与静态代理类相比,有诸多好处。不需要为真实主题写一个形式上完全一样的封装类,若接口过多,则会代理接口也很多,接口稍微改动,代理接口也要进行变更;其次,使用动态代理可以在运行时指定代理类的执行逻辑,从而提升系统的灵活性。

  动态代理有JDK自带的动态代理,CGLIB、Javassist或者ASM库。JDK的动态代理简单,内置在JDK中,因此不需要引入第三方jar包,但功能较弱。CGLIB和Javassist都是高级字节码生成库,总体性能比JDK自带的好,功能强大。这里主要介绍CGLIB的使用

1.在maven工程的pom.xml中引入cglib的配置

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2.2</version>
    </dependency>

2.主题接口

    package com.hxc.proxy.proxyMode;

    /**
     * <p>Description: 主题接口</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public interface IDBQuery {
        String request();
    }

3.真实主题

    package com.hxc.proxy.proxyMode;
    /**
     * <p>Description: 真实主题</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public class DBQuery implements IDBQuery {

        public DBQuery() {
            try {
                Thread.sleep(1000);    //模拟执行过程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public String request() {
            return "request String";
        }

    }

4.代理类 CGLIB代理类实现MethodInterceptor接口(JDK自带的动态代理实现InvocationHandler接口)

package com.hxc.proxy.proxyMode;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * <p>Description: 代理类</p>
 * @author Huang Xiaocong
 * @data 2019年10月30日
 */
public class CglibDbQueryInterceptor implements MethodInterceptor {

    private IDBQuery real = null;
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        if(real == null) {
            real = new DBQuery();
        }
        return real;
    }

}

5.Main,完成代理类和主题接口的工作

  创建代理对象的步骤:

  1) 指定切入器,定义代理类的逻辑

  2)指定实现的接口

  3)生成代理类的实例

    package com.hxc.proxy.proxyMode;
import net.sf.cglib.proxy.Enhancer;

/**
     * <p>Description: 客户端</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public class Main {

        public static void main(String[] args) {
            IDBQuery dbQuery = createCglibProxy();
            String request = dbQuery.request();
            System.out.println(request);
        }

        public static IDBQuery createCglibProxy() {
            Enhancer enhance = new Enhancer();
            enhance.setCallback(new CglibDbQueryInterceptor());     //指定切入器,定义代理类逻辑
            //指定实现的接口
            enhance.setInterfaces(new Class[] {IDBQuery.class});
            //生成代理类的实例
            IDBQuery object = (IDBQuery) enhance.create();
            return object;
        }

    }

  对动态代理最经典的用例就是Hibernate代理模式的应用:一是属性的延迟加载;二是关联表的延迟加载。

原文地址:https://www.cnblogs.com/sun-flower1314/p/11748056.html

时间: 2024-11-06 03:51:26

程序设计优化——(2)代理模式之动态代理的相关文章

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对象.上篇中的静态代理是在编译的时候就确定了代理类具体类型,如果有多个类需要代理,那么就得创建多个.还有一点,如果Subject中新增了一个方法,那么对应的实现接口的类中也要相应的实习该方法,不符合设计模式原则. 动态代理的做法:在运行时刻,可以动态创建出一个实现了多个接口的代理类.每个代理类的对象都会关联一个表示内部处理

Java设计模式-代理模式之动态代理(附源代码分析)

Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代理是在编译的时候就确定了代理类详细类型.假设有多个类须要代理.那么就得创建多个. 另一点,假设Subject中新增了一个方法,那么相应的实现接口的类中也要相应的实现这些方法. 动态代理的做法:在执行时刻.能够动态创建出一个实现了多个接口的代理类.每一个代理类的对象都会关联一个表示内部处理逻辑的Inv

谈谈Java的代理模式及动态代理

Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式无论学习静态代理或动态代理,我们都要先了解一下代理模式. 先看百度百科的定义: 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 直接看定义可能有些难以理解,我们就以生活中具体的实例

设计模式(11)--代理模式之动态代理

保护代理 在调用方法前后,进行一些动作. 动态代理之所以叫动态代理是因为,是运行时才将它的类创建出来. 日志 . 连接. 事务. Java在java.lang.reflect包中有自己的代理支持,利用这个包你可以要运行时动态地创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类.因为实际的代理类是在运行时创建类,我们称这个Java技术为:动态代理. Java为你创建Proxy类,因为Proxy不是你直接实现的,你让代理执行的代理应该放在InvocationHandler中. In

代理模式之动态代理

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //接口 interface MyInterface { public void action(); } // 被代理类 class MyObject implements MyInterface { @Override public void action() { System.

设计模式_代理模式_动态代理

转自:https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/index.html 动态代理是指在运行时动态生成代理类.即,代理类的字节码将在运行时生成并载入当前代理的 ClassLoader.与静态处理类相比,动态类有诸多好处.首先,不需要为真实主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也很麻烦.如果接口有变动,则真实主题和代理类都要修改,不利于系统维护:其次,使用一些动态代理的生成

动态代理模式——JDK动态代理

今天,我就来讲一下动态代理的设计模式. 动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.操作动态代理需要两个步骤:一.代理对象和真实对象建立代理关系.二.实现代理对象的代理逻辑方法. 在Java中,有很多的动态代理技术.如:JDK.CGLIB.Javassist.ASM,其中最常用的动态代理技术有两种:一种是JDK动态代理,这是JDK自带的功能:另一种就是CGLIB,这是第三方提供的一种技术. 这次主要讲的是JDK动态代理和CGLIB动态代理.在JDK动态代理中,我们

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

代理模式 &amp; Java原生动态代理技术 &amp; CGLib动态代理技术

第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.(其实就是在代理类中关联一个委托类的实例,然后在代理类中进行包装). UML图如下: 第二部分.在Java中实现代理模式  按照代理的创建时期,代理类可以分