代理模式

设计模式 - 动态代理原理及模仿JDK Proxy 写一个属于自己的动态代理

淺唱寂寞╮ 提交于 2019-12-01 09:37:01
本篇文章代码内容较多,讲的可能会有些粗糙,大家可以选择性阅读。 本篇文章的目的是简单的分析动态代理的原理及模仿 JDK Proxy 手写一个动态代理以及对几种代理做一个总结。 对于代理模式的介绍和讲解,网上已经有很多优质的文章,我这里就不会再过多的介绍了,这里推荐几篇优质的文章作为参考: 给女朋友讲解什么是代理模式 轻松学,Java 中的代理模式及动态代理 另外,我的 github 仓库对应目录中也有相关的基础示例代码: https://github.com/eamonzzz/java-advanced... JDK Proxy 动态代理 动态代理的概念这里就不再阐述了;动态代理相对于静态代理来说,它的功能更加强大,随着业务的扩展,适应性更强。 在说动态代理原理之前,我们还是来看看动态代理的一般使用。 使用 本篇文章的使用示例,是以一个最为简单的代理模式的代码为例,相信大家在学习或了解代理模式的时候都有看到或者接触过这些代码。 先创建一个 Subject 主体抽象接口: /** * @author eamon.zhang * @date 2019-10-09 下午4:06 */ public interface Subject { void request(); } 再创建一个真实的主体 RealSubject 来处理我们的真实的逻辑: /** * @author eamon

Java代理模型

我的梦境 提交于 2019-12-01 09:00:23
引用文章 https://www.cnblogs.com/boboxing/p/8126046.html 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。 代理的作用在于不修改目标代码的情况下,可以控制对目标的访问,可以在其前后加上自己的业务处理代码,甚至阻止对目标方法的访问,有点类似于过滤器和拦截器的作用。 代理模式 静态代理 继承 代理对象继承目标对象,重写增强方法 缺点:会产生代理类过多、非常复杂 聚合目标对象和代理对象实现同一接口,代理对象当中要包含目标对象 缺点:也会产生类爆炸,只是比继承少一点点      总结: 如果在不确定的情况下,不要去使用静态代理,一代写代码就会产生类,一旦产生类就会爆炸。 动态代理   1.JDK动态代理 调用Proxy类的静态方法newProxyInstance即可,该方法会返回代理类对象 static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h ) 接收的三个参数依次为: ClassLoader loader: 指定当前目标对象使用类加载器,写法固定 Class<?>[] interfaces: 目标对象实现的接口的类型,写法固定 InvocationHandler

设计模式之☞代理模式

ε祈祈猫儿з 提交于 2019-12-01 08:54:46
一、代理模式的作用 将主要业务与次要业务进行松耦合的组装 二、代理模式本质 监控行为的特征 例子:   <input type="button" onclick="处理函数"> 三、生活案例 案例:饭前便后要洗手 分析:   1.分析出主要业务和次要业务   【主要业务】:吃饭,上厕所   【次要业务】:洗手   2.JDK代理模式实现     2.1、接口角色:定义所有需要被监听行为 BaseService.java 1 package com.chenyanbin.service; 2 3 /* 4 * 只有需要被监控的行为才有资格在这里声明 5 */ 6 public interface BaseService { 7 public void Eat(); 8 public void Wc(); 9 }     2.2、接口实现类:中国人、印度人 Person.java 1 package com.chenyanbin.serviceImpl; 2 3 import com.chenyanbin.service.BaseService; 4 5 public class Person implements BaseService { 6 7 @Override 8 public void Eat() { //主要业务,代理模式要求开发任务只关心主要业务 9 System

Spring(4)AOP

不打扰是莪最后的温柔 提交于 2019-12-01 08:42:48
Spring(4)AOP 1、AOP概述 在软件业,AOP为Aspect Oriented Programming的缩写,意为: 面向切面编程 ,通过 预编译 方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是 函数式编程 的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的 耦合度 降低,提高程序的可重用性,同时提高了开发的效率。 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的 基础上,对我们的已有方法进行增强。 作用: 在程序运行期间,不修改源码对已有方法进行增强。 优势: 减少重复代码、提高开发效率、维护方便 2、动态代理 2.1、动态代理的特点 字节码随用随创建,随用随加载。 它与静态代理的区别也在于此。因为静态代理是字节码一上来就创建好,并完成加载。 装饰者模式就是静态代理的一种体现。 2.2、动态代理的两种方式 基于接口的动态代理 提供者:JDK 官方的 Proxy 类。 要求:被代理类最少实现一个接口。 基于子类的动态代理 提供者:第三方的 CGLib,如果报 asmxxxx 异常,需要导入 asm.jar。 要求:被代理类不能用 final 修饰的类(最终类)。 2.2.1

[转]23种设计模式总结

瘦欲@ 提交于 2019-12-01 08:04:32
1.单例模式(Singleton Pattern) 定义: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。) 通用代码:(是线程安全的) public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是static public static void doSomething(){ } } 使用场景: ● 要求生成唯一序列号的环境; ● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的; ● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源; ● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然

nginx实现反向代理

