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. spring的exception

    Springmvc的对于异常类进行统一处理的方法 一.局部异常统一处理 当异常出现时,将抛给异常处理方法,异常处理发放接收到异常数据,进行处理,统一到异常页面 @ExceptionHandler:通过 ...

  2. js中常见的创建对象的方法(1)

    工厂模式:抽象了创建具体对象的过程 function createPerson(name, age, job){ var obj = new Object(); obj.name = name; ob ...

  3. C++ Primer 第五版示例gcc源码

    官方资源,原封不动的.对应于GCC,因此文件名是以此命名的. 门牌号: https://github.com/ZeroPhong/Learning-Resource/blob/master/GCC_4 ...

  4. windwos源码安装mysql

    进入官网下载相关的mysql安装文件,解压到指定目录如E:\mysql-5.7.23-winx64下,然后进入该目录下新建data文件夹与my.ini文件,在my.ini文件中 [mysqld] po ...

  5. IDEA中使用git

    这篇文章写的很好,记录参考 [转载] https://blog.csdn.net/autfish/article/details/52513465 https://www.jianshu.com/p/ ...

  6. .NET Core的SqlSugar上手使用小例子

    开始直接建个空的WEB项目-建Controllers文件夹-开启MVC-添加NuGet程序包SqlSugarCore public class Startup { // This method get ...

  7. pandas-15 df['one_col'].apply()方法的用法

    pandas-15 df['one_col'].apply()方法的用法 apply有点像map的用法,可以传入一个函数. 如:df['A'].apply(str.upper) import nump ...

  8. js对象的深入理解(六)

    一.对象的创建(四种模式)1.工厂模式工厂模式示例: function createPerson(name,age){ var obj = { name:name, age:age, sayName: ...

  9. POSIX多线程之创建线程pthread_create && 线程清理pthread_cleanup

    多线程之pthread_create创建线程 pthreads定义了一套C程序语言类型.函数.与常量.以pthread.h和一个线程库实现. 数据类型: pthread_t:线程句柄 pthread_ ...

  10. element中日期时间插件(DateTimePicke) el-date 开始时间大于等于当前时间小于结束时间,结束时间大于开始时间且大于当前时间

    pickerOptions1: { disabledDate: time => { if (this.endTime) { return ( time.getTime() > new Da ...