1、通过注解的方式启动:
1、创建AnnotationConfigApplicationContext对象,并传入要扫描的包路径;
2、创建AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner对象
3、通过ClassPathBeanDefinitionScanner的doScan方法,对目标路径进行扫描;
4、通过ClassPathScanningCandidateComponentProvider的findCandidateComponents
方法,将符合条件的class转为对应的BeanDefinition加入到集合中(匹配的过滤器并且是一个具
体的顶级类),然后设置其他属性,包装为BeanDefinitionHolder加入集合中,并注册到
DefaultListableBeanFactory的beanDefinitionMap中
5、通过AnnotationConfigUtils的registerAnnotationConfigProcessors方法,给
BeanFactory设置dependencyComparator和autowireCandidateResolver,然后将
ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、
CommonAnnotationBeanPostProcessor、org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor、
EventListenerMethodProcessor、DefaultEventListenerFactory都注册到
DefaultListableBeanFactory的beanDefinitionMap中
6、执行AbstractApplicationContext的refresh()启动;
7、通过prepareRefresh()方法记录启动的开始时间,设置closed和active标志位,在上下文环
境中初始化任何占位符属性源,验证所有标记为required的属性都是可解析的,初始化
earlyApplicationListeners、applicationListeners、earlyApplicationEvents属性
8、通过obtainFreshBeanFactory()方法高速子类去获取新的BeanFactory;
9、通过prepareBeanFactory(beanFactory)方法,设置BeanFactory的beanClassLoader、
beanExpressionResolver属性,添加ResourceEditorRegistrar到propertyEditorRegistrars中,
添加ApplicationContextAwareProcessor到beanPostProcessors中,
添加可以忽略的接口EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware到ignoredDependencyInterfaces中
通过DefaultListableBeanFactory的registerResolvableDependency方法将BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext加入到resolvableDependencies,
添加ApplicationListenerDetector到beanPostProcessors中,
添加LoadTimeWeaverAwareProcessor到beanPostProcessors中,
设置BeanFactory的tempClassLoader属性,
通过DefaultSingletonBeanRegistry的addSinleton方法将environment、systemProperties、systemEnvironment加入到singletonObjects和registeredSingletons中并从singletonFactories和earlySingletonObjects移除;
10、通过postProcessBeanFactory(beanFactory)方法,可以对BeanFactory进行后处理;
11、通过invokeBeanFactoryPostProcessors(beanFactory)方法,对beanFactoryPostProcessors中的BeanFactoryPostProcessor进行执行;
12、通过registerBeanPostProcessors(beanFactory)方法,把所有的BeanPostProcessor的类都添加到beanPostProcessors列表中;
13、通过initMessageSource()方法,注册MessageSource到BeanFactory中;
14、通过initApplicationEventMulticaster()方法,注册SimpleApplicationEventMulticaster到BeanFactory中;
15、通过onRefresh()方法,在特定的上下文子类中初始化其他特殊bean;
16、通过registerListeners()方法,遍历applicationListeners集合,将所有的ApplicationListener添加到ApplicationEventMulticaster中,遍历earlyApplicationEvents中的所有ApplicationEvent事件,并通过线程池执行对象的监听器的方法;
17、通过finishBeanFactoryInitialization(beanFactory)方法,实例化所有非延迟初始化的单例bean,给BeanFactory设置ConversionService,注册一个默认的StringValueResolver,初始化LoadTimeWeaverAware,
冻结所有的beanDefinitionNames中的bean,
18、通过preInstantiateSingletons()方法,遍历beanDefinitionNames中所有注册的bean,得到合并后的RootBeanDefinition,并都添加到mergedBeanDefinitions中,调用getBean方法,为所有的SmartInitializingSingleton执行afterSingletonsInstantiated方法回调;
19、通过finishRefresh()方法,清除上下文级别的资源缓存resourceCaches,初始化DefaultLifecycleProcessor,启动所有的Lifecycle,发布ContextRefreshedEvent事件, 如果激活,则参与LiveBeansView MBean;
20、清除所有的缓存。
2、单独分析下getBean中的逻辑(通过name的三个)
都是调用了doGetBean(final String name, @Nullable final Class<T>requiredType,@Nullable final Object[] args, boolean typeCheckOnly)方法;
1、对name进行转换;
2、先从singletonObjects里找,找不到并且在singletonsCurrentlyInCreation存在,就从earlySingletonObjects里找,再找不到就去singletonFactories找,找不到返回,否则,将放到earlySingletonObjects中,并从singletonFactories删除。
3、如果第2步中找到,并且没有参数,直接调用getObjectForBeanInstance得到实例对象;
4、第2步中没有找到,获取当前上下文的父类BeanFactory,通过parentBeanFactory调用getBean获取实例对象;
5、在alreadyCreated不存在,从mergedBeanDefinitions移除该beanName,并添加到alreadyCreated中;
6、如果有依赖的bean,注册依赖的bean到dependentBeanMap和dependenciesForBeanMap,并调用getBean;
7、如果是单例,先从singletonObjects里找,找到返回,否则,不在inCreationCheckExclusions中并添加到singletonsCurrentlyInCreation中,调用createBean方法得到实例对象,然后在singletonsCurrentlyInCreation移除,最后添加到singletonObjects中;调用getObjectForBeanInstance;
8、如果是Prototype,给prototypesCurrentlyInCreation设置值,调用createBean,移除prototypesCurrentlyInCreation的值,调用getObjectForBeanInstance;
9、如果类型不匹配,进行类型转换;
10、返回该bean。
3、单独分析createBean中逻辑
1、通过类加载器或Class反射得到Class对象;
2、准备方法重载;
3、执行实例化前的回调postProcessBeforeInstantiation
4、doCreateBean逻辑:
1、如果是单例则首先需要从factoryBeanInstanceCache中清除缓存;
2、实例化bean,将BeanDefinition转换为BeanWrapper;
obtainFromSupplier;
通过工厂方法;
构造函数自动注入;
默认构造函数构造;
3、执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法,bean合并后的处理;
4、循环依赖处理;
5、属性填充,将所有属性填充至bean的实例中;
6、bean的初始化;
7、非单例的循环依赖检查;
8、注册DisposableBean;
9、完成创建并返回。