1、Spring初始化,进入AbstractApplicationContext的refresh方法
@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { 前置准备工作 prepareRefresh(); 创建BeanFactory,加载数据到BeanFactory中,对象为实现BeanDefinition接口的对象 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); 对BeanFactory做一定增强,这里添加了BeanPostProcessor prepareBeanFactory(beanFactory); try { 空方法,子类重写,ServletWebServerApplicationContext就重写了该方法 postProcessBeanFactory(beanFactory); 执行实现BeanFactoryPostProcessor的bean的postProcessBeanFactory方法,注解如Import,ComponentScan就是在这里处理的 invokeBeanFactoryPostProcessors(beanFactory); 注册自定义实现BeanPostProcessor接口的类,创建Bean的时候会执行前置后置方法 registerBeanPostProcessors(beanFactory); 初始化信息,国际化 initMessageSource(); initApplicationEventMulticaster(); 子类实现,ServletWebServerApplicationContext就重写了该方法 onRefresh(); 注册监听 registerListeners(); 真正开始创建bean finishBeanFactoryInitialization(beanFactory); bean创建成功,发出通知 finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) {} destroyBeans(); cancelRefresh(ex); throw ex; } finally { resetCommonCaches(); } } }2、Bean创建的大体流程
总结根据上面的流程可知:
1,通过继承AbstractApplicationContext可以实现自定义的bean注册过程,可以重写AbstractApplicationContext多个空方法扩充容器功能,如ServletWebServerApplicationContext就是通过重写postProcessBeanFactory,onRefresh,finishRefresh方法实现了嵌套tomcat,Jetty,undertom容器的功能;
2、实现BeanFactoryPostProcessor接口可以对为初始化bean的容器进行一定的前置操作;
3、实现BeanPostProcessor接口的Bean可以对所有的bean在初始化前后进行一定的操作;
4、实现ResourceLoaderAware,ApplicationEventPulisherAware,MessageSourceAware,ApplicationContextAware接口可以对ApplicationContext容器做修改,其实也就是可以改Bean
5、实现BeanFactoryAware接口的Bean可以对BeanFactory做一定的修改;
6、Spring只能解决注入的循环依赖,构造方法的循环依赖不能处理;