摘要:本文学习了Spring容器的启动流程。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
Tomcat 8.5.50
Maven 3.6.3
Spring 5.2.25.RELEASE
1 基本流程
Spring容器的启动流程是围绕AnnotationConfigApplicationContext展开的,它是一个专门用于注解配置的应用程序上下文。
核心流程:
- 1 创建容器,初始化基本对象。
- 2 注册配置类。
- 3 启动容器刷新流程。
- 3.1 获取对象工厂,进行基础配置。
- 3.2 执行对象工厂后置处理器。
- 3.3 实例化对象。
- 3.3.1 获取对象名称列表。
- 3.3.2 遍历对象名称列表,根据对象名称判断是否工厂对象:
- 如果不是工厂对象,使用对象名称获取对象。
- 如果是工厂对象,使用工厂前缀获取对象,判断对象是否工厂类型:
- 如果是工厂类型,使用对象名称获取对象。
- 如果不是工厂类型,不作处理。
- 3.3.2.1 获取缓存对象,入参允许提前引用。
- 3.3.2.1.1 从一级缓存获取成熟对象:
- 如果成熟对象存在,返回对象。
- 如果成熟对象不存在,并且对象正在创建,继续获取缓存对象。
- 3.3.2.1.2 从二级缓存获取早期对象:
- 如果早期对象存在,返回对象。
- 如果早期对象不存在,并且入参允许提前引用,继续获取缓存对象。
- 3.3.2.1.3 对一级缓存加锁,保证并发安全。
- 3.3.2.1.4 再次从一级缓存和二级缓存获取对象:
- 如果对象存在,返回对象。
- 如果对象不存在,继续获取缓存对象。
- 3.3.2.1.5 从三级缓存获取代理工厂:
- 如果代理工厂不存在,返回空对象。
- 如果代理工厂存在,获取早期对象。
- 3.3.2.1.5.1 通过代理工厂获取早期对象,判断对象是否被代理:
- 如果没被代理,返回早期对象。
- 如果被代理,返回包装为代理对象的早期对象。
- 3.3.2.1.5.2 将早期对象放到二级缓存。
- 3.3.2.1.5.3 从三级缓存移除代理工厂。
- 3.3.2.2 判断缓存对象是否存在:
- 如果缓存对象存在,转换缓存对象,返回对象。
- 如果缓存对象不存在,继续创建对象。
- 3.3.2.3 根据对象名称检查是否正在创建原型对象:
- 如果正在创建原型对象,抛出循环依赖异常。
- 如果没有正在创建,或者不是原型对象,继续创建对象。
- 3.3.2.4 判断上级工厂是否存在,以及当前工厂是否包含对象定义:
- 如果上级工厂存在并且当前工厂不包含对象定义,使用上级工厂创建对象,返回对象。
- 如果上级工厂不存在,或者当前工厂包含对象定义,继续创建对象。
- 3.3.2.5 获取对象的显示依赖对象,遍历显示依赖对象,判断是否存在循环显示依赖:
- 如果存在循环显示依赖,抛出循环显示依赖异常。
- 如果不存在循环显示依赖,注册显示依赖关系,创建显示依赖对象,继续创建对象。
- 3.3.2.6 根据作用域使用不同策略创建对象:
- 如果是单例模式,获取单例对象,转换单例对象,返回对象。
- 如果是原型模式,创建原型对象,转换原型对象,返回对象。
- 如果是其他模式,通过作用域创建原型对象,转换原型对象,返回对象。
- 3.3.2.6.1 对一级缓存加锁,保证并发安全。
- 3.3.2.6.2 从一级缓存获取成熟对象:
- 如果成熟对象存在,返回对象。
- 如果成熟对象不存在,继续创建对象。
- 3.3.2.6.3 标记单例对象正在创建。
- 3.3.2.6.4 通过单例工厂创建单例对象。
- 3.3.2.6.4.1 判断对象后置处理器的执行结果:
- 如果对象存在,返回对象。
- 如果对象不存在,继续创建对象。
- 3.3.2.6.4.2 获取原始对象,完成原始对象的实例化。
- 3.3.2.6.4.3 判断是否需要提前释放对象,只有单例对象,并且允许循环依赖,并且对象正在创建,才允许提前释放对象:
- 如果不允许提前释放对象,继续创建对象。
- 如果允许提前释放对象,缓存代理工厂。
- 3.3.2.6.4.3.1 对一级缓存加锁,保证并发安全。
- 3.3.2.6.4.3.2 判断一级缓存是否存在成熟对象:
- 如果成熟对象存在,不作处理。
- 如果成熟对象不存在,缓存代理工厂。
- 3.3.2.6.4.3.2.1 将代理工厂放到三级缓存。
- 3.3.2.6.4.3.2.2 从二级缓存移除早期对象。
- 3.3.2.6.4.4 将暴露对象设置为原始对象。
- 3.3.2.6.4.5 填充属性值,成为早期对象:
- 如果没有引用对象的属性,不需要执行
3.3.2.X创建属性对象。
- 如果有引用类型的属性,需要执行
3.3.2.X创建属性对象。
- 3.3.2.6.4.6 初始化对象,成为成熟对象。
- 3.3.2.6.4.6.1 给对象注入容器相关信息。
- 3.3.2.6.4.6.2 执行对象后置处理器,在对象初始化之前执行。
- 3.3.2.6.4.6.3 执行对象初始化方法。
- 3.3.2.6.4.6.4 执行对象后置处理器,在对象初始化之后执行。
- 3.3.2.6.4.7 判断是否需要提前释放对象:
- 如果不允许提前释放对象,继续创建对象。
- 如果允许提前释放对象,需要执行
3.3.2.1获取缓存对象,入参不允许提前引用。
- 3.3.2.6.4.8 判断缓存对象是否存在:
- 如果缓存对象不存在,继续创建对象。
- 如果缓存对象存在,判断初始化对象是否存在代理:
- 如果不存在代理,暴露对象使用早期对象。
- 如果存在代理,判断有无实际注入依赖的其他对象:
- 如果有实际注入依赖的其他对象,抛出循环依赖异常。
- 如果没有实际注入依赖的其他对象,暴露对象使用存在代理的初始化对象。
- 3.3.2.6.4.9 返回暴露对象。
- 3.3.2.6.5 标记新的单例对象。
- 3.3.2.6.6 标记单例对象完成创建。
- 3.3.2.6.7 判断是否新的单例对象:
- 如果不是新的单例对象,返回对象。
- 如果是新的单例对象,缓存单例对象。
- 3.3.2.6.7.1 对一级缓存加锁,保证并发安全。
- 3.3.2.6.7.2 将成熟对象放到一级缓存。
- 3.3.2.6.7.3 从二级缓存移除早期对象。
- 3.3.2.6.7.4 从三级缓存移除代理工厂。
- 3.3.2.6.8 返回单例对象。
2 源码分析
2.1 容器实例化
从创建AnnotationConfigApplicationContext对象开始:
java1 2 3 4 5 6 7 8
| public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this(); register(componentClasses); refresh(); }
|
调用AnnotationConfigApplicationContext的this()方法,初始化基本对象:
java1 2 3 4 5 6
| public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); }
|
2.2 注册配置类
调用AnnotationConfigApplicationContext的register()方法,注册配置类:
java1 2 3 4
| public void register(Class<?>... componentClasses) { this.reader.register(componentClasses); }
|
调用AnnotatedBeanDefinitionReader的register()方法,注册配置类:
java1 2 3 4 5 6 7
| public void register(Class<?>... componentClasses) { for (Class<?> componentClass : componentClasses) { registerBean(componentClass); } }
|
2.3 刷新容器
2.3.1 启动流程
调用AbstractApplicationContext的refresh()方法,启动容器刷新流程,这是整个容器启动的核心:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { prepareRefresh(); ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); prepareBeanFactory(beanFactory); try { invokeBeanFactoryPostProcessors(beanFactory); registerBeanPostProcessors(beanFactory); registerListeners(); finishBeanFactoryInitialization(beanFactory); finishRefresh(); } catch (BeansException ex) { destroyBeans(); cancelRefresh(ex); throw ex; } finally { resetCommonCaches(); } } }
|
2.3.2 处理对象工厂
2.3.2.1 获取对象工厂
调用AbstractApplicationContext的obtainFreshBeanFactory()方法,获取对象工厂:
java1 2 3 4 5 6
| protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); return getBeanFactory(); }
|
2.3.2.2 配置对象工厂
调用AbstractApplicationContext的prepareBeanFactory()方法,配置对象工厂:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { beanFactory.setBeanClassLoader(getClassLoader()); beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); 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.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)); }
|
2.3.3 后置处理器
2.3.3.1 执行对象工厂后置处理器
调用AbstractApplicationContext的invokeBeanFactoryPostProcessors()方法,执行对象工厂后置处理器:
java1 2 3 4
| protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); }
|
2.3.3.2 注册对象后置处理器
调用AbstractApplicationContext的registerBeanPostProcessors()方法,注册对象后置处理器:
java1 2 3 4
| protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }
|
2.3.4 注册监听器
调用AbstractApplicationContext的registerListeners()方法,注册监听器:
java1 2 3 4 5 6 7 8 9 10 11
| protected void registerListeners() { for (ApplicationListener<?> listener : getApplicationListeners()) { getApplicationEventMulticaster().addApplicationListener(listener); } String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false); for (String listenerBeanName : listenerBeanNames) { getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); } }
|
2.3.5 实例化对象
调用AbstractApplicationContext的finishBeanFactoryInitialization()方法,实例化对象:
java1 2 3 4 5 6
| protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { beanFactory.freezeConfiguration(); beanFactory.preInstantiateSingletons(); }
|
调用DefaultListableBeanFactory的preInstantiateSingletons()方法,预创建对象:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public void preInstantiateSingletons() throws BeansException { List<String> beanNames = new ArrayList<>(this.beanDefinitionNames); for (String beanName : beanNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { if (isFactoryBean(beanName)) { Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); if (bean instanceof FactoryBean) { getBean(beanName); } } else { getBean(beanName); } } } }
|
调用AbstractBeanFactory的getBean()方法,获取对象:
java1 2 3 4
| public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); }
|
调用AbstractBeanFactory的doGetBean()方法,获取对象:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException { String beanName = transformedBeanName(name); Object bean; Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } BeanFactory parentBeanFactory = getParentBeanFactory(); if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { return parentBeanFactory.getBean( ... ); } try { RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd, beanName, args); String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { if (isDependent(beanName, dep)) { throw new BeanCreationException( ... ); } registerDependentBean(dep, beanName); getBean(dep); } } if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { destroySingleton(beanName); throw ex; } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } else if (mbd.isPrototype()) { Object prototypeInstance = null; try { beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } else { Object scopedInstance = scope.get(beanName, () -> { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } } catch (BeansException ex) { cleanupAfterBeanCreationFailure(beanName); throw ex; } } return (T) bean; }
|
2.3.5.1 获取缓存对象
调用DefaultSingletonBeanRegistry的getSingleton()方法,获取缓存对象:
java1 2 3 4
| public Object getSingleton(String beanName) { return getSingleton(beanName, true); }
|
调用DefaultSingletonBeanRegistry的getSingleton()方法,获取缓存对象:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { synchronized (this.singletonObjects) { singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null) { ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } } } return singletonObject; }
|
2.3.5.2 获取单例对象
调用DefaultSingletonBeanRegistry的getSingleton()方法,获取单例对象:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { synchronized (this.singletonObjects) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { beforeSingletonCreation(beanName); boolean newSingleton = false; try { singletonObject = singletonFactory.getObject(); newSingleton = true; } catch (IllegalStateException ex) { singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { throw ex; } } finally { afterSingletonCreation(beanName); } if (newSingleton) { addSingleton(beanName, singletonObject); } } return singletonObject; } }
|
2.3.5.3 缓存单例对象
调用DefaultSingletonBeanRegistry的addSingleton()方法,缓存单例对象:
java1 2 3 4 5 6 7 8 9 10 11 12 13
| protected void addSingleton(String beanName, Object singletonObject) { synchronized (this.singletonObjects) { this.singletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); this.earlySingletonObjects.remove(beanName); this.registeredSingletons.add(beanName); } }
|
2.3.6 创建对象
调用AbstractAutowireCapableBeanFactory的createBean()方法,创建对象:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14
| protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { RootBeanDefinition mbdToUse = new RootBeanDefinition(mbd); Object bean = resolveBeforeInstantiation(beanName, mbdToUse); if (bean != null) { return bean; } Object beanInstance = doCreateBean(beanName, mbdToUse, args); return beanInstance; }
|
调用AbstractAutowireCapableBeanFactory的doCreateBean()方法,创建对象:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); } Object bean = instanceWrapper.getWrappedInstance(); synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); mbd.postProcessed = true; } } boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); } Object exposedObject = bean; populateBean(beanName, mbd, instanceWrapper); exposedObject = initializeBean(beanName, exposedObject, mbd); if (earlySingletonExposure) { Object earlySingletonReference = getSingleton(beanName, false); if (earlySingletonReference != null) { if (exposedObject == bean) { exposedObject = earlySingletonReference; } else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) { String[] dependentBeans = getDependentBeans(beanName); Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length); for (String dependentBean : dependentBeans) { if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) { actualDependentBeans.add(dependentBean); } } if (!actualDependentBeans.isEmpty()) { throw new BeanCurrentlyInCreationException( ... ); } } } } registerDisposableBeanIfNecessary(beanName, bean, mbd); return exposedObject; }
|
调用DefaultSingletonBeanRegistry的addSingletonFactory()方法,缓存代理工厂:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14
| protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) { synchronized (this.singletonObjects) { if (!this.singletonObjects.containsKey(beanName)) { this.singletonFactories.put(beanName, singletonFactory); this.earlySingletonObjects.remove(beanName); this.registeredSingletons.add(beanName); } } }
|
2.3.7 填充属性值
调用AbstractAutowireCapableBeanFactory的populateBean()方法,填充属性值:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { int resolvedAutowireMode = mbd.getResolvedAutowireMode(); if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs); if (resolvedAutowireMode == AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } pvs = newPvs; } }
|
2.3.7.1 按名称自动装配
调用AbstractAutowireCapableBeanFactory的autowireByName()方法,按名称自动装配:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| protected void autowireByName(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) { String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); for (String propertyName : propertyNames) { if (containsBean(propertyName)) { Object bean = getBean(propertyName); pvs.add(propertyName, bean); registerDependentBean(propertyName, beanName); } } }
|
2.3.7.2 按类型自动装配
调用AbstractAutowireCapableBeanFactory的autowireByType()方法,按类型自动装配:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| protected void autowireByType(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) { TypeConverter converter = getCustomTypeConverter(); if (converter == null) { converter = bw; } Set<String> autowiredBeanNames = new LinkedHashSet<>(4); String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); for (String propertyName : propertyNames) { PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName); if (Object.class != pd.getPropertyType()) { MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd); boolean eager = !(bw.getWrappedInstance() instanceof PriorityOrdered); DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager); Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter); if (autowiredArgument != null) { pvs.add(propertyName, autowiredArgument); } for (String autowiredBeanName : autowiredBeanNames) { registerDependentBean(autowiredBeanName, beanName); } autowiredBeanNames.clear(); } } }
|
2.3.8 初始化对象
调用AbstractAutowireCapableBeanFactory的initializeBean()方法,初始化对象:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { invokeAwareMethods(beanName, bean); Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); } invokeInitMethods(beanName, wrappedBean, mbd); if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; }
|
3 流程归纳
3.1 普通情况
普通情况部分执行流程:
- 获取对象A。
- 获取缓存对象A,缓存不存在。
- 获取单例对象A。
- 通过单例工厂创建单例对象A。
- 允许提前释放对象A,将代理工厂放到三级缓存。
- 填充属性值,成为早期对象。
- 获取对象B。
- 获取缓存对象B,缓存不存在。
- 获取单例对象B。
- 通过单例工厂创建单例对象B。
- 允许提前释放对象B,将代理工厂放到三级缓存。
- 填充属性值,成为早期对象。
- 初始化对象,成为成熟对象。
- 允许提前释放对象B,从二级缓存获取早期对象。
- 将成熟对象放到一级缓存。
- 返回对象B。
- 初始化对象,成为成熟对象。
- 允许提前释放对象A,从二级缓存获取早期对象。
- 将成熟对象放到一级缓存。
- 返回对象A。
3.2 循环依赖
循环依赖部分执行流程:
- 获取对象A。
- 获取缓存对象A,缓存不存在。
- 获取单例对象A。
- 通过单例工厂创建单例对象A。
- 允许提前释放对象A,将代理工厂放到三级缓存。
- 填充属性值,成为早期对象。
- 获取对象B。
- 获取缓存对象B,缓存不存在。
- 获取单例对象B。
- 通过单例工厂创建单例对象B。
- 允许提前释放对象B,将代理工厂放到三级缓存。
- 填充属性值,成为早期对象。
- 获取对象A。
- 获取缓存对象A,从三级缓存获取代理工厂,将早期对象放到二级缓存。
- 返回对象A。
- 初始化对象,成为成熟对象。
- 允许提前释放对象B,从二级缓存获取早期对象。
- 将成熟对象放到一级缓存。
- 返回对象B。
- 初始化对象,成为成熟对象。
- 允许提前释放对象A,从二级缓存获取早期对象。
- 将成熟对象放到一级缓存。
- 返回对象A。
4 三级缓存
通过三级缓存解决循环依赖问题:
- singletonObjects:一级缓存,存放完成初始化的成熟对象。
- earlySingletonObjects:二级缓存,存放尚未完成填充属性值和初始化的早期对象。
- singletonFactories:三级缓存,存放完成实例化的代理工厂。
条