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
b0aab613
Commit
b0aab613
authored
Sep 01, 2022
by
SunWei峰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
京东挂我
parent
94e1e9e0
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
15 additions
and
9 deletions
+15
-9
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java
+1
-0
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
+7
-4
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
+2
-0
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
+3
-3
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleInstantiationStrategy.java
+1
-1
spring-framework-main/spring-context/src/main/java/org/springframework/context/support/PostProcessorRegistrationDelegate.java
+1
-1
No files found.
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java
View file @
b0aab613
...
@@ -188,6 +188,7 @@ public class InitDestroyAnnotationBeanPostProcessor implements DestructionAwareB
...
@@ -188,6 +188,7 @@ public class InitDestroyAnnotationBeanPostProcessor implements DestructionAwareB
public
Object
postProcessBeforeInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
{
public
Object
postProcessBeforeInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
{
LifecycleMetadata
metadata
=
findLifecycleMetadata
(
bean
.
getClass
());
LifecycleMetadata
metadata
=
findLifecycleMetadata
(
bean
.
getClass
());
try
{
try
{
/// @PostConstruct实现方法
metadata
.
invokeInitMethods
(
bean
,
beanName
);
metadata
.
invokeInitMethods
(
bean
,
beanName
);
}
}
catch
(
InvocationTargetException
ex
)
{
catch
(
InvocationTargetException
ex
)
{
...
...
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
View file @
b0aab613
...
@@ -644,14 +644,17 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
...
@@ -644,14 +644,17 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
// 若exposedObject在增强方法中没有被改变。(没有增强)
// 若exposedObject在增强方法中没有被改变。(没有增强)
// 如果缓存的对象 exposedObject == bean,直接赋值之前暴露出来的bean
// 如果缓存的对象 exposedObject == bean,直接赋值之前暴露出来的bean
if
(
exposedObject
==
bean
)
{
if
(
exposedObject
==
bean
)
{
// 后置处理器没有对对象进行修改
exposedObject
=
earlySingletonReference
;
exposedObject
=
earlySingletonReference
;
}
}
// 如果提前暴露的对象和经过了完整的生命周期后的对象不相等
// 如果提前暴露的对象和经过了完整的生命周期后的对象不相等,有后置处理器修改了bean,
// 例如 @Async,这种循环依赖Spring无法解决,如果是真的依赖的话,报错就好了
else
if
(!
this
.
allowRawInjectionDespiteWrapping
&&
hasDependentBean
(
beanName
))
{
else
if
(!
this
.
allowRawInjectionDespiteWrapping
&&
hasDependentBean
(
beanName
))
{
String
[]
dependentBeans
=
getDependentBeans
(
beanName
);
String
[]
dependentBeans
=
getDependentBeans
(
beanName
);
Set
<
String
>
actualDependentBeans
=
new
LinkedHashSet
<>(
dependentBeans
.
length
);
Set
<
String
>
actualDependentBeans
=
new
LinkedHashSet
<>(
dependentBeans
.
length
);
for
(
String
dependentBean
:
dependentBeans
)
{
for
(
String
dependentBean
:
dependentBeans
)
{
if
(!
removeSingletonIfCreatedForTypeCheckOnly
(
dependentBean
))
{
if
(!
removeSingletonIfCreatedForTypeCheckOnly
(
dependentBean
))
{
// 有问题的才add
actualDependentBeans
.
add
(
dependentBean
);
actualDependentBeans
.
add
(
dependentBean
);
}
}
}
}
...
@@ -1195,10 +1198,10 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
...
@@ -1195,10 +1198,10 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
return
obtainFromSupplier
(
instanceSupplier
,
beanName
);
return
obtainFromSupplier
(
instanceSupplier
,
beanName
);
}
}
// 2. 如果工厂方法不为空,则使用工厂方法初始化策略
// 2. 如果工厂方法不为空,则使用工厂方法初始化策略
,存在 factoryMethod 属性
if
(
mbd
.
getFactoryMethodName
()
!=
null
)
{
if
(
mbd
.
getFactoryMethodName
()
!=
null
)
{
// 通过 @Bean 注解方法注入的bean 或者xml 配置注入 的BeanDefinition 会存在这个值。
// 通过 @Bean 注解方法注入的bean 或者xml 配置注入 的BeanDefinition 会存在这个值。
// 而注入这个bean的方法就是工厂方法。
后面会详细解读
// 而注入这个bean的方法就是工厂方法。
return
instantiateUsingFactoryMethod
(
beanName
,
mbd
,
args
);
return
instantiateUsingFactoryMethod
(
beanName
,
mbd
,
args
);
}
}
...
@@ -1246,7 +1249,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
...
@@ -1246,7 +1249,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
// Candidate constructors for autowiring?
// Candidate constructors for autowiring?
// 6. 根据参数解析构造函数,并将解析出来的构造函数缓存到mdb 的 resolvedConstructorOrFactoryMethod 属性中
// 6. 根据参数解析构造函数,并将解析出来的构造函数缓存到mdb 的 resolvedConstructorOrFactoryMethod 属性中
// 到这一步,说明 bean 是第一次加载,所以没有对构造函数进行相关缓存(resolved 为 false)
// 到这一步,说明 bean 是第一次加载,所以没有对构造函数进行相关缓存(resolved 为 false)
// 调用 determineConstructorsFromBeanPostProcessors 方法来获取指定的构造函数列表。
后面详解
// 调用 determineConstructorsFromBeanPostProcessors 方法来获取指定的构造函数列表。
Constructor
<?>[]
ctors
=
determineConstructorsFromBeanPostProcessors
(
beanClass
,
beanName
);
Constructor
<?>[]
ctors
=
determineConstructorsFromBeanPostProcessors
(
beanClass
,
beanName
);
if
(
ctors
!=
null
||
mbd
.
getResolvedAutowireMode
()
==
AUTOWIRE_CONSTRUCTOR
||
if
(
ctors
!=
null
||
mbd
.
getResolvedAutowireMode
()
==
AUTOWIRE_CONSTRUCTOR
||
mbd
.
hasConstructorArgumentValues
()
||
!
ObjectUtils
.
isEmpty
(
args
))
{
mbd
.
hasConstructorArgumentValues
()
||
!
ObjectUtils
.
isEmpty
(
args
))
{
...
...
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
View file @
b0aab613
...
@@ -1773,7 +1773,9 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
...
@@ -1773,7 +1773,9 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
*/
*/
protected
boolean
removeSingletonIfCreatedForTypeCheckOnly
(
String
beanName
)
{
protected
boolean
removeSingletonIfCreatedForTypeCheckOnly
(
String
beanName
)
{
if
(!
this
.
alreadyCreated
.
contains
(
beanName
))
{
if
(!
this
.
alreadyCreated
.
contains
(
beanName
))
{
// 是checkOnly类型就删除
removeSingleton
(
beanName
);
removeSingleton
(
beanName
);
// 没有问题就返回true
return
true
;
return
true
;
}
}
else
{
else
{
...
...
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
View file @
b0aab613
...
@@ -1036,7 +1036,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
...
@@ -1036,7 +1036,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
// 判断是否已经有其它的 bean 开始初始化了
// 判断是否已经有其它的 bean 开始初始化了
// 注意,注册 bean 这个动作结束之后,bean 依然没有被初始化,真正的初始化操作还在后面
// 注意,注册 bean 这个动作结束之后,bean 依然没有被初始化,真正的初始化操作还在后面
// 在 spring 容器启动的最后,会预初始化所有的单例 bean
// 在 spring 容器启动的最后,会预初始化所有的单例 bean
//
TODO: 2022/7/18 搞清楚他的思想,到底是不是为了
copyOnWrite
//
beanDefinitionMap 被锁住了,但是 beanDefinitionNames 需要
copyOnWrite
if
(
hasBeanCreationStarted
())
{
if
(
hasBeanCreationStarted
())
{
// Cannot modify startup-time collection elements anymore (for stable iteration)
// Cannot modify startup-time collection elements anymore (for stable iteration)
synchronized
(
this
.
beanDefinitionMap
)
{
synchronized
(
this
.
beanDefinitionMap
)
{
...
@@ -1355,13 +1355,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
...
@@ -1355,13 +1355,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
// 获取依赖的类型
// 获取依赖的类型
Class
<?>
type
=
descriptor
.
getDependencyType
();
Class
<?>
type
=
descriptor
.
getDependencyType
();
// 取值@Value注解中的value属性中的值,这里取出的值是未经修改的值,即带有 ${} 标签的值。
// 取值@Value注解中的value属性中的值,这里取出的值是未经修改的值,即带有 ${} 标签的值。
// 如果
descriptor未被@Value
标注,则返回null
// 如果
descriptor 未被 @Value
标注,则返回null
Object
value
=
getAutowireCandidateResolver
().
getSuggestedValue
(
descriptor
);
Object
value
=
getAutowireCandidateResolver
().
getSuggestedValue
(
descriptor
);
if
(
value
!=
null
)
{
if
(
value
!=
null
)
{
// 到这里说明属性被 @Value 注解修饰了,这里是解析 @Value 注解的逻辑
// 到这里说明属性被 @Value 注解修饰了,这里是解析 @Value 注解的逻辑
// 如果value不为null,
// 如果value不为null,
if
(
value
instanceof
String
)
{
if
(
value
instanceof
String
)
{
// 处理占位符如${},做占位符的替换(不解析SP
EL表达式)
// 处理占位符如${},做占位符的替换(不解析SPEL表达式)
String
strVal
=
resolveEmbeddedValue
((
String
)
value
);
String
strVal
=
resolveEmbeddedValue
((
String
)
value
);
BeanDefinition
bd
=
(
beanName
!=
null
&&
containsBean
(
beanName
)
?
BeanDefinition
bd
=
(
beanName
!=
null
&&
containsBean
(
beanName
)
?
getMergedBeanDefinition
(
beanName
)
:
null
);
getMergedBeanDefinition
(
beanName
)
:
null
);
...
...
spring-framework-main/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleInstantiationStrategy.java
View file @
b0aab613
...
@@ -57,7 +57,7 @@ public class SimpleInstantiationStrategy implements InstantiationStrategy {
...
@@ -57,7 +57,7 @@ public class SimpleInstantiationStrategy implements InstantiationStrategy {
@Override
@Override
public
Object
instantiate
(
RootBeanDefinition
bd
,
@Nullable
String
beanName
,
BeanFactory
owner
)
{
public
Object
instantiate
(
RootBeanDefinition
bd
,
@Nullable
String
beanName
,
BeanFactory
owner
)
{
// Don't override the class with CGLIB if no overrides.
// Don't override the class with CGLIB if no overrides.
// 如果当前bean中的方法没有都没有被重写,则直接反射就好了。不需要使用cglib 来进行代理
// 如果当前bean中的方法没有都没有被重写,则直接反射就好了。不需要使用cglib 来进行代理
(主要针对重写方法)
if
(!
bd
.
hasMethodOverrides
())
{
if
(!
bd
.
hasMethodOverrides
())
{
Constructor
<?>
constructorToUse
;
Constructor
<?>
constructorToUse
;
synchronized
(
bd
.
constructorArgumentLock
)
{
synchronized
(
bd
.
constructorArgumentLock
)
{
...
...
spring-framework-main/spring-context/src/main/java/org/springframework/context/support/PostProcessorRegistrationDelegate.java
View file @
b0aab613
...
@@ -119,7 +119,7 @@ final class PostProcessorRegistrationDelegate {
...
@@ -119,7 +119,7 @@ final class PostProcessorRegistrationDelegate {
beanFactory
.
getBeanNamesForType
(
BeanDefinitionRegistryPostProcessor
.
class
,
true
,
false
);
beanFactory
.
getBeanNamesForType
(
BeanDefinitionRegistryPostProcessor
.
class
,
true
,
false
);
// 遍历 postProcessorNames
// 遍历 postProcessorNames
for
(
String
ppName
:
postProcessorNames
)
{
for
(
String
ppName
:
postProcessorNames
)
{
// 校验是否实现了
PriorityOrdered
接口
// 校验是否实现了
PriorityOrdered
接口
if
(
beanFactory
.
isTypeMatch
(
ppName
,
PriorityOrdered
.
class
))
{
if
(
beanFactory
.
isTypeMatch
(
ppName
,
PriorityOrdered
.
class
))
{
// 获取ppName对应的bean实例, 添加到currentRegistryProcessors中,
// 获取ppName对应的bean实例, 添加到currentRegistryProcessors中,
currentRegistryProcessors
.
add
(
beanFactory
.
getBean
(
ppName
,
BeanDefinitionRegistryPostProcessor
.
class
));
currentRegistryProcessors
.
add
(
beanFactory
.
getBean
(
ppName
,
BeanDefinitionRegistryPostProcessor
.
class
));
...
...
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