代理模式

Java动态代理(invocation handler、cglib)简析

痞子三分冷 提交于 2020-01-21 18:46:43
What 代理模式 Java的一种设计模式, 他的特征是与委托类有相同的接口,但是并不具体实现真正的服务 作用: 消息预处理 过滤消息 把消息转发给委托类 消息的事后处理 代理的分类: 静态代理:把已存在的编译文件重新编译 动态代理:在程序运行的时候通过反射机制动态创建 JAVA的动态代理主要是: JDK自带的proxy cglib (code generation library) 什么是ASM? 一个字节码操控框架,可以增强既有类的功能、生成新的类。 JAVA class被描述成一棵树, asm使用 visitor模式 来遍历整个二进制结构 JDK-InvocationHandler 委托类必须实现接口,不能代理普通类(没有接口的类) 代理类必须实现InvocationHandler的接口,例子如下: public Object invoke ( Object proxy , Method method , Object [ ] args ) throws Throwable { //do something before //execute, target is the real implemation class(Delegate) result = method . invoke ( target , args ) ; //do something after

JAVA实现代理模式的3种方式

≯℡__Kan透↙ 提交于 2020-01-21 05:36:23
什么是代理模式 代理模式是项目中常用的一种设计模式。提供了间接访问目标对象的一种方式;即通过代理对象访问目标对象。 这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加额外的扩展功能。 代理模式又分为静态代理、jdk动态代理、cglib动态代理三种实现方式。 三种实现方式各有优点,以及适用的场景。 一、静态代理 被代理对象与代理对象需要实现相同的接口或者是继承相同父类,因此要定义一个接口或抽象类。 /**代理接口*/ public interface IHello { String hi ( String key ) ; } /**代理接口实现类*/ public class HelloImpl implements IHello { @Override public String hi ( String key ) { String str = "hello:" + key ; System . out . println ( "HelloImpl! " + str ) ; return str ; } } /**静态代理类*/ public class HelloStaticProxy implements IHello { private IHello hello ; public HelloStaticProxy ( IHello hello ) { this

JS 设计模式 -代理模式

烂漫一生 提交于 2020-01-20 16:45:15
代理模式简述 代理是一个对象,跟本体对象具有相同的接口,以此达到对本体对象的访问控制。 简单言之,本体对象只注重业务逻辑的实现,代理则控制本体对象的实例化(何时实例化、何时被使用)。 代理模式的优点在于:代理对象可以代替本体对象被实例化,此时本体对象未真正实例化,等到合适时机再实例化。 代理模式可以延迟创建开销很大的本体对象,他会把本体的实例化推迟到有方法被调用时。 一个简单的例子 // 声明女孩对象 var girl = function (name) { this.name = name; }; // 声明男孩对象 var boy = function (girl) { this.girl = girl; this.sendGift = function (gift) { alert("Hi " + girl.name + ", 男孩送你一个礼物:" + gift); } }; // 声明代理对象 var proxyObj = function (girl) { this.girl = girl; this.sendGift = function (gift) { (new boy(girl)).sendGift(gift); // 替dudu送花咯 } }; var proxy = new proxyObj(new girl("花花")); proxy.sendGift(

Java设计模式9:代理模式

╄→гoц情女王★ 提交于 2020-01-20 14:46:29
代理模式 代理模式的定义很简单: 给某一对象提供一个代理对象,并由代理对象控制对原对象的引用 。 代理模式的结构 有些情况下,一个客户不想或者不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间起到中介作用。代理模式中的角色有: 1、抽象对象角色 声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象 2、目标对象角色 定义了代理对象所代表的目标对象 3、代理对象角色 代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象 静态代理示例 这里模拟的是作为访问网站的场景,以新浪网举例。我们通常访问新浪网,几乎所有的Web项目尤其是新浪这种大型网站,是不可能采用集中式的架构的,使用的一定是分布式的架构,分布式架构对于用户来说,我们发起链接的时候,链接指向的并不是最终的应用服务器,而是代理服务器比如Nginx,用以做负载均衡。 所以,我们的例子,简化来说就是 用户访问新浪网-->代理服务器-->最终服务器 。先定义一个服务器接口Server,简单定义一个方法,用于获取页面标题: 1 /** 2 * 服务器接口,用于获取网站数据 3 */ 4 public interface Server { 5 6 /** 7 * 根据url获取页面标题 8 */ 9 public

关于代理模式和装饰模式的一些思考

☆樱花仙子☆ 提交于 2020-01-20 12:54:01
文章目录 背景 代理模式概述 装饰模式概述 编程启示录 背景 笔者前几天看了一个面试题 “说一下什么是代理模式?”,于是回忆了一下这个设计模式,并结合一篇旧文 《理理 Java 开发中常见的设计模式》 ,温故了一下这个知识点。 十年前看了好多遍的设计模式,死活处于学了忘、学不会的状态;如今随便翻到的某个 Java 技术点,都能快速反应出它们的前因后果。时光如梭,毕业已经十年了,这大概算是进入了卖油翁纯熟的技艺阶段了吧! 代理模式概述 代理模式类图 。面向对象编程语言中,代理对象和委托对象都需要实现相同接口,同时代理对象关联一个真正的委托对象,客户端得到的是一个代理的引用,实则背后调用的是真正委托对象的方法: 代理类型。 对于有大量类需要代理的应用,这就是一种负担。一方面增加了工作量,而且还产生了大量相似的代理类,所以有了动态代理这个解决方案:不需要为每个类都创建一个代理类,只在需要使用代理的时候,通过反射机制动态地生成一个实现代理接口的匿名类的实例。代理的分类:动态代理和静态代理,即生成代理类的方式是什么。 动态代理的两种类型:JDKProxy 和 CGlib 两种,二者比对结果如下 类型 原理 特点 JDKProxy 运行时直接写Class字节码 生成代理类效率高,反射执行效率低 CodeGeneratorLibrary ASM框架写 Class 字节码 生成代理类效率低

Spring-使用JAVA的方式配置Spring-代理模式

本秂侑毒 提交于 2020-01-20 12:25:29
9、使用Java的方式配置Spring 我们现在要完全不使用Spring的xml配置了,全权交给Java来做! JavaConfig是Spring的一个子项目,在Spring4之后,它成为了一个核心功能 实体类 //这里这个注解的意思,就是说明这个类被Spring接管了,注册到了容器中 @Component public class User { private String name; @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } public String getName() { return name; } @Value("尹锐") public void setName(String name) { this.name = name; } } 配置文件 package com.rui.config; import com.rui.pojo.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context

python搭建IP池

。_饼干妹妹 提交于 2020-01-19 18:05:20
,都说标题是文章的灵魂,想了半天没想到什么比较有创意的标题,只好百度了一个。啊哈哈哈哈哈哈,朕真是太机智了 这是一篇介绍如何使用python搭建IP池的文章,如果爱卿对此不感兴趣,那很抱歉,标题耽误了你宝贵的时间。 事情的起因是这样,前段时间我写了一篇介绍如何爬取小说的blog 【python那些事.No2】 ,在爬取的过程中,发现同一个IP连续只能获取前几页小说内容,原本是想搭建IP池绕过这个限制的,奈何项目上来了新任务,为了在被关进小黑屋之前把文章发布出来,就想了一个折中的办法–延时获取。 没想到文章发出来后,竟然还有人评论催更 搭建IP池。朕当时就龙颜大怒,长这么大朕何时受过这种气啊。从来都是朕催更那些小说作者,被别人催更还是头一遭 但是打又打不到,骂又骂不得,咋办?想了想那还是更吧。 众所周知,由于python爬虫这种简单易学的技术普及之后,为了网站的稳定运行和网站数据的安全,越来越多的网站对爬虫做各式各样的限制和反扒措施。其中,限制一定时间内同一IP的请求次数似乎已经成为了最常见的手段。 很多时候,使用延时获取的方式–‘在两次请求之间sleep一定的时间’ 可以解决网站对爬虫的限制。可是像朕这种年轻人,想要的现在就要,怎么办呢? 既然是对同一IP的限制,那就意味着两次请求的IP如果不同,此限制就形同虚设。 One way of thinking 去网上买代理IP

深入理解Java中的代理(Proxy)

岁酱吖の 提交于 2020-01-19 04:32:31
目录 1.代理的概念 2.代理的类型 2.1 静态代理 2.2 动态代理 2.2.1 动态代理需要的要素 2.2.2 创建动态代理的步骤 2.2.3 动态代理示例 引用: 1.代理的概念 代理模式为其他对象提供了一种代理以控制对这个对象的访问,具体实现包括两大类:静态代理和动态代理。Java动态代理机制的出现使得Java开发人员只需要简单地指定一组接口及委托类对象便能动态地获得代理类,并且其所生成的代理类在将所有的方法调用分派到委托对象上反射执行的同时,还可以对方法进行增强,这也正是Spring AOP的实现基础。 2.代理的类型 代理分为静态代理和动态代理 静态代理:在程序运行前,由程序员创建或特定工具类自动生成源代码并对其编译生成.class文件。 动态代理:程序在运行时期动态生成的指定类型对象的行为。 2.1 静态代理 静态代理需要3个部分,接口(要执行的事情)、实现接口的对象、一个代理对象 //功能接口 public interface PersonInterface { public void printName(); } //具体的对象 public class Person implements PersonInterface { private String name; private String tel; private int age; public

Java Web-Spring框架(二)

你说的曾经没有我的故事 提交于 2020-01-19 00:07:39
1、后处理 bean 对一个bean生效 2、注解和xml混合使用 a、将所有的 bean 都配置在 xml 中,<bean id="" class="" b、将所有的依赖都使用注解,@Autowired,默认不生效。为了生效,需要在xml中配置:<context:annotation-config,如图: 上图中,两个注解一般不一起使用,“注解1”扫描含有注解(@Component等)类,注入注解也会自动生效。“注解2”只在xml和注解(注入)混合使用时,使注入注解生效。 3、AOP 3.1、AOP介绍 AOP(Aspect Oriented Programming),面向切面编程。通过预编译方式和运动期动态代理实现程序功能的统一维护的一种技术。是OOP(面向对象编程)的延续,采取 横向抽取 机制,取代了传统 纵向继承 体系重复性代码。如图: 经典应用:事务管理、性能监视、安全检查、缓存、日志等。 Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。 AOP实现原理 AOP底层将采用代理机制进行实现。 接口 + 实现类:spring采用 jdk的 动态代理 Proxy 实现类:spring采用 cglib字节码增强 AOP术语【掌握】 target:目标类,需要被代理的类。例如:UserService

java静态代理和动态代理详解

你说的曾经没有我的故事 提交于 2020-01-18 14:28:26
目录 一、静态代理 二、动态代理 (一)JDK动态代理 (二)Cglib动态代理 (三)jdk动态代理和cglib动态代理的区别 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类(被代理类)预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 为了保持行为的一致性, 代理类和委托类通常会实现相同的接口 ,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也 可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间 ,从而在设计上获得了更大的灵活性。Java 动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。 代理,简单来说就是,代理类和委托类都实现相同的接口,代理类代替委托类去执行从相同接口中实现的委托类中的方法,而代理类在代替委托类去执行方法之前和之后可以进行其他相应的处理。 一、静态代理 特点:代理类和委托类在 编译期间 就已经确定好。 静态代理举例 /** * 静态代理: * 特点:代理类和被代理类在编译期间就确定下来 */ interface ClothFactory{ void produceCloth(); } //被代理类 class NikeClothFactory implements ClothFactory{ public