Spring 容器的初始化流程包含以下几个步骤:
总览
我们知道,启动Spring容器实质上就是创建一个ApplicationContext
的上下文对象,这个对象描述了Spring容器的基本操作,包括资源的加载(ResourcePatternResolver
)、Bean的创建(ListableBeanFactory
, HierarchicalBeanFactory
)、应用环境的获取(EnvironmentCapable
)、应用的事件推送(ApplicationEventPublisher
)等。
而该接口最重要的抽象实现AbstractApplicationContext
,因为所有容器的初始化流程都是委托到这个类的refresh()
方法中。可以说弄清楚了AbstractApplicationContext.refresh()
方法,就弄清楚了Spring容器初始化的整个流程。
由于整个流程涉及的代码和流程分析较多,所以一共会拆分为上中下三篇,本篇为上篇,主要介绍bean工厂的构建与准备。
进入正题
我们首先来看看refresh()
方法做了什么
// AbstractApplicationContext.java
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 准备刷新上下文环境
prepareRefresh();
// 创建并初始化 BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 填充BeanFactory功能
prepareBeanFactory(beanFactory);
try {
// 提供子类覆盖的额外处理,即子类处理自定义的BeanFactoryPostProcess
postProcessBeanFactory(beanFactory);
// 激活各种BeanFactory处理器
invokeBeanFactoryPostProcessors(beanFactory);
// 注册拦截Bean创建的Bean处理器,即注册 BeanPostProcessor
registerBeanPostProcessors(beanFactory);
// 初始化上下文中的资源文件,如国际化文件的处理等
initMessageSource();
// 初始化上下文事件广播器
initApplicationEventMulticaster();
// 给子类扩展初始化其他Bean
onRefresh();
// 在所有bean中查找listener bean,然后注册到广播器中
registerListeners();
// 初始化剩下的单例Bean(非延迟加载的)
finishBeanFactoryInitialization(beanFactory);
// 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
finishRefresh();
} catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// 销毁已经创建的Bean
destroyBeans();
// 重置容器激活标签
cancelRefresh(ex);
// 抛出异常
throw ex;
} finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
这里每一个方法都非常重要,需要一个一个地解释说明。
1. prepareRefresh
初始化上下文环境,对系统的环境变量或者系统属性进行准备和校验,如环境变量中必须设置某个值才能运行,否则不能运行,这个时候可以在这里加这个校验,重写 initPropertySources 方法就好了

// AbstractApplicationContext.java
protected void prepareRefresh() {
// 1、设置启动日期
this.startupDate = System.currentTimeMillis();
///2、设置 context 当前状态
this.closed.set(false);
this.active.set(true);
if (logger.isInfoEnabled()) {
logger.info("Refreshing " + this);
}
// 3、初始化context environment(上下文环境)中的占位符属性来源(在AbstractApplicationContext中是空实现,具体由之类来实现相关逻辑)
initPropertySources();
// 4、对属性进行必要的验证
getEnvironment().validateRequiredProperties();
// 存储刷新容器前的监听器
if (this.earlyApplicationListeners == null) {
this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
}
else {
// 如果存在早期事件监听器则重置为刷新容器前的事件监听器
this.applicationListeners.clear();
this.applicationListeners.addAll(this.earlyApplicationListeners);
}
// 初始化早期事件变量
this.earlyApplicationEvents = new LinkedHashSet<>();
}
该方法主要是做一些准备工作,如:
设置 context 启动时间
设置 context 的当前状态
初始化 context environment 中占位符
我们可以看到重写了
initPropertySources
方法的子类有三个,而我们关注关于第三点我们以最常用的两个Context来简单说明一下,其中
ClassPathXmlApplicationContext
作为非Web环境的上下文,AnnotationConfigWebApplicationContext
作为Web环境上下文来举例。我们可以看到重写了
initPropertySources
方法的子类有三个,可以看出来ClassPathXmlApplicationContext
及其父类都没有重写该方法,即默认情况下Spring提供的标准容器都无需做额外的配置处理。那么我们只需关注第一个(
AbstractRefreshableWebApplicationContext
)的实现即可。// AbstractRefreshableWebApplicationContext.java
@Override
protected void initPropertySources() {
// 获取当前的运行环境,如果为空则创建一个运行环境,该方法由AbstractApplicationContext提供默认实现
ConfigurableEnvironment env = getEnvironment();
// 如果是Web环境的话就调用子类的initPropertySources方法注册
if (env instanceof ConfigurableWebEnvironment) {
((ConfigurableWebEnvironment) env).initPropertySources(this.servletContext, this.servletConfig);
}
}
/**
* 重写了父类的方法,创建了标准的Servlet运行环境
*/
@Override
protected ConfigurableEnvironment createEnvironment() {
return new StandardServletEnvironment();
}
// AbstractApplicationContext.java
@Override
public ConfigurableEnvironment getEnvironment() {
if (this.environment == null) {
// 如果不存在则创建
this.environment = createEnvironment();
}
return this.environment;
}
/**
* 提供默认的标准运行环境(非Web环境)
*/
protected ConfigurableEnvironment createEnvironment() {
return new StandardEnvironment();
}关于Web容器的初始化属性并不是本篇的重点,如果有兴趣的可以跟一下代码查询,这里不做深入分析。
对属性进行必要的验证
Spring自身的环境并没有强制需要检查某些属性是否存在,这是Spring提供给用户自定义Context时,可检查系统环境中是否存在指定的变量,如果不存在则报错。下面提供一个简单的例子:
初始化时检查环境中是否存在
VAR
变量public class MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext {
public MyClassPathXmlApplicationContext(String... configLocations) throws BeansException {
super(configLocations);
}
@Override
protected void initPropertySources() {
// 添加验证要求
getEnvironment().setRequiredProperties("VAR");
}
}
2. obtainFreshBeanFactory
通知之类刷新内部的BeanFactory,完成BeanDefinition的载入
// AbstractApplicationContext.java
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
// 刷新 BeanFactory
refreshBeanFactory();
// 返回 BeanFactory
return getBeanFactory();
}
// 抽象方法,由子类实现
protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
核心方法就在 #refreshBeanFactory()
方法,该方法的核心任务就是创建 BeanFactory 并对其就行初始化。


