• java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

  • java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

application中的bean加载

spring-bean加载

  • spring-bean加载

ioc体系中的bean的实例化及初始化

  • bean的生命周期
    bean-life.png

spring 容器的初始化主要分为

  1. 容器初始化阶段
  2. bean加载阶段
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public void refresh() throws BeansException, IllegalStateException {
//加锁
synchronized (this.startupShutdownMonitor) {
// 准备工作主
prepareRefresh();

// 加载(Xml)资源并解析,根据解析结果组装BeanDefinitions,然后初始化BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

// 配置beanfactory的类加载器以及后置处理器post-processors
prepareBeanFactory(beanFactory);

try {
// 如果bean 实现了 BeanFactoryPostProcessor
// 那么在容器初始化以后,Spring 会负责调用里面的 postProcessBeanFactory 方法
// 此时所有的类都已经加载完毕,但是还未初始化,可以用类似BeanFactoryProcessor接口实现类搞事情
// 顾名思义bean工厂后置过程
postProcessBeanFactory(beanFactory);
// 调用BeanFactoryPostPorcessor中的方法
invokeBeanFactoryPostProcessors(beanFactory);
// 注册 BeanPostProcessor
// 此接口两个方法: postProcessBeforeInitialization 和 postProcessAfterInitialization
// 两个方法分别在 Bean 初始化之前和初始化之后得到执行。注意,到这里 Bean 还没初始化
// finishBeanFactoryInitialization这里调用
registerBeanPostProcessors(beanFactory);
// 国际化....用到再说9,
initMessageSource();
// 初始化当前 ApplicationContext 的事件广播器
initApplicationEventMulticaster();
/**
* 模板方法,以添加特定的 context 刷新。
* 在初始化特殊的实例之前调用。在singleton初始化之前
* Called on initialization of special beans, before * instantiation of singletons.
* 刷新由子类实现。
*/
onRefresh();
// 注册事件监听器
registerListeners();
// 初始化所有的bean,lazy-init的除外
finishBeanFactoryInitialization(beanFactory);
// 广播事件,初始化完毕。
finishRefresh();
}
catch (BeansException ex) {
// 发生异常,销毁所有beans
// Destroy already created singletons to avoid dangling resources.
beanFactory.destroySingletons();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}
spring循环依赖问题
spring-概览
  1. 1. spring-bean加载
© 2023 haoxp
Hexo theme