先從基礎開始造:
一.接口和類之間的關系圖
二:任務:將xml中定義的bean全部交給spring容器進行管理捡遍;實現(xiàn):1??利用Dom4j解析xml文件生成BeanDefinition虽抄,2??獲取bean實例的時候通過反射進行獲取
三:單一指責(SRP) ?對于一個類來說航夺,應該僅有一個引起它變的原因餐弱,如果有多余一個動機去改變一個類的話,這個類就具有多余一個指責烹吵,把多個指責耦合一起的話打颤,一個變化可能會消弱這個類完成其他職責的能力。
四:基于單一指責于个,各個類的主要職責為:
1??XmlBeanDefinitionReader:主要職責是通Dom4j解析xml氛魁,為spring容器生成一個個BeanDefinition
依賴:BeanDefinitionRegistry, 通過構造方法傳入,該類有兩個方法秀存,獲取BeanDefinition和注冊BeanDefinition
方法:
該方法傳入一個Resource實例捶码,里面有一個獲取輸入流的方法;其實現(xiàn)類為FileSystemResource和ClassPathResource
FileSystemResource是從系統(tǒng)文件中獲取xml或链;ClassPathResource是從項目的資源文件中獲取xml
2??BeanFactory:是個接口惫恼,里面就一個方法,根據傳入的beanID獲取bean實例
該類有兩個現(xiàn)實:ConfigurableBeanFactory和AbstractApplictionContext澳盐;ConfigurableBeanFactory中可以設置ClassLoader,這個ClassLoader主要用在通過反射創(chuàng)建bean實例和讀取classpath下的資源祈纯,如果不傳有個默認值
3??DefaultBeanFactory:該類是集大成者,繼承DefaultSingletonBeanRegistry,實現(xiàn)BeanDefinitionRegistry類中注冊BeanDefiniton的方法和ConfigurableBeanFactory設置ClassLoader的方法
4??DefaultSingletonBeanRegistry:spring單例實現(xiàn)的類叼耙,實現(xiàn)SingletonBeanRegistry
5??ApplicationContext:提供給用戶使用的類腕窥,一般用戶通過這個獲取bean,有兩個實例ClassPathXmlApplication與FileSystemXmlApplicationContext筛婉;為了減小兩個實現(xiàn)類中的代碼重復簇爆,使用模版方法,加一個中間抽象類AbstractApplicationContext倾贰,有個抽象方法根據路徑獲取Resource
AbstractApplicationContext封裝了DefaultBeanFactory(注冊BeanDefinition,獲取bean實例)拦惋,封裝了XmlBeanDefinitionReader解析xml文件匆浙;
然后ClassPathXmlApplication與FileSystemXmlApplicationContext只需要繼承AbstractApplicationContext,實現(xiàn)其中的抽象方法getResourceByPath;
五:測試:對ApplicationContext、BeanFactory厕妖、Resource進行測試首尼;具體見git:https://gitee.com/zhouyanxu/createSpring.git
六:未完待續(xù),有時間再看再寫:
如何實現(xiàn):注解比如@setter注入言秸,構造函數(shù)注入等以及Aop實現(xiàn)