这段时间在debug研究Spring框架的源码,发现AbstractApplicationContext有两个分支,分别为AbstractRefreshableApplicationContext和GenericApplicationContext,前者是我最近研究源码的主线,后者没有关注过,特此记录,使用IDEA看看两个分支的继承结构
AbstractApplicationContext
AbstractRefreshableApplicationContext
GenericApplicationContext
从源码发现几个特性。
- 内部就持有一个DefaultListableBeanFactory实例,并且没有指定bean定义信息来源方式
- 该类实现了BeanDefinitionRegistry,目的就是可以用来定义不同的BeanDefinitionReader实例
- AbstractRefreshableApplicationContext及子类的每次refresh都是先清除已有(如果不存在就创建)的容器,然后再重新创建,GenericApplicationContext是初始化的时候就创建容器,往后的每次refresh都不会更改
- AbstractRefreshableApplicationContext及子类无法做到GenericApplicationContext混合搭配从不同源头获取bean的定义信息
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));
PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx);
propReader.loadBeanDefinitions(new ClassPathResource("otherBeans.properties"));
ctx.refresh();
如下是关于不同bean定义信息来源方式对应不同的reader