Java动态代理演变之路
2016-11-05 18:55
120 查看
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、总结
正是由于上面的缺点,我们增加类,就会增加一个代理类,这样当很多的时候就没办法使用静态代理,于是人们又创建了一种新的方式,动态代理,让代理类在运行时刻创建,这样我们就不需要创建这么多代理类,上面的麻烦也就解决了。
代理,英文成文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学习之路-------------简写动态代理
- hadoop源码研读之路(五)----Java动态代理
- java学习之路----静态代理---动态代理-----AOP的前奏(AOP也是动态代理)
- java学习之路 之 反射机制综合练习题、动态代理实例
- 【java-之路】学习动态代理[基础]
- java 代理到动态代理演变及详解
- Java动态代理实现AOP
- Java动态代理实现
- Java动态代理实现
- 使用JAVA中的动态代理实现数据库连接池
- 用Java动态代理实现AOP
- Java 动态代理示例
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
- AOP初学者第一步:用Java动态代理实现AOP
- 使用JAVA中的动态代理实现数据库连接池
- Java 动态代理示例
- 使用JAVA中的动态代理实现数据库连接池
- AOP系列之三:用Java动态代理实现AOP
- 用Java动态代理实现AOP