- 第一部分是关于读取配置文件,生成相应的对象
- 主要的接口其职责如下
- BeanFactory: 主要的方法是 getBean,可以根据bean的id去创建实例对象
- BeanDefiinition:这个接口主要用来保存reader类从配置文件中读取数后存放数据的地方,可以看成一个VO
- BeanDefiinitionRegistry:用来管理BeanDefinition们,可以想象它的实现类中应该维护了一个map,键为String,值为BeanDefinition
- Resource:职责是读取配置文件,然后返回一个Resource对象,目的是将不同的配置文件进行初步的封装,然后Reader类再来读取Resource类
- ApplicationContext:ApplicationContex是对以上这些接口的一个封装,省去了用户自己写Resource,Reader,BeanFactory的过程
- 主要的类及其职责如下
- DefaultBeanFactory:这个类同时实现了BeanFactory, BeanDefinitionRegistry,便有了管理beanDefinition的能力,和根据beanId去创建Bean实例的能力
- ClassPathXmlResource,FileSystemXmlResource:分别可以从不同的路径下读取配置文件,返回其inputStream
- GenericBeanDefinition,实现了BeanDefinition,从而具备了管理BeanDefinition的能力
- 关于ClassLoader的问题:当使用一个BeanId去创建出一个对象的时候,肯定是需要一个ClassLoader的,这个ClassLoader从哪里来?应不应该提供一个setClassLoader方法让用户自己设置?答案是:
- 写一个接口ConfigurableBeanFactory,继承BeanFactory接口,并且将setBeanClassLoader和getBeanClassLoader方法放在ConfigurableBeanFactory,DefaultBeanFactory实现ConfigurableBeanFactory接口,实现两个方法
- 但是用户使用BeanFactory的时候并不知道可以setBeanClassLoader,这个方法在哪里用到的呢?答案是AbstractApplicationContext,也就是ApplicationContext中,它提供了一个构造方法中就有参数是ClassLoader,在这个构造方法中设置了ClassLoader
- 关于ApplicationContext的问题:这个接口说是封装了第二点中提到的一些接口,但是它实际的运行机制是什么呢?
- ApplicationContext接口继承了ConfigurationBeanFactory接口,所以可以设置和获取BeanClassLoader
- ApplicationContext的实现类中持有了一个BeanFactory,这是很关键的,因为这样依赖ApplicationContext可以用Resource,Reader读取了配置文件之后将信息保存到它持有的那个BeanFactory中
- 问题1:GenericBeanDefinition和DefaultBeanFactory的关系是什么
lite-spring 学习总结(一)
最新推荐文章于 2024-08-03 22:53:08 发布