Spring源码-AbastractApplicationContext.refresh()
1.prepareRefresh()
刷新前的准备
- 设置容器的启动时间
- 设置活跃状态为true
- 设置关闭状态为false
- *getEnvironment()*获取环境对象,验证所需属性文件是否都已放入环境中
- 准备监听器和事件的集合对象 ,默认为空的集合
2.obtainFreshBeanFactory()
- 创建容器对象:ConfigurableListableBeanFactory
- 加载xml配置文件的属性值到当前工厂中,最重要的是BeanDefinition
2.1.refreshBeanFactory()
创建容器对象:DefaultListableBeanFactory并设置一些BeanDefinition
//创建DefaultListableBeanFactory对象
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
//设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
customizeBeanFactory(beanFactory);
//XML文件读取及解析
loadBeanDefinitions(beanFactory);
ListableBeanFactory:实现此接口的bean factories可以枚举它们的所有的bean instances
HierarchicalBeanFactory:
- 所有要应用到有层级体系的容器类(有父BeanFactory的那种),都应该实现此接口
- 此接口的getParentBeanFactory方法可以得到此BeanFactory的父BeanFactory,但是设置一个BeanFactory的父BeanFactory的方法却没有在此接口中,而是在ConfigurableBeanFactory中
2.2.getBeanFactory()
获取容器对象:ConfigurableListableBeanFactory
1.3.prepareBeanFactory()
初始化BeanFactory:进行BeanFactory中的属性设置
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// Tell the internal bean factory to use the context's class loader etc.
// 设置beanFactory的classloader为当前context的classloader
beanFactory.setBeanClassLoader(getClassLoader());
// 设置beanfactory的表达式语言处理器
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
// 为beanFactory增加一个默认的propertyEditor,这个主要是对bean的属性等设置管理的一个工具类
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// Configure the bean factory with context callbacks.
// 添加beanPostProcessor,ApplicationContextAwareProcessor此类用来完成某些Aware对象的注入
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
// 设置要忽略自动装配的接口,很多同学理解不了为什么此处要对这些接口进行忽略,原因非常简单,这些接口的实现是由容器通过set方法进行注入的,
// 所以在使用autowire进行注入的时候需要将这些接口进行忽略
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
// BeanFactory interface not registered as resolvable type in a plain factory.
// MessageSource registered (and found for autowiring) as a bean.
// 设置几个自动装配的特殊规则,当在进行ioc初始化的如果有多个实现,那么就使用指定的对象进行注入
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
// Register early post-processor for detecting inner beans as ApplicationListeners.
// 注册BPP
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// Detect a LoadTimeWeaver and prepare for weaving, if found.
// 增加对AspectJ的支持,在java中织入分为三种方式,分为编译器织入,类加载器织入,运行期织入,编译器织入是指在java编译器,采用特殊的编译器,将切面织入到java类中,
// 而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面,运行期织入则是采用cglib和jdk进行切面的织入
// aspectj提供了两种织入方式,第一种是通过特殊编译器,在编译器,将aspectj语言编写的切面类织入到java类中,第二种是类加载期织入,就是下面的load time weaving,此处后续讲
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
// Set a temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
// Register default environment beans.
// 注册默认的系统环境bean到一级缓存中
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
}
1.4.postProcessBeanFactory()
扩展实现方法,默认不做操作
1.5.invokeBeanFactoryPostProcessors()
实例化并按顺序执行BeanFactoryPostProcessor:增强BeanDefinition信息
1.6.registerBeanPostProcessors()
注册BeanPostProcessor
1.7.initMessageSource()
国际化处理:为上下文初始化message源,即不同语言的消息体
1.8.initApplicationEventMulticaster()
初始化事件监听多路广播器
1.9.onRefresh()
扩展实现方法,默认不做操作
SpringBoot此处会创建启动tomcat容器
1.10.registerListeners()
注册监听器:在所有注册的bean中查找listener bean,注册到消息广播器中
1.11.finishBeanFactoryInitialization()
实例化、初始化剩下的非懒加载的单实例(单例对象)
- 实例化,先通过反射创建对象 createBeanInstance 获取所有的构造器,如果有进行实例化(determineConstructorsFromBeanPostProcessors)
- InstantiateBean 获取实例化策略 getinstantiationStrategy().instantiate() cglib
- 获取bean的构造器,通过newInstance获取bean对象,但是此时是半初始化状态
- addsingletonfactory解决循环依赖问题(BeanPostprocessors)
- popluteBean 对bean进行填充属性
- invokeAwareMethods 填充一些aware接口属性
- applyBeanPostProcessorsBeforeInitialization 包含n多个对象,要挨个处理
- invokeinitMethod
- applyBeanPostProcessorsAfterInitialization 对象创建完毕
- registerdisposableBeanIfNecessary钩子函数,当bean需要销毁时,执行销毁
- AfterSingleCreation移除缓存中对bean加载状态的记录对应开头的beforesinglecreation记录当前bean的加载状态
- addsingleton防止循环依赖
- 首先会生成对象并且判断是不是factoryBean,会调用getObject返回再对象
1.12.finishRefresh()
完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
1.13.resetCommonCaches()
重置缓存
重置Spring的常见反射元数据缓存,特别是ReflectionUtils, AnnotationUtils, ResolvableType和CachedIntrospectionResults缓存重置Spring的常见反射元数据缓存,特别是ReflectionUtils, AnnotationUtils, ResolvableType和CachedIntrospectionResults缓存