松花皮蛋的黑板報
  • 分享在京東工作的技術感悟,還有JAVA技術和業內最佳實踐,大部分都是務實的、能看懂的、可復現的

掃一掃
關注公眾號

ARTS-18-如何實現Spring框架中的AOP

博客首頁文章列表 松花皮蛋me 2019-07-14 19:58

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

黑龙江6+1开奖结果查询