对SpringAop的思考之静态代理

本文探讨了Spring AOP的概念及其实现方式,通过对比静态代理和动态代理,阐述了如何利用代理模式解决实际开发中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



转载于:https://my.oschina.net/littlestyle/blog/532257

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值