XML版本
核心類ClassPathXmlContextLoader的行為
- 讀取指定
.xml結(jié)尾文件的內(nèi)容, 獲取beanId和class屬性. - 創(chuàng)建一個Map, 將beanId作為key存入map中. 根據(jù)class的類路徑, 使用反射機制加載并新建類之后, 作為value存入map.
這里涉及到急加載和懶加載的實現(xiàn)
- 急加載中, 直接根據(jù)class屬性使用反射加載
- 懶加載中, value先存入class屬性, 也就是類路徑, 再到客戶端請求的時候再使用反射
交互
1.客戶端新建ClassPathXmlContextLoader加載xml文件
2.調(diào)用getBean(beanId)方法獲取map當中beanId對應(yīng)的value, 也就是我們的bean
Annotation版本
@ComponentScan核心步驟(IOC)
- 掃描指定包下所有類
- 判斷類上是否有相對應(yīng)注解, 返回
class的集合 - 使用反射機制尋找出所有
class的子包下面所有注解了@Component的類 - 使用反射機制初始化bean到容器中
@Resource核心步驟(DI)
1.使用反射機制, 獲取當前類所有屬性fields
2.判斷fields是否注解了@Resource
3.默認使用屬性名字作為beanId, 搜索容器中的bean
4.如果bean存在, 將bean賦值給field
- 注意點
在初始化完所有@Component的bean之后再初始化@Resource的屬性值. 避免有些屬性值獲取到?jīng)]有被初始化的bean, 報null