spring基本工作原理如下:
1.查找bean配置文件
2.加载bean配置文件并解析生成中间表示BeanDefinition
3.注册beanDefinition
4.如果是单例或lazy-init=false,则直接生成bean
spring将
1.查找bean配置文件2.加载bean配置文件并解析生成中间表示BeanDefinition
3.注册beanDefinition这三部分开,可以提供更多的定制给用户。
spring将配置文件之类的文件资源抽象成一个Resource,封装了getInputStream,isClose等方法。
Resource有子类ClasspathResouce及FileSystemResource
Resouce解决了第一步查找bean配置文件的问题
接着要解决第二步载bean配置文件并解析生成中间表示BeanDefinition。
spring这个是通过BeanDefinitionReader(接口)去做。
BeanDefinitionReader有实现XmlBeanDefinitionReader等。
XmlBeanDefinitionReader有个参数为容器BeanRegistry用于存放解析后的BeanDefinition。
即BeanDefinitionReader可以分三步完成第二步任务:1.将Resource中的inputStream解析成xml的Dom形式 2.根据Dom,生成BeanDefinition 3.注册到BeanRegistry中
这里将resource解析成Dom是用另一个类DefaultDocumentLoader去做。解析xml生成BeanDefinition则交给:BeanDefinitionParserDelegate去做。
注册BeanDefinition就简单了,因为BeanRegitry容器是做为参数进入XmlBeanDefinitionReader的,所以直接调就可以了。
可以看出spring设计XmlBeanDefinitionReader类时,将这个类的职责分解,并将每一部分任务交给相应的类去做。
例子:
ClassPathResource res=new ClassPathResource("containerTest.xml"); //定位资源
DefaultListableBeanFactory factory=new DefaultListableBeanFactory(); //BeanRegistry容器
XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(factory); //
int n=reader.loadBeanDefinitions(res); //触发,XmlBeanDefinitionReader加载,解析配置文件,生成BeanDefinition的动作
B b=(B) factory.getBean("b");