Spring AOP源碼解析

spring-aop 時序圖

解析:

創建代理器

  • 從DI開始,發現AbstractAutowireCapableBeanFactory#doCreateBean 是獲取bean的方法->
  • 通過aop的面向切面的特性,所以只要找到bean初始化的地方,查看AbstractAutowireCapableBeanFactory#initializeBean方法->
    • 設置bean的相關屬性,如名稱,類加載器,所屬容器等信息
    • 初始化對象之前做的事情 applyBeanPostProcessorsBeforeInitialization
    • 初始化對象 invokeInitMethods
    • 初始化對象之後做的事情 applyBeanPostProcessorsAfterInitialization
  • 設置後置處理器 初始化對象之後做的事情 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization ->
    • 設置後置處理器的初始化方法
  • 先從緩存中獲取 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization ->
    • 當後置處理器不存在的時候 包裝傳入的bean
  • org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary 包裝bean->
    • 判斷是否可以代理bean
    • 獲取通告advice 集合
    • 進入創建代理對象的方法
  • org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy 創建代理對象->
    • 創建proxyFactory
    • 設置Advisor
    • 設置目標資源
    • 創建代理對象
  • org.springframework.aop.framework.ProxyFactory#getProxy(java.lang.ClassLoader) 獲取apoProxy ->
  • org.springframework.aop.framework.ProxyCreatorSupport#createAopProxy 獲取創建代理對象的factory ->
  • org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy 創建代理對象的factory ->
    • 判斷需要代理的類是否有接口
      • 有接口返回jdk proxyFactory
      • 不是的話返回cglib ProxyFactory
    • 默認走jdk proxyFactory
  • org.springframework.aop.framework.JdkDynamicAopProxy#getProxy(java.lang.ClassLoader) 真正創建代理對象的方法(只看jdk的)->
    • 獲取代理對象的接口
    • 設置equals和hashcode方法
    • 通過Proxy創建代理類

調用具體的方法

  • org.springframework.aop.framework.JdkDynamicAopProxy#invoke 代理對象的回調函數 ->

    因爲JdkDynamicAopProxy 實現了InvocationHandler ,所以只要找到當前類的invoke就可以了

    • 獲取目標對象
    • 獲取advise的鏈信息 org.springframework.aop.framework.adapter.DefaultAdvisorAdapterRegistry 類實現,並且保存到緩存
      • 包括
        • MethodBeforeAdviceAdapter 之前的操作
        • AfterReturningAdviceAdapter 之後的操作
        • ThrowsAdviceAdapter 異常的操作
      • 其他的攔截器
    • 循環切入點
    • 找到符合切入點的方法
    • 符合的話保存到集合

發起通知

  • org.springframework.aop.framework.ReflectiveMethodInvocation#proceed 反射執行調用

AOP 使用案例

  • 日誌監控
  • 事務處理
  • 權限處理