Spring (五) - 容器的功能扩展

Spring (五) - 容器的功能扩展

使用 BeanFactory 加载 XML:

1
BeanFactory bf = new DefaultListableFactory(new ClassPathResource("beanFactoryTest.xml"));

使用 ApplicationContext 加载 XML:

1
ApplicationContext bf = new ClassPathXmlApplicationContext("beanFactoryTest.xml");

支持将配置文件路径以数组的方式传入:

1
2
3
4
// ClassPathXmlApplicationContext.java
public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
this(new String[] {configLocation}, true, null);
}
1
2
3
4
5
6
7
8
9
// AbstractRefreshableConfigApplicationContext.java
public void setConfigLocations(String... locations) {
if (locations != null) {
this.configLocations = new String[locations.length];
for (int i = 0; i < locations.length; i++) {
this.configLocations[i] = resolvePath(locations[i]).trim();
}
}
}

设置了路径之后,便可以根据路径做配置文件的解析以及各种功能的实现了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// AbstractApplicationContext.java

@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 对系统属性或者环境变量进行准备及验证
prepareRefresh();
// 初始化 BeanFactory,并进行 XML 文件读取
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 对 BeanFactory 进行各种功能填充
// @Qualifier 与 @Autowired 应该是大家非常熟悉的注解
prepareBeanFactory(beanFactory);
try {
// 空实现,方便程序员做进一步业务扩展
postProcessBeanFactory(beanFactory);
// 激活各种 BeanFactory 处理器
invokeBeanFactoryPostProcessors(beanFactory);
// 注册拦截 Bean 创建的 Bean 处理器,这里只是注册,真正的调用是在 getBean 的时候
registerBeanPostProcessors(beanFactory);
// 为上下文初始化 Message 源,即国际化处理
initMessageSource();
// 初始化应用消息广播器
initApplicationEventMulticaster();
// 留给子类来初始化其他的 Bean
onRefresh();
// 在所有注册的 Bean 中查找 Listener Bean,并注册到消息广播中
registerListeners();
// 初始化剩下的单实例
finishBeanFactoryInitialization(beanFactory);
// 通知生命周期处理器刷新过程,同时发出事件通知别人
finishRefresh();
} catch (BeansException ex) {
// ...
}
}
}

推荐文章