对SpringAop的思考之静态代理
2015-11-18 00:00
309 查看
一直以来,我就对Spring有个强烈的兴趣,认为不可能完成的事情Spring却做到了。而且Spring一直以一种高大上的形象出现的程序员心里。
今天,我来分享下关于SpringAop的理解。
说道SpringAop,首先想到的是静态代理和动态代理。在写代码之前,要明白代理和SpringAop的关系。关键就是一点,动静态代理是实现SpringAop的基础,即SpringAop是动静态代理的应用。
首先介绍一下静态代理:
有这么一种情况,我在开发的时候,要计算每个方法执行的时间。很简单,就是在方法前和结束前都记录下时间,并将两个方法进行相减,从而得到了方法执行的时间。例如:
不错,这样就可以达到我们的需求。那么问题来了,我一个工程不可能就一个方法,成千上万个方法,难道都要这么写么?即使都写上了,那么忽然有一天,我们的需求变了,不需要计算方法的执行时间了,怎么办?每个方法都去到计算时间的代码?这很显然是不可取的。所有有没有一种简便点的方式来消除这个问题呢?
我们可以这么来构思代码:
首先构造一个代理类:
所谓代理类,就是重新弄个类,也实现目标类的接口,并且将目标类作为这个类的成员变量,从而在实现的方法中再次执行目标类的方法,并且加入达成我们需求的代码,因此让这个类成了目标类的代理,以后我们就使用这个代理类了。
这样,即使我们的需求变了,我们可以只要将代理类换成目标类就OK了。这就是所谓的静态代理。这样我们的目标真的完成了么???远远没有,想一下,如果为每个类都写这么个代理,我们这么大的工程,也是吃不消的,因此我们就像能不能只要一个代理类就可以代理所有的类了呢???这就是动态代理排上用场了。
今天,我来分享下关于SpringAop的理解。
说道SpringAop,首先想到的是静态代理和动态代理。在写代码之前,要明白代理和SpringAop的关系。关键就是一点,动静态代理是实现SpringAop的基础,即SpringAop是动静态代理的应用。
首先介绍一下静态代理:
有这么一种情况,我在开发的时候,要计算每个方法执行的时间。很简单,就是在方法前和结束前都记录下时间,并将两个方法进行相减,从而得到了方法执行的时间。例如:
public List<Person> getAllPerson() { int start= System.currentTimeMillis(); //业务逻辑 int end= System.currentTimeMillis(); System.out.println(“getAllPerson:”+(end-start)); }
不错,这样就可以达到我们的需求。那么问题来了,我一个工程不可能就一个方法,成千上万个方法,难道都要这么写么?即使都写上了,那么忽然有一天,我们的需求变了,不需要计算方法的执行时间了,怎么办?每个方法都去到计算时间的代码?这很显然是不可取的。所有有没有一种简便点的方式来消除这个问题呢?
我们可以这么来构思代码:
public interface PersonService{ public List<Person> getAllPerson(); }
public Class PersonServiceImp implements PersonService{ public List<Person> getAllPerson() { //业务逻辑代码 } }
首先构造一个代理类:
public Class PersonServiceImpProxy implements PersonService { public PersonService target 3ff8 ; public PersonServiceImpProxy(PersonService target) { this.target=target; } public List<Person> getAllPerson() { int start= System.currentTimeMillis(); //业务逻辑代码 List<Person> list=target.getAllPerson(); int end= System.currentTimeMillis(); System.out.println(“getAllPerson:”+(end-start)); return list; } }
所谓代理类,就是重新弄个类,也实现目标类的接口,并且将目标类作为这个类的成员变量,从而在实现的方法中再次执行目标类的方法,并且加入达成我们需求的代码,因此让这个类成了目标类的代理,以后我们就使用这个代理类了。
这样,即使我们的需求变了,我们可以只要将代理类换成目标类就OK了。这就是所谓的静态代理。这样我们的目标真的完成了么???远远没有,想一下,如果为每个类都写这么个代理,我们这么大的工程,也是吃不消的,因此我们就像能不能只要一个代理类就可以代理所有的类了呢???这就是动态代理排上用场了。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统