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