spring源码AOP-wrapIfNecessary方法

首先我们先来看一下CGlib和jdk动态代理的区别

我们再来讲解spring中AOP的源码,首先我们回到createBean这一块,先找到前后置的处理,一听其实就能了解,AOP代理肯定是在bean创建完成前做的处理,不然你如何对代码进行增强?

我们找到resolveBeforeInstantiation方法,AOP的代理就在这里面

before的作用是在spring容器真正的实例化之前,允许给PostProcessor一个机会去返回一个bean的实例,也就是说我可以在before里创建一个bean并且实例化它进行返回,after这里才是AOP被真正创建的地方,我们接下来就是主要看的这个方法

这个方法中有一个接口的方法,我们进去查找实现类,最后在AbstractAutoProxyCreator中发现了这个实现的方法

拿到我们一个缓存的key,这里感觉我看的教程还是错的?我怎么感觉这里只是一个防止重复创建的缓存,教程里讲的是代理类和bean的判断,如果不相等则是代理类(存疑)总之进入wrapIfNecessary方法去做AOP的创建。

我们还是得来看这个核心方法wrapIfNecessary

一些条件的判断,从advisedBeans缓存中做一些重复性的判断,避免重复加载,到getAdviceAndAdvisorsForBean方法,我们来看一看这个方法的具体实现

走进这个findEligibleAdvisors方法看一下

两个方法,一个排序方法,先来看看这个寻找候选advisors是个什么玩意儿,Advisor(顾问)是切面(Aspect)的核心抽象,它封装了在何处(Pointcut)和如何执行增强(Advice)的逻辑

回来继续看第二个方法

这里就是如果有缓存就直接按缓存来,如果没有,为空,那么就先去找有AOP切面的bean然后缓存到cachedAdvisorBeanNames,然后根据advisorNames做遍历,最后加入到advisors中,第二个方法

寻找可以使用的advisor,进来就是几个方法

先给代理创建上下文设定当前的代理bean,然后进入下个方法

寻找符合条件的advisor,从候选的advisor中进行遍历,如果候选的能canApply上,canApply上他做了getClassFilter并且进行了matches,就是对当前的候选advisor是否能够匹配到筛选条件,能的话就加入符合条件的advisor

以上就是getAdvicesAndAdvisorsForBean方法的解析

后面是createBean方法的解析,我们再单开一篇文章写


 

posted @ 2025-05-29 19:31  七森星罗  阅读(27)  评论(0)    收藏  举报