ARTS-18-如何实现Spring框架中的AOP

松花皮蛋me 2019-07-14 19:58
文章首发于公众号 松花皮蛋的黑板报松花皮蛋的黑板报,作者就职于京东,在稳定性保障、敏捷开发、高级JAVA、微服务架构有深入的理解

ARTS的初衷

Algorithm: 主要是为了编程训练和学习。

Review:主要是为了学习英文

Tip:主要是为了总结和归纳在日常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。

Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章

https://www.zhihu.com/question/301150832

一、Algorithm

二、Review

声明一个AdvisedSupport类,用于保存被代理对象和拦截方法的元数据对象

创建织入点AopProxy,可以通过getProxy方法获取代理后的对象。使用CGLIB生成动态代理,生成Enhancer实例,并指定用于处理代理业务的回调类

完成了织入之后,我们要考虑另外一个问题:对什么类以及什么方法进行AOP?对于“在哪切”这一问题的定义,我们又叫做“Pointcut”。Spring中关于Pointcut包含两个角色:ClassFilter和MethodMatcher,分别是对类和方法做匹配。Pointcut有很多种定义方法,例如类名匹配、正则匹配等,但是应用比较广泛的应该是和AspectJ表达式的方式,Spring借鉴了这种方式

万事俱备,只欠东风!现在我们有了Pointcut和Weave技术,一个AOP已经算是完成了,但是它还没有结合到Spring中去。怎么进行结合呢?Spring给了一个巧妙的答案:使用BeanPostProcessor


BeanPostProcessor是BeanFactory提供的,在Bean初始化过程中进行扩展的接口。只要你的Bean实现了BeanPostProcessor接口,那么Spring在初始化时,会优先找到它们,并且在Bean的初始化过程中,调用这个接口,从而实现对BeanFactory核心无侵入的扩展

那么我们的AOP是怎么实现的呢?我们知道,在AOP的xml配置中,我们会写这样一句话:

<aop:aspectj-autoproxy/>

它其实相当于:

<bean id="autoProxyCreator" class="org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator"></bean>

AspectJAwareAdvisorAutoProxyCreator就是AspectJ方式实现织入的核心。它其实是一个BeanPostProcessor。在这里它会扫描所有Pointcut,并对bean做织入

三、Tip

如何分析Mysql中的死锁

MySQL的InnoDb引擎是行级锁,需要注意的是,这不是对记录进行锁定,而是对索引进行锁定。在UPDATE\DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相依的健值,也就是所谓的next-key locking,如语句update liangsonghua_me_blog_post set update_time = now() where id > 10000会锁定所有主键大于等于1000的所有记录。另外我们知道通过非主键查询回表时,会先通过二级索引也就是非簇索引查找相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行。实际上当非簇索引(non-cluster index)记录被锁定时,相关的的簇索引记录也需要被锁定才能完成相应的操作

四、Share

主动监测在APM中应用的一些思考

深入理解Apache Kafka


阅读 208 次