Spring IOC 和 AOP 部分原始碼分析

2021-09-26 15:26:00 字數 2847 閱讀 9369

為beanfactory 物件執行後續處理 -

在上下文context中註冊bean

為bean註冊攔截處理器(aop相關)

初始化上下文訊息

初始化事件多播

初始化主題資源

註冊自定義***

例項化所有非lazy-init 的singleton 例項

發布相應事件

public

void

refresh()

throws bean***ception, illegalstateexception

catch

(bean***ception var9)

this

.destroybeans()

;this

.cancelrefresh

(var9)

;throw var9;

}finally

}}

面向切面程式設計,底層原理是動態**實現.

如果切面策略目標有介面實現,使用jdk動態**技術;無介面則使用cglib技術生成動態**.

public object invoke

(object proxy, method method, object[

] args)

throws throwable

if(method.

getdeclaringclass()

== decoratingproxy.

class

)// 定義返回結果資料的引用

object retval;if(

!this

.advised.opaque && method.

getdeclaringclass()

.isinte***ce()

&& method.

getdeclaringclass()

.isassignablefrom

(advised.

class))

if(this

.advised.exposeproxy)

// 獲取目標物件的類物件

target = targetsource.

gettarget()

; class<

?> targetclass = target != null ? target.

getclass()

: null;

// 獲取**需要在目標方法執行前後,切入的***鏈.

list

chain =

this

.advised.

getinterceptorsanddynamicinterceptionadvice

(method, targetclass);if

(chain.

isempty()

)else

// 獲取目標物件中方法的返回結果型別.

class<

?> returntype = method.

getreturntype()

;if(retval != null && retval == target && returntype != object.

class

&& returntype.

isinstance

(proxy)

&&!rawtargetaccess.

class

.isassignablefrom

(method.

getdeclaringclass()

))else

if(retval == null && returntype != void.type && returntype.

isprimitive()

) object var13 = retval;

return var13;

} var9 =

this

.equals

(args[0]

);}finally

if(setproxycontext)

}return var9;

}

list chain = this.advised.getinterceptorsanddynamicinterceptionadvice(method, targetclass);

advisedsupport.getinterceptorsanddynamicinterceptionadvice()

如果***鏈為空即**物件沒有需要切入的***,則執行目標物件中的方法.

public list

getinterceptorsanddynamicinterceptionadvice

(method method,

@nullable class<

?> targetclass)

return cached;

}

methodinvocation invocation = new reflectivemethodinvocation(proxy, target, method, args, targetclass, chain);

retval = invocation.proceed();

按照順序執行攔截**和目標物件中的方法.

public object proceed()

throws throwable

else

else

}}

Spring IOC和DI以及AOP理解

這三個概念可能大家都不陌生,在面試中經常會出現關於此類的問題,關於對他們的個人理解如下。ioc其實就是控制反轉,控制指的是物件的建立 管理 例項化權利,反轉指的是控制權交給了外部容器spring框架,打個比喻,我在專案中創造了乙個物件類,在業務層需要用到他了,一般的辦法是什麼?是不是new物件啊,畢...

對於Spring IOC 和 AOP 簡單理解

ioc inversion of controll,控制反轉 是一種設計思想,將原本在程式中手動建立物件的控制權,交由給spring框架來管理。ioc容器是spring用來實現ioc的載體,ioc容器實際上就是乙個map key,value map中存放的是各種物件。這樣可以很大程度上簡化應用的開發...

Spring IOC部分總結

di dependency injection 依賴注入 在spring框架負責建立bean物件時,動態的將依賴物件注入到baen元件 testold 例子 建立userservice,實現userserviceimpl 建立單元測試 test 相當於new 物件 並且賦值 bean的作用域 單例和...