1、什么是代理?

代理,英文成文Proxy。意思是你不用去做,别人代替你去处理。比如有人想找明星周董去唱歌,他需要做签约、讨论、唱歌和付款等等过程,但真正周董擅长的事情是唱歌,其他的事情可以交代给他的经纪人来做,经纪人就是一个代理,周董就是被代理的人。

2、我们为什么要引入代理?

比如我们要统计每个方法的执行时间,以对性能做出评估,那我们就需要在每个方法的头尾都需要一个获取时间的方法?这样的代码是不是就有“坏味道”了呢?而针对这个问题我们就可以引入代理,让代理类来做这些事情。

3、代理分类

代理可以分为静态代理和动态代理,究竟什么是静态代理,什么是动态代理呢?且看我的分析:静态代理,我们的代理类由我们在程序中直接并主动创建;动态代理,当程序运行期间自动创建代理类,而不需要我们在编写程序时主要的去编写代码。

由于篇幅关系,本文首先介绍静态代理。

4、静态代理实现

4.1接口类Greeting

public interface Greeting {
void sayHello(String name);
}

4.2实现类GreetingImpl

public class GreetingImpl implements Greeting {
@Override
public void sayHello(String name) { System.out.println("Hello! " + name); } }

4.3代理类GreetingProxy

public class GreetingProxy implements Greeting {

    private GreetingImpl greetingImpl;

    public GreetingProxy (GreetingImpl greetingImpl){
this.greetingImpl=greetingImpl;
} @Override
public void sayHello(String name) {
before();
greetingImpl.sayHello(name);
after();
} private void before(){
System.out.println("Before");
} private void after(){
System.out.println("After");
} }

注:

1)用GreetingProxy去代理GreetingImpl,让代理来做这些事情。

2)静态代理必须拥有真实类的引用,该例子就是通过private GreetingImpl greetingImpl;代码使Proxy拥有代理类的引用。

4.4客户端Client

public class Client {
public static void main(String[] args){
Greeting greetingProxy = new GreetingProxy(new GreetingImpl());
greetingProxy.sayHello("Jack");
} }

5、优缺点

5.1优点:

业务类只需要关注业务逻辑本身,而不需要去关心其他与核心业务无关的内容

5.2缺点

1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,这样代理的类就会很多。。。。

2)如果结构增加一个方法,除了所有实现类需要实现这个方法外,所有代理类页需要实现该方法,这样增加了

代码的维护难度

6、总结

正是由于上面的缺点,我们增加类,就会增加一个代理类,这样当很多的时候就没办法使用静态代理,于是人们又创建了一种新的方式,动态代理,让代理类在运行时刻创建,这样我们就不需要创建这么多代理类,上面的麻烦也就解决了。

Java动态代理演变之路的更多相关文章

  1. 一文读懂Java动态代理

    作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...

  2. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  3. Java动态代理全面分析

    代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1  主题:规定代理类和真实对象共同对外暴露的接口: 2  代理类:专门代理真实对象的类: 3 ...

  4. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  5. Java 动态代理作用是什么?

    Java 动态代理作用是什么?   1 条评论 分享   默认排序按时间排序 19 个回答 133赞同反对,不会显示你的姓名 Intopass 程序员,近期沉迷于动漫ING 133 人赞同 ① 首先你 ...

  6. java动态代理原理

    我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...

  7. java 动态代理示例,带主要注释

    Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interf ...

  8. java动态代理浅析

    最近在公司看到了mybatis与spring整合中MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接口的动态代理类. 于是想起了java的动态代理,然后就有了这篇文章 ...

  9. Java 动态代理

    被代理的接口特点: 1. 不能有重复的接口,以避免动态代理类代码生成时的编译错误. 2. 这些接口对于类装载器必须可见,否则类装载器将无法链接它们,将会导致类定义失败. 3. 需被代理的所有非 pub ...

随机推荐

  1. 【maven学习】pom.xml文件详解

    环境 apache-maven-3.6.1 jdk 1.8 eclipse 4.7 POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示, ...

  2. python中判断对象类型的函数——isinstance

    isinstance是Python中的一个内建函数.是用来判断一个对象的变量类型. isinstance(object, class-or-type-or-tuple) 如果参数object是clas ...

  3. 使用echarts绘制条形图和扇形图

    使用echarts绘制条形图和扇形图 简单举例说明下echarts如何绘制条形图和扇形图 代码示例 <!doctype html> <html lang="en" ...

  4. 关于UiAutomator无法识别的元素

    1.关于没有name,没有ID的元素的定位---通用篇解题思路:因为没有name,id:其实剩下的选择已不多,要么xpath,要么className.xpath木有好印象(稳定性不高,加之1.0x后需 ...

  5. windows系统常用命令

    dir 指定要列出的驱动器,显示当前文件夹下的文件   /?可显示所有命令 显示当前路径下的所有文件的绝对路径,包含子文件夹中的内容 D:\test > dir /b /s /o:n /a:a  ...

  6. 【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜

    原题传送门 这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法 实际线段树+树状数组的做法也很暴力 我们先用树状数组维护每个ac数量有多少个队伍.这样就能快速求出有多少队伍ac数比现在 ...

  7. Hive 系列(三)—— Hive CLI 和 Beeline 命令行的基本使用

    一.Hive CLI 1.1 Help 使用 hive -H 或者 hive --help 命令可以查看所有命令的帮助,显示如下: usage: hive -d,--define <key=va ...

  8. Linux 6 本地网络配置方法

    在Linux 6 系统安装完成后,需要对网络进行一系列的配置,有些朋友喜欢使用桌面图形化工具的配置方式,这种配置方法虽说比较方便,但是在某些时候并不问题,总是会出现各种问题.特别是作为服务器用途的时候 ...

  9. java之spring之依赖注入

    一.DI: Dependency injection; 依赖注入 依赖注入和控制反转是同一个概念的不同说法. 对象的创建依赖于容器.对象属性的设置是由容器来设置. 对象属性的赋值过程称为注入. 二.S ...

  10. vue中keep-alive,include的指定页面缓存问题

    做vue项目时,有时要在某些页面做缓存,而其它页面不要.比如:A:首页,B:获取所有订单页面,C:订单详情页面:从A(首页)进入 B(获取所有订单)时应该不缓存,B(所有订单)进入 C(订单详情)订单 ...