一直以来,我就对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 ;
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了。这就是所谓的静态代理。这样我们的目标真的完成了么???远远没有,想一下,如果为每个类都写这么个代理,我们这么大的工程,也是吃不消的,因此我们就像能不能只要一个代理类就可以代理所有的类了呢???这就是动态代理排上用场了。