spring ioc
//容器的注册和刷新
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
register(annotatedClasses);
refresh();
}
-
prepareRefresh():刷新前的预刷新
- initPropertySources():初始化一些属性设置;子类自定义个性化属性设置方法
- getEnvironment().validateRequiredProperties():检验属性的合法性
- this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中的一些早期的事件
-
obtainFreshBeanFactory():获取beanFactory实例
- refreshBeanFactory():刷新或创建beanFactory【DefaultListAbleBeanFactory】
- getBeanFactory():将刚生成的GenericApplicationContext创建的beanFactory返回
- 将创建的BeanFactory【DefaultListAbleBeanFactory】返回
-
prepareBeanFactory(beanFactory):beanFactory预准备工作,(以上创建的beanFactory好多属性并没有值,只有一些默认的值)。
-
beanFactory.setBeanClassLoader(getClassLoader()):设置BeanFactory的类加载器
-
添加BeanExpressionResolver【StandardBeanExpressionResolver】:支持相关的表达式语言的解析
-
添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
-
ignoreDependencyInterface:设置忽略的自动装配接口:EnvironmentAware等
-
registerResolvableDependency:注册可以解析的自动装配:我们能直接在任何组件中自动注入BeanFactory ApplicationContext等
-
添加BeanPostProcessor【ApplicationListenerDetector】:Register early post-processor for detecting inner beans as ApplicationListeners.添加监听检测的处理器
-
添加编译时的AspectJ
-
给BeanFactory中注册一些能用的组件:environment【ConfigurableEnvironment】等
-
-
postProcessBeanFactory(beanFactory):BeanFactory准备工作完成后进行的后置处理工作。
- 子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的处理
-
invokeBeanFactoryPostProcessors:BeanFactory标准初始化之后执行的。
主要有2个接口:BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor- BeanFactoryPostProcessors的方法:
- 先执行BeanDefinitionRegistryPostProcessor 获取实现PriorityOrdered的优先处理
- 获取bean
- invokeBeanFactoryPostProcessors 执行内部的BeanFactory处理器
- BeanFactoryPostProcessors同理
- BeanFactoryPostProcessors的方法:
-
注册普通的registerBeanPostProcessors(基本同上)
-
initMessageSource初始化MessageSource资源国际化处理,消息解析绑定。messageSource:判断容器中是否有id未messageSource,如果没有的话自己创建一个new DelegatingMessageSource并注册到singletonObject Map
-
initApplicationEventMulticaster() 初始化事件派发器/广播器SimpleApplicationEventMulticaster
-
onRefresh();子类可以重新这个方法,在容器刷新的时候自定义逻辑
-
registerListeners()
- 注册事件监听getApplicationEventMulticaster().addApplicationListener(listener)
- 派发早期事件getApplicationEventMulticaster().multicastEvent(earlyEvent);
-
finishBeanFactoryInitialization()//初始化容器中所有的单实例bean(非懒加载)
- beanFactory.preInstantiateSingletons(); // Instantiate all remaining (non-lazy-init) singletons.
- getMergedLocalBeanDefinition(beanName); 获取bean的定义信息,依次进行创建和初始化
- doGetBean
- getSingleton(beanName); 先获取我们map缓存中保存的实例bean,如果这个bean第二次来拿,就直接从缓存map中拿到
- markBeanAsCreated(beanName); 标记当前bean已经或正在被创建,!this.alreadyCreated.contains(beanName),进行标记
- 获取当前bean依赖的其他的bean,如果存在的话使用getBean从容器中拿出来。
- resolveBeforeInstantiation(beanName, mbdToUse); // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.尝试返回一个代理bean
- Object beanInstance = doCreateBean(beanName, mbdToUse, args); 开始创建bean实例
- populateBean(beanName, mbd, instanceWrapper) 属性赋值
- initializeBean(beanName, exposedObject, mbd) bean前后处理器执行地方,AOP动态代理增强的入口
- beanFactory.preInstantiateSingletons(); // Instantiate all remaining (non-lazy-init) singletons.
-
finishRefresh(); Last step: publish corresponding event.
protected void finishRefresh() {
// Clear context-level resource caches (such as ASM metadata from scanning).
clearResourceCaches();
// Initialize lifecycle processor for this context.
initLifecycleProcessor(); //bean生命周期
// Propagate refresh to lifecycle processor first.
getLifecycleProcessor().onRefresh();
// Publish the final event.
publishEvent(new ContextRefreshedEvent(this));
// Participate in LiveBeansView MBean, if active.
LiveBeansView.registerApplicationContext(this);
}