Java动态代理演变之路
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动态代理演变之路的更多相关文章
- 一文读懂Java动态代理
作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Java动态代理全面分析
代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1 主题:规定代理类和真实对象共同对外暴露的接口: 2 代理类:专门代理真实对象的类: 3 ...
- JAVA动态代理模式(从现实生活角度理解代码原理)
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...
- Java 动态代理作用是什么?
Java 动态代理作用是什么? 1 条评论 分享 默认排序按时间排序 19 个回答 133赞同反对,不会显示你的姓名 Intopass 程序员,近期沉迷于动漫ING 133 人赞同 ① 首先你 ...
- java动态代理原理
我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...
- java 动态代理示例,带主要注释
Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interf ...
- java动态代理浅析
最近在公司看到了mybatis与spring整合中MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接口的动态代理类. 于是想起了java的动态代理,然后就有了这篇文章 ...
- Java 动态代理
被代理的接口特点: 1. 不能有重复的接口,以避免动态代理类代码生成时的编译错误. 2. 这些接口对于类装载器必须可见,否则类装载器将无法链接它们,将会导致类定义失败. 3. 需被代理的所有非 pub ...
随机推荐
- spring的exception
Springmvc的对于异常类进行统一处理的方法 一.局部异常统一处理 当异常出现时,将抛给异常处理方法,异常处理发放接收到异常数据,进行处理,统一到异常页面 @ExceptionHandler:通过 ...
- js中常见的创建对象的方法(1)
工厂模式:抽象了创建具体对象的过程 function createPerson(name, age, job){ var obj = new Object(); obj.name = name; ob ...
- C++ Primer 第五版示例gcc源码
官方资源,原封不动的.对应于GCC,因此文件名是以此命名的. 门牌号: https://github.com/ZeroPhong/Learning-Resource/blob/master/GCC_4 ...
- windwos源码安装mysql
进入官网下载相关的mysql安装文件,解压到指定目录如E:\mysql-5.7.23-winx64下,然后进入该目录下新建data文件夹与my.ini文件,在my.ini文件中 [mysqld] po ...
- IDEA中使用git
这篇文章写的很好,记录参考 [转载] https://blog.csdn.net/autfish/article/details/52513465 https://www.jianshu.com/p/ ...
- .NET Core的SqlSugar上手使用小例子
开始直接建个空的WEB项目-建Controllers文件夹-开启MVC-添加NuGet程序包SqlSugarCore public class Startup { // This method get ...
- pandas-15 df['one_col'].apply()方法的用法
pandas-15 df['one_col'].apply()方法的用法 apply有点像map的用法,可以传入一个函数. 如:df['A'].apply(str.upper) import nump ...
- js对象的深入理解(六)
一.对象的创建(四种模式)1.工厂模式工厂模式示例: function createPerson(name,age){ var obj = { name:name, age:age, sayName: ...
- POSIX多线程之创建线程pthread_create && 线程清理pthread_cleanup
多线程之pthread_create创建线程 pthreads定义了一套C程序语言类型.函数.与常量.以pthread.h和一个线程库实现. 数据类型: pthread_t:线程句柄 pthread_ ...
- element中日期时间插件(DateTimePicke) el-date 开始时间大于等于当前时间小于结束时间,结束时间大于开始时间且大于当前时间
pickerOptions1: { disabledDate: time => { if (this.endTime) { return ( time.getTime() > new Da ...