spring原理之aop

今天我们来聊聊spring框架中,大名鼎鼎的aop,它是spring的利器,学好aop,可以让我们用到spring的精髓。把spring的优雅发挥到极致。

      那到底什么是aop呢,你心中一定有这样的疑问。其实aop的理念很简单,就是动态代理,对类功能的增强,具体的来说,就是对类方法的增强。spring这种对方法的增强,是毫无侵入性的,使用方是毫无感知的。这点就很厉害了,你不知不觉中,就让你的类进行的增强。多么厉害啊,其实你懂aop原理后,发现,原来如此简单,不就是动态代理吗。至于什么是动态代理,这里我就不会说了,如果你不知道的话,可以自行查询相关资料。我们现在知道了,aop是对类的增强,那么什么时候进行增强呢。其实是在spring的对象创建完成后,才会对类进行增强.这点其实很好理解,首先你对某个类进行增强,你首先得有一个bean的对象吧。那么这个对象的一些属性的内容,实例化的方法,这些肯定是已经执行完了。你增强的肯定是一个完整的bean,如果不完整,你增强有何意义呢,并且还会存在各种问题。那么我直接看aop入口的源码吧:

 来到这个类org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory的doCreateBean方法我们看到:

以上红色圈的地方,就是在依赖注入属性完成后,调用初始化方法,在完成初始化方法之后,会进入aop的流程。

 以上红色圈圈的地方,表示的是aop的入口,对于spring的aop的使用,我们首先要定义一个切面,则类上一定要有@aspect注解,然后定义一个拦截方法的表达式,@poincout(),这个注解作用在方法上,最后就是我们的增强注解,@before()(增强注解有很多),由这三个注解完成对方法的增强。有了这个前提之后,我们先来说下,是如何对某个方法进行aop增强的。

      我们对bean进行实例化完成后,会首先获得spring容器中,所有的@aspect注解的类,并且获得这个注解类上对应的@pointcut注解,@before注解信息。获得这些信息后,会判断当前bean的方法,符不符合@pointcut()注解上的表达式,如果符合,则生成advior对象,并生成代理。其实整个思想就这么简单,好了知道了aop增强的思想之后,我们就来进入正在的aop源码的地方吧:

  让我们来到: org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization方法

以上红线的地方,是生成多个advior对象,每个方法对应一个advisor对象的,在advisor对象里面,必须有增强的具体的代码,增强的时机(方法之前还是之后)所以我们看到这个思想,我们也可以用到我们自己的工程里面去。接下来就是如何生成和匹配advisor过程了,

以上标记1的地方是获得所有的advisor对象,标记2的地方是判断当前advisor对象是否匹配当前bean的方法。

以上标记1地方表示是自定义实现了advisor接口的类,

标记2的地方是获得@Aspect注解的类,并把它变成advisor对象。

以上红线的地方,证明了我前面说的,是获得实现advisor接口的类吧。

以上打标记的1的地方,是获得标有@Aspect类的类,打标2记是创建advisor类。

我们来到创建advisor方法,看到是循环@aspect上类的非pointcut注解的方法,将这些方法都变成一个advisor。现在我们已经获得所有的advisor的对象,接下来是要做这些advisor对象是不是和我当前bean的方法匹配。每个bean的都会走上面的逻辑.

     

看了上面的三张截图,有什么感想,其实就是先通过类进行匹配,匹配成功的情况的下,在进行方法进行匹配,如果方法匹配成功,则代表当前bean的某个方法,是需要被代理,需要生成advisor对象.至于匹配的过程太复杂了,我不在里面说了. 对spring我们要深入理解这种思想,具体的实现细节,可以不深究。好了今天的aop的分析,就到这里了,谢谢观看。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值