您的位置:首页 > 编程语言 > Java开发

对SpringAop的思考之静态代理

2015-11-18 00:00 309 查看
一直以来,我就对Spring有个强烈的兴趣,认为不可能完成的事情Spring却做到了。而且Spring一直以一种高大上的形象出现的程序员心里。

今天,我来分享下关于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 aop