没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
从 Dubbo 启动看 Dubbo 和 Spring 的关系
Spring 启动过程写的过于冗杂,如果对于这部分不感兴趣可以直接跳到
Dubbo 和 Spring 的关系,依然能够愉快的阅读。
Spring 启动过程
第一步:
ClassPathXmlApplicationContext 的构造方法:
1. public class ClassPathXmlApplicationContext extends
AbstractXmlApplicationContext {
2. private Resource[] configResources;
3.
4. //
如果已经有
ApplicationContext
并需要配置成父子关系,那么调用这个构造方法
5. public ClassPathXmlApplicationContext(ApplicationContext parent) {
6. super(parent);
7. }
8. ...
9. public ClassPathXmlApplicationContext(String[] configLocations,
boolean refresh, ApplicationContext parent)
10. throws BeansException {
11.
12. super(parent);
13. //
根据提供的路径,处理成配置文件数组
(
以分号、逗号、空格、
tab
、换行符分割
)
14. setConfigLocations(configLocations);
15. if (refresh) {
16. refresh(); //
核心方法
17. }
18. }
19. ...
20.}
接下来,就是 refresh(),将原来的 ApplicationContext 销毁,然后重新执行
一次初始化操作。
1. @Override
2. public void refresh() throws BeansException, IllegalStateException {
3. //
来个锁,不然
refresh()
还没结束,你又来个启动或销毁容器的操作,那不就乱
套了嘛
4. synchronized (this.startupShutdownMonitor) {
5.
6. //
准备工作,记录下容器的启动时间、标记
“
已启动
”
状态、处理配置文件中的占
位符
7. prepareRefresh();
8.
9. //
这步比较关键,这步完成后,配置文件就会解析成一个个
Bean
定义,注册到
BeanFactory
中,
10. //
当然,这里说的
Bean
还没有初始化,只是配置信息都提取出来了,
11. //
注册也只是将这些信息都保存到了注册中心
(
说到底核心是一个
beanName->
beanDefinition
的
map)
12. ConfigurableListableBeanFactory beanFactory =
obtainFreshBeanFactory();
13.
14. //
设置
BeanFactory
的类加载器,添加几个
BeanPostProcessor
,手动注册几
个特殊的
bean
15. //
这块待会会展开说
16. prepareBeanFactory(beanFactory);
17.
18. try {
19. //
【这里需要知道
BeanFactoryPostProcessor
这个知识点,
Bean
如果实
现了此接口,
20. //
那么在容器初始化以后,
Spring
会负责调用里面的
postProcessBeanFactory
方法。】
21.
22. //
这里是提供给子类的扩展点,到这里的时候,所有的
Bean
都加载、注册完
成了,但是都还没有初始化
23. //
具体的子类可以在这步的时候添加一些特殊的
BeanFactoryPostProcessor
的实现类或做点什么事
24. postProcessBeanFactory(beanFactory);
25. //
调用
BeanFactoryPostProcessor
各个实现类的
postProcessBeanFactory(factory)
方法
26. invokeBeanFactoryPostProcessors(beanFactory);
27.
28. //
注册
BeanPostProcessor
的实现类,注意看和
BeanFactoryPostProcessor
的区别
29. //
此接口两个方法
: postProcessBeforeInitialization
和
postProcessAfterInitialization
30. //
两个方法分别在
Bean
初始化之前和初始化之后得到执行。注意,到这里
Bean
还没初始化
31. registerBeanPostProcessors(beanFactory);
32.
33. //
初始化当前
ApplicationContext
的
MessageSource
,国际化这里就不
展开说了,不然没完没了了
34. initMessageSource();
35.
36. //
初始化当前
ApplicationContext
的事件广播器,这里也不展开了
37. initApplicationEventMulticaster();
38.
39. //
从方法名就可以知道,典型的模板方法
(
钩子方法
)
,
40. //
具体的子类可以在这里初始化一些特殊的
Bean
(在初始化
singleton
beans
之前)
41. onRefresh();
42.
43. //
注册事件监听器,监听器需要实现
ApplicationListener
接口。这也不是
我们的重点,过
44. registerListeners();
45.
46. //
重点,重点,重点
47. //
初始化所有的
singleton beans
48. //
(
lazy-init
的除外)
49. finishBeanFactoryInitialization(beanFactory);
50.
51. //
最后,广播事件,
ApplicationContext
初始化完成
52. finishRefresh();
53. }
54.
55. catch (BeansException ex) {
56. if (logger.isWarnEnabled()) {
57. logger.warn("Exception encountered during context
initialization - " +
58. "cancelling refresh attempt: " + ex);
59. }
60.
61. // Destroy already created singletons to avoid dangling
resources.
62. //
销毁已经初始化的
singleton
的
Beans
,以免有些
bean
会一直占用资源
63. destroyBeans();
64.
65. // Reset 'active' flag.
66. cancelRefresh(ex);
67.
68. //
把异常往外抛
69. throw ex;
70. }
71.
72. finally {
73. // Reset common introspection caches in Spring's core, since we
74. // might not ever need metadata for singleton beans anymore...
75. resetCommonCaches();
76. }
77. }
78.}
创建 Bean 容器前的准备工作:
1. protected void prepareRefresh() {
2. //
记录启动时间,
3. //
将
active
属性设置为
true
,
closed
属性设置为
false
,它们都是
AtomicBoolean
类型
4. this.startupDate = System.currentTimeMillis();
5. this.closed.set(false);
6. this.active.set(true);
7.
8. if (logger.isInfoEnabled()) {
9. logger.info("Refreshing " + this);
10. }
11.
12. // Initialize any placeholder property sources in the context
environment
13. initPropertySources();
14.
15. //
校验
xml
配置文件
16. getEnvironment().validateRequiredProperties();
17.
18. this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();
剩余86页未读,继续阅读
资源评论
wxb0cf756a5ebe75e9
- 粉丝: 20
- 资源: 283
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功