浪子不回头ぞ 提交于 2019-12-01 07:53:25
nginx 实现方向代理 1.什么是nginx Nginx是由俄国人编写的十分轻量级的HTTP服务器,是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等 2.什么是代理 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。 例如:我们身边的要租房子的人 3.没有代理的情景 在没有代理的情况下,客户端和nginx服务端,都是客户端,都是客户端之间请求服务端,服务端则直接响应客户端 4.企业场景 在互联网请求里面,客户端往往无法直接向服务端发起请求,那么就需要实现客户端和服务通信。 5.nginx代理服务常见模式 nginx 作为代理服务,按照应用场景进行总结,代理分为正向代理,反向代理 6.正向代理 正向代理:客户端 <一> 代理 一>服务端: 正向代理简单地打个租房的比方: A(租客)B(中介)C(房东)A(客户端)想租C(服务端)的房子,但是A(客户端)并不认识C(服务端)租不到。 B(代理)认识C(服务端)能租这个房子所以你找了B(代理

Spring AOP 源码解析

一曲冷凌霜 提交于 2019-12-01 07:22:26
本文转载自: https://javadoop.com/post/spring-aop-source 之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希望能写一写 Spring AOP 的源码分析文章,这样读者看完 IOC + AOP 也就对 Spring 会有比较深的理解了。今天终于成文了,可能很多读者早就不再等待了,不过主要为了后来者吧。 本文不会像 IOC 源码分析那篇文章一样,很具体地分析每一行 Spring AOP 的源码,目标读者是已经知道 Spring IOC 源码是怎么回事的读者,因为 Spring AOP 终归是依赖于 IOC 容器来管理的。 阅读建议:1、先搞懂 IOC 容器的源码,AOP 依赖于 IOC 容器来管理。2、仔细看完 Spring AOP 使用介绍 这篇文章,先搞懂各种使用方式,你才能"猜到"应该怎么实现。 Spring AOP 的源码并不简单,因为它多,所以阅读源码最好就是找到一个分支,追踪下去。本文定位为走马观花,看个大概,不具体到每一个细节。 目录: 前言 这一节,我们先来"猜猜" Spring 是怎么实现 AOP 的。 在 Spring 的容器中,我们面向的对象是一个个的 bean 实例,bean 是什么?我们可以简单理解为是 BeanDefinition 的实例,Spring 会根据 BeanDefinition

一款功能强大的TCP/UDP工具---flynet

这一生的挚爱 提交于 2019-12-01 07:05:39
前言 前段时间做某个项目,由于涉及到tcp/udp方面的知识比较多,于是就索性趁热打铁,写个工具来强化相关知识。另外由于并非十分擅长Golang,所以也顺便再了解下Golang吧。 简介 flynet 是一款Golang语言编写的命令行工具,目前支持的功能包括: Http代理 本地Socks5代理 C/S模式的Socks5代理,支持TCP/UDP方式 内网穿透 ... 项目目前分为clien端和sever端,除http、本地socks5代理两端都支持外,其余功能需要两端配合使用。 使用方式 安装 Windows、linux用户可以直接在 Releases页面 下载对应的版本即可,其他平台可自行下载源码编译。 Windows中命令行进入到相应目录, .\win-client.exe ... 或 .\win-server.exe ... Linux中同样的, ./linux-server ... 或 ./linux-client ... 在下文中皆以 server ... 或 client ... 表示。 尝试运行后,如果输出如下信息表示成功: Usage: flynet [options] -M, --mode choose which mode to run. the mode must be one of['http', 'socks5', 'socks5-tcp',

Nginx反向代理与负载均衡

倾然丶 夕夏残阳落幕 提交于 2019-12-01 05:36:28
最近在做需求的时候,有时候会和别的三方系统交互,如调用一个第三方系统的http接口查询商品物流信息,获得响应数据返回给我们自己系统的前端页面进行展示,整个流程会遇到什么样的问题呢,现在整理一下。 代理 大家都知道,我们平时开发,都是在公司的内网(局域网)中,即不能与外网(互联网)交互,也就是不能上网,所以要想使开发机或服务器能够访问外网,就不得不通过代理服务器转发请求了。这里自然而然的就想到了使用Nginx做代理了,那什么是代理呢?我们就先了解一下代理的基本概念吧。 代理一词被我们在生活中所熟知,印象中的“代理”指的是以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为。这是百度百科解释的代理一词的意思。通俗点说就是“代别人处理”,举个生活中常见的例子,你去办车检,需要排队办理,也有很多表格要填,还要等待很久,办下来差不多要一天。有些人嫌麻烦,浪费时间,不愿意干,这个时候“代理车检”这一职业就诞生了。你授权代理人帮你处理一些列繁琐的事情,并支付一定的费用,你只需要关心结果,有没有办成功,其他的你不需要关心。这样,你就从这一事务中脱离出来,交给专业的人去做。代理人执行的这一动作就叫做代理。 同样,回到互联网行业,代理一词同样适用。只不过这里的代理人和被代理人都是计算机,即计算机1要访问A站点,但是计算机1到A站点的网络不通,而计算机2到站点A的网络畅通

nginx 配置 google代理

廉价感情. 提交于 2019-12-01 02:29:09
准备的东西 1.一个可以访问google的vps,推荐搬瓦工,120rmb/Y 2.一个垃圾域名(已经解析到该vps的ip),被封不心疼 3.nginx 4.ssl证书 ,可以使用腾讯免费一年的 https://console.qcloud.com 1.easy模式,不需要ssl证书 tips: 听说有时候会被定向到google.com server { listen 80 ; server_name example.com; #你的域名 location / { proxy_pass http://www.google.com/; #需要反代的域名 proxy_redirect off; proxy_ set _header X-Real-IP $remote_addr ; proxy_ set _header X-Forwarded-For $proxy_add_x_forwarded_for ; } } 2.ssl证书 server { listen 80 ; server_name example .com www .example .com ; location / { rewrite ^/(.*)$ https://example .com $1 permanent ; } } server { listen 443 ssl http2 default_server ;