Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
Spring_resource_analysis
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
WeifengSun
Spring_resource_analysis
Commits
3f5d6074
Commit
3f5d6074
authored
Aug 17, 2022
by
SunWei峰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SpringApplicationContext Over!!!
parent
04177ba3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
22 additions
and
0 deletions
+22
-0
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
+9
-0
spring-framework-main/spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java
+10
-0
spring-framework-main/spring-context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java
+3
-0
No files found.
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
View file @
3f5d6074
...
...
@@ -912,12 +912,17 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
// Iterate over a copy to allow for init methods which in turn register new bean definitions.
// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
// 1.创建beanDefinitionNames的副本beanNames用于后续的遍历,以允许init等方法注册新的bean定义
List
<
String
>
beanNames
=
new
ArrayList
<>(
this
.
beanDefinitionNames
);
// Trigger initialization of all non-lazy singleton beans...
// 2.遍历beanNames,触发所有非懒加载单例bean的初始化
for
(
String
beanName
:
beanNames
)
{
// 3.获取beanName对应的MergedBeanDefinition
RootBeanDefinition
bd
=
getMergedLocalBeanDefinition
(
beanName
);
// 4.bd对应的Bean实例:不是抽象类 && 是单例 && 不是懒加载
if
(!
bd
.
isAbstract
()
&&
bd
.
isSingleton
()
&&
!
bd
.
isLazyInit
())
{
// 5.判断 bean 是否为 FactoryBean
if
(
isFactoryBean
(
beanName
))
{
Object
bean
=
getBean
(
FACTORY_BEAN_PREFIX
+
beanName
);
if
(
bean
instanceof
SmartFactoryBean
<?>
smartFactoryBean
&&
smartFactoryBean
.
isEagerInit
())
{
...
...
@@ -925,14 +930,18 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
}
}
else
{
// 6.如果beanName对应的bean不是 FactoryBean,只是普通Bean,通过beanName获取bean实例
getBean
(
beanName
);
}
}
}
// Trigger post-initialization callback for all applicable beans...
// 7.遍历 beanNames,触发所有 SmartInitializingSingleton 的后初始化回调
for
(
String
beanName
:
beanNames
)
{
// 7.1 拿到beanName对应的bean实例
Object
singletonInstance
=
getSingleton
(
beanName
);
// 7.2 判断 singletonInstance 是否实现了 SmartInitializingSingleton 接口
if
(
singletonInstance
instanceof
SmartInitializingSingleton
smartSingleton
)
{
StartupStep
smartInitialize
=
this
.
getApplicationStartup
().
start
(
"spring.beans.smart-initialize"
)
.
tag
(
"beanName"
,
beanName
);
...
...
spring-framework-main/spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java
View file @
3f5d6074
...
...
@@ -906,6 +906,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
*/
protected
void
initLifecycleProcessor
()
{
ConfigurableListableBeanFactory
beanFactory
=
getBeanFactory
();
// 1.判断BeanFactory是否已经存在生命周期处理器(固定使用beanName=lifecycleProcessor)
if
(
beanFactory
.
containsLocalBean
(
LIFECYCLE_PROCESSOR_BEAN_NAME
))
{
this
.
lifecycleProcessor
=
beanFactory
.
getBean
(
LIFECYCLE_PROCESSOR_BEAN_NAME
,
LifecycleProcessor
.
class
);
...
...
@@ -913,8 +914,10 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
logger
.
trace
(
"Using LifecycleProcessor ["
+
this
.
lifecycleProcessor
+
"]"
);
}
}
else
{
// 1.2 如果不存在,则使用DefaultLifecycleProcessor
DefaultLifecycleProcessor
defaultProcessor
=
new
DefaultLifecycleProcessor
();
defaultProcessor
.
setBeanFactory
(
beanFactory
);
// 并将 DefaultLifecycleProcessor 作为默认的生命周期处理器,注册到 BeanFactory 中
this
.
lifecycleProcessor
=
defaultProcessor
;
beanFactory
.
registerSingleton
(
LIFECYCLE_PROCESSOR_BEAN_NAME
,
this
.
lifecycleProcessor
);
if
(
logger
.
isTraceEnabled
())
{
...
...
@@ -987,6 +990,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
}
// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
// 3.初始化LoadTimeWeaverAware Bean实例对象
String
[]
weaverAwareNames
=
beanFactory
.
getBeanNamesForType
(
LoadTimeWeaverAware
.
class
,
false
,
false
);
for
(
String
weaverAwareName
:
weaverAwareNames
)
{
getBean
(
weaverAwareName
);
...
...
@@ -996,9 +1000,11 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
beanFactory
.
setTempClassLoader
(
null
);
// Allow for caching all bean definition metadata, not expecting further changes.
// 4.冻结所有bean定义,注册的bean定义不会被修改或进一步后处理,因为马上要创建 Bean 实例对象了
beanFactory
.
freezeConfiguration
();
// Instantiate all remaining (non-lazy-init) singletons.
// 5.实例化所有剩余(非懒加载)单例对象
beanFactory
.
preInstantiateSingletons
();
}
...
...
@@ -1010,15 +1016,19 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
@SuppressWarnings
(
"deprecation"
)
protected
void
finishRefresh
()
{
// Clear context-level resource caches (such as ASM metadata from scanning).
// 清除资源缓存
clearResourceCaches
();
// Initialize lifecycle processor for this context.
// 1.为此上下文初始化生命周期处理器
initLifecycleProcessor
();
// Propagate refresh to lifecycle processor first.
// 2.首先将刷新完毕事件传播到生命周期处理器(触发isAutoStartup方法返回true的SmartLifecycle的start方法)
getLifecycleProcessor
().
onRefresh
();
// Publish the final event.
// 3.推送上下文刷新完毕事件到相应的监听器
publishEvent
(
new
ContextRefreshedEvent
(
this
));
}
...
...
spring-framework-main/spring-context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java
View file @
3f5d6074
...
...
@@ -139,9 +139,12 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor
// Internal helpers
private
void
startBeans
(
boolean
autoStartupOnly
)
{
// 1.获取所有的Lifecycle bean
Map
<
String
,
Lifecycle
>
lifecycleBeans
=
getLifecycleBeans
();
// 将Lifecycle bean 按阶段分组,阶段通过实现Phased接口得到
Map
<
Integer
,
LifecycleGroup
>
phases
=
new
TreeMap
<>();
// 2.遍历所有Lifecycle bean,按阶段值分组
lifecycleBeans
.
forEach
((
beanName
,
bean
)
->
{
if
(!
autoStartupOnly
||
(
bean
instanceof
SmartLifecycle
&&
((
SmartLifecycle
)
bean
).
isAutoStartup
()))
{
int
phase
=
getPhase
(
bean
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment