(version:spring-context-4.3.15.RELEASE)html
AbstractApplicationContext#refresh()spring
public void refresh() throws BeansException, IllegalStateException { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. // 1. 建立一个 BeanFactory 的实例(DefaultListableBeanFactory) // 2. 加载bean的定义 BeanDefinition,并注册到 beanFactory 中 // loadBeanDefinitions(beanFactory) --> registerBeanDefinitions() ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. // 给 beanFactory 作上些前期配置: // 1. 添加 BeanPostProcessor // 2. 注册一些能够解析的依赖和 bean,如:BeanFactory, ApplicationContext prepareBeanFactory(beanFactory); // Allows post-processing of the bean factory in context subclasses. // 容许子类对 beanFactory 对象作一些后置处理 postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. // 调用 beanFactoryPostProcessor,容许用户对 beanFactory 作修改(扩展点),好比添加、修改或删除 beanFactory 中注册的 BeanDefinition 等 // 按顺序调用:PriorityOrdered 类型的 --> Ordered 类型的 --> the rest invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. // 注册 beanPostProcessor 到 beanFactory 中 registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. // 初始化事件广播器 initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. // 完成 beanFactory 的初始化:解析 bean 的依赖,完成 bean 实例的初始化 finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); }
beanFactory 实例化后,会向 beanFactory 注册 bean 的定义 BeanDefinition。
最后 beanFactory 会进行初始化,执行 finishBeanFactoryInitialization(beanFactory) 时就开始了 bean 的生命周期app
bean 的生命周期:
1. 实例化 Instantiation
2. 属性赋值 Populate
3. 初始化 Initialization
4. 销毁 Destructionpost
实例化 -> 属性赋值 -> 初始化 -> 销毁
// 忽略了无关代码 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // Instantiate the bean. BeanWrapper instanceWrapper = null; if (instanceWrapper == null) { // 实例化阶段! instanceWrapper = createBeanInstance(beanName, mbd, args); } // Initialize the bean instance. Object exposedObject = bean; try { // 属性赋值阶段!填充 bean 属性:这一步主要是对bean的依赖属性进行注入(@Autowired) populateBean(beanName, mbd, instanceWrapper); // 初始化阶段! exposedObject = initializeBean(beanName, exposedObject, mbd); } }
BeanPostProcessor 和 BeanPostProcessor 执行顺序相同:this
PriorityOrdered 类型的 --> Ordered 类型的 --> the rest
参考:
https://www.jianshu.com/p/1dec08d290c1
http://www.javashuo.com/article/p-dfqsnysx-bz.htmlspa