标准容器和Web容器都是继承于AbstractRefreshableApplicationContext
,那么我们只关注该类的实现即可。先看看执行流程:

再结合源码查看:
// AbstractRefreshableApplicationContext.java
@Override
protected final void refreshBeanFactory() throws BeansException {
// 若已有 BeanFactory ,销毁它的 Bean 们,并销毁 BeanFactory
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
// 创建 BeanFactory 对象
DefaultListableBeanFactory beanFactory = createBeanFactory();
// 指定序列化编号
beanFactory.setSerializationId(getId());
// 定制 BeanFactory 设置相关属性
customizeBeanFactory(beanFactory);
// 加载 BeanDefinition
loadBeanDefinitions(beanFactory);
// 设置 Context 的 BeanFactory
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
} catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
// 创建Bean工厂
protected DefaultListableBeanFactory createBeanFactory() {
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
// 配置工厂信息
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
if (this.allowBeanDefinitionOverriding != null) {
beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
}
if (this.allowCircularReferences != null) {
beanFactory.setAllowCircularReferences(this.allowCircularReferences);
}
}
// 加载BeanDefinition,抽象方法,由子类实现
protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
throws BeansException, IOException;
- 判断当前容器是否存在一个 BeanFactory,如果存在则对其进行销毁和关闭
- 调用
#createBeanFactory()
方法,创建一个BeanFactory
实例,其实就是创建DefaultListableBeanFactory
。 - 配置
BeanFactory
- 加载
BeanDefinition
。 - 将创建好的 bean 工厂的引用交给的 context 来管理
其中第4点是Spring容器的关键步骤之一,它实现了载入我们配置的xml文件或者注解配置,并将其解析为BeanDefinition,以供创建Bean使用。我们来仔细看看它是如何实现的:
2.1 loadBeanDefinitions

同样我们只关注前两个即可:
AbstractXmlApplicationContext
: 解析xml配置AnnotationConfigWebApplicationContext
解析注解配置
2.1.1 AbstractXmlApplicationContext
的实现
同样,先看流程:

// AbstractXmlApplicationContext.java
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
// 创建 XmlBeanDefinitionReader 对象
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
// 对 XmlBeanDefinitionReader 进行环境变量的设置
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
// 对 XmlBeanDefinitionReader 进行设置,可以进行覆盖
initBeanDefinitionReader(beanDefinitionReader);
// 从 Resource 们中,加载 BeanDefinition 们
loadBeanDefinitions(beanDefinitionReader);
}
// 把Location资源转换同Spring统一的Resource,并调用#loadBeanDefinitions(Resource resource)方法进行资源加载
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
Resource[] configResources = getConfigResources();
if (configResources != null) {
reader.loadBeanDefinitions(configResources);
}
String[] configLocations = getConfigLocations();
if (configLocations != null) {
reader.loadBeanDefinitions(configLocations);
}
}
// 真正进行资源载入的方法由子类提供
int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;
关于AbstractXmlApplicationContext#loadBeanDefinitions
我们点到为止,在这一步我们只要知道它做的是解析应用配置文件中<beans />
、<bean />
、<import />
、<alias />
等Spring bean核心标签为BeanDefinition外,还会解析<tx:xxx />
、<context:xxx />
等Spring自定义标签来开启更丰富的Spring功能。
关于Spring是如何定位配置文件,如何加载解析Resource资源,可以查看《Spring IOC 之 Resource体系》,里面会详细解析资源定位,解析,和BeanDefinition注册的过程。
2.1.2 AnnotationConfigWebApplicationContext
的实现
// TODO
3. prepareBeanFactory
配置工厂的功能,例如类加载器和后置处理器等。
上面获取获取的 BeanFactory 除了加载了一些 BeanDefinition 就没有其他任何东西了,这个时候其实还不能投入生产,因为还少配置了一些东西,比如 context的 ClassLoader 和 后置处理器等等。
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 设置beanFactory的classLoader
beanFactory.setBeanClassLoader(getClassLoader());
// 设置beanFactory的表达式语言处理器,Spring3开始增加了对语言表达式的支持,默认可以使用#{bean.xxx}的形式来调用相关属性值
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
// 为beanFactory增加一个默认的propertyEditor
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// 添加ApplicationContextAwareProcessor
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);
// 将早期用于检测内部bean的后置处理器注册为applicationlistener。
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// 增加对AspectJ的支持
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()));
}
// 注册默认的系统环境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());
}
}
看上面的源码知道这个就是对 BeanFactory 设置各种各种的功能。
4. postProcessBeanFactory
提供子类覆盖的额外处理,即子类处理自定义的BeanFactoryPostProcess
// AbstractApplicationContext.java
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 由之类提供实现
}
重写了该方法的子类如下:

类似的,我们只关注第一个,即Web容器对BeanFactory做了进一步的处理,而标准容器没有对BeanFactory做额外的定制。
// AbstractRefreshableWebApplicationContext.java
@Override
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 添加 ServletContextAwareProcessor 到 BeanFactory 容器中,该 processor 实现 BeanPostProcessor 接口,主要用于将ServletContext 传递给实现了 ServletContextAware 接口的 bean
beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext, this.servletConfig));
// 忽略 ServletContextAware、ServletConfigAware
beanFactory.ignoreDependencyInterface(ServletContextAware.class);
beanFactory.ignoreDependencyInterface(ServletConfigAware.class);
// 注册 WEB 应用特定的域(scope)到 beanFactory 中,以便 WebApplicationContext 可以使用它们。比如 “request” , “session” , “globalSession” , “application”
WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
// 注册 WEB 应用特定的 Environment bean 到 beanFactory 中,以便WebApplicationContext 可以使用它们。如:”contextParameters”, “contextAttributes”
WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig);
}
结语
至此,BeanFactory可以说是属性该设置的设置了,配置该初始化的也初始化了,接下来一鼓作气,继续深入 Spring-容器初始化流程(中)
49 条评论
Silencers for online · 2023年5月2日 下午6:47
… [Trackback]
[…] There you can find 12125 more Info on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
https://en.mp3juice.vg/ · 2023年5月5日 下午6:19
… [Trackback]
[…] Here you can find 20542 additional Info to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
mcx for sale · 2023年5月8日 上午10:05
… [Trackback]
[…] Read More Information here to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
briansclub CVV2 shop · 2023年5月8日 上午11:21
… [Trackback]
[…] Find More Info here to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
sagaming · 2023年5月15日 上午6:22
… [Trackback]
[…] There you can find 41625 additional Information on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
ตกแต่งภายในหาดใหญ่ · 2023年5月16日 上午6:32
… [Trackback]
[…] There you can find 31918 more Info on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
ลูกโป่งวันเกิด · 2023年5月22日 上午6:44
… [Trackback]
[…] Find More Info here on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
Rocket League hacks · 2023年5月23日 上午7:26
… [Trackback]
[…] There you will find 91583 more Information on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
y2mate · 2023年6月7日 上午8:59
… [Trackback]
[…] Here you can find 83276 additional Info on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
locksmith Bonita CA · 2023年6月12日 上午12:04
… [Trackback]
[…] Find More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
Recuperatoare de caldura · 2023年6月19日 下午5:15
… [Trackback]
[…] Information to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
top casino revues au Burundi · 2023年6月20日 上午6:29
… [Trackback]
[…] Information on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
다시보기티비 · 2023年7月1日 上午6:11
… [Trackback]
[…] There you can find 21728 more Information to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
ลู่วิ่งไฟฟ้า ยี่ห้อไหนดี · 2023年7月1日 上午6:37
… [Trackback]
[…] Find More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
mejaqq · 2023年7月3日 下午7:03
… [Trackback]
[…] Read More to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
Texas gun trader · 2023年7月5日 上午10:24
… [Trackback]
[…] Read More Information here on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
เครื่องซักผ้า ยี่ห้อไหนดี · 2023年7月6日 上午6:59
… [Trackback]
[…] Information to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
เครื่องกรองน้ำโคเวย์ · 2023年7月7日 上午6:19
… [Trackback]
[…] Information on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
ทำสติ๊กเกอร์ · 2023年7月7日 上午6:29
… [Trackback]
[…] Read More to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
buy magic mushrooms online · 2023年7月7日 上午8:32
… [Trackback]
[…] Find More to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
aksara178 · 2023年7月19日 下午8:01
… [Trackback]
[…] Read More Info here on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
magic mushrooms for sale online australia · 2023年7月19日 下午9:57
… [Trackback]
[…] Read More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
magic mushrooms ballarat · 2023年7月21日 上午8:14
… [Trackback]
[…] Information on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
Pain Killers Medicines · 2023年7月21日 上午9:09
… [Trackback]
[…] Read More to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
40fakes.com · 2023年7月21日 下午5:59
… [Trackback]
[…] Information on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
camlock coupling · 2023年7月22日 上午6:57
… [Trackback]
[…] Read More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
เย้เย้ · 2023年7月24日 上午7:24
… [Trackback]
[…] Read More on on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
นวดเชียงราย · 2023年7月27日 上午7:05
… [Trackback]
[…] Read More here on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
adhd virginia · 2023年7月28日 上午6:09
… [Trackback]
[…] Read More here to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
automobile transportation company · 2023年8月4日 上午6:19
… [Trackback]
[…] There you can find 43015 additional Info on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
รับทำ SEO · 2023年8月4日 上午7:54
… [Trackback]
[…] Here you will find 39567 additional Information to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
shipping car to us from canada · 2023年8月5日 上午6:57
… [Trackback]
[…] Information on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
i88bet · 2023年8月6日 上午6:25
… [Trackback]
[…] Find More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
taipei999 คาสิโน · 2023年8月6日 上午6:47
… [Trackback]
[…] There you will find 82711 additional Info to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
เว็บปั้มไลค์ · 2023年8月6日 下午12:54
… [Trackback]
[…] Here you will find 40116 additional Information to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
สมัครตัวแทน Relx · 2023年8月8日 上午6:52
… [Trackback]
[…] Read More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
relx pod · 2023年8月8日 上午7:00
… [Trackback]
[…] Find More Information here to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
หมอไก่ทำตา · 2023年8月8日 上午8:18
… [Trackback]
[…] Read More Info here to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
ซอฟท์สตาร์ทเตอร์ซีเมนส์ · 2023年8月9日 上午6:27
… [Trackback]
[…] Here you will find 15442 additional Info on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
qiuqiu99 login · 2023年8月11日 下午9:25
… [Trackback]
[…] Find More Information here on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
Alpha88 · 2023年8月12日 上午7:00
… [Trackback]
[…] Read More on on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
แฮนดิแคป · 2023年8月12日 上午7:34
… [Trackback]
[…] Find More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
alpha88 เข้า ไม่ได้ · 2023年8月12日 上午9:12
… [Trackback]
[…] Read More Info here to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
Browning Official Website · 2023年8月19日 下午4:17
… [Trackback]
[…] Find More Information here to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
springfield rifles · 2023年8月20日 上午7:16
… [Trackback]
[…] Find More to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
ประตูสำเร็จรูป · 2023年8月24日 上午6:28
… [Trackback]
[…] Find More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
สล็อต ฝากถอน true wallet เว็บตรง 888pg · 2023年8月24日 上午7:49
… [Trackback]
[…] Info on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
ทินเนอร์ AAA · 2023年8月26日 上午6:34
… [Trackback]
[…] Find More Information here to that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
20197 zip code · 2023年8月30日 上午2:25
… [Trackback]
[…] Find More on that Topic: hugr.cn/2019/12/12/spring-容器初始化流程(上)/ […]
评论已关闭。