SpringBean 元信息

BeanDefinition Class Diagram

元信息的配置

  • 通过资源的方式配置,如: XML、 Properties、Groovy
  • 通过注解配置 : @Bean
  • 通过API配置 :BeanDefinitionBuilder / GenericBeanDefinition

元信息的读取

1) Get beanDefinitionRegistry for registry beanDefinitions.
2) Get ResourceLoader
3) Get ClassLoader.

  • 读取通过资源方式配置,如:XmlBeanDefinitionReader、PropertiesBeanDefinitionReader、GroovyBeanDefinitionReader
  • 读取注解配置的Bean:AnnotatedBeanDefinitionReader

BeanDefinitionReader Class Diagram

1
2
3
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(beanFactory);
reader.register(Main.class);

元信息的解析

BeanDefinitionParser

图片版本的看不太清,整理一份文字版本的层级关系,除BeanDefinitionParser是顶层抽象接口外,其余Parser都是类或者抽象类。

  • BeanDefinitionParser
    • SpringConfiguredBeanDefinitionParser
    • AnnotationDrivenCacheBeanDefinitionParser
    • ScriptingDefaultsParser
    • ComponentScanBeanDefinitionParser
    • AnnotationConfigBeanDefinitionParser
    • AspectJAutoProxyBeanDewfinitionParser
    • SpringConfiguredBeanDefinitionParser
    • ConfigBeanDefinitionParser
    • AnnotationDrivenBeanDefinitionParser
    • AbstractBeanDefinitionParser
      • MBeanExportBeanDefinitionParser
      • MBeanServiceBeanDefinitionParser
      • ScriptBeanDefinitionParser
      • AbstractSingleBeanDefinitionParser
        • ExecutorBeanDefinitionParser
        • SchedulerBeanDefinitionParser
        • SetBeanDefinitionParser
        • AbstractPropertyLoadingBeanDefinitionParser
        • LoadTimeWeaverBeanDefinitionParser
        • CacheAdviceParser
        • ListBeanDefinitionParser
        • ScheduledTasksBeanDefinitionParser
        • MapBeanDefinitionParser
        • PropertiesBeanDefinitionParser
        • PropertyPathBeanDefinitionParser
        • AbstractSimpleBeanDefinitionParser
          • ConstantBeanDefinitionParser
          • AbstractJndiLocatingBeanDefinitionParser
            • JndiLookupBeanDefinitionParser
            • LocalStatelessSessionBeanDefinitionParser
            • RemoteStatelessSessionBeanDefinitionParser

SpringBean 注册

1
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
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {

BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
this.beanDefinitionMap.put(beanName, beanDefinition);
}
else {
if (hasBeanCreationStarted()) {
// Cannot modify startup-time collection elements anymore (for stable iteration)
synchronized (this.beanDefinitionMap) {
this.beanDefinitionMap.put(beanName, beanDefinition);
List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
updatedDefinitions.addAll(this.beanDefinitionNames);
updatedDefinitions.add(beanName);
this.beanDefinitionNames = updatedDefinitions;
removeManualSingletonName(beanName);
}
}
else {
// Still in startup registration phase
this.beanDefinitionMap.put(beanName, beanDefinition);
this.beanDefinitionNames.add(beanName);
removeManualSingletonName(beanName);
}
this.frozenBeanDefinitionNames = null;
}

if (existingDefinition != null || containsSingleton(beanName)) {
resetBeanDefinition(beanName);
}
}

Spring BeanDefinition 合并阶段

GenericBeanDefinition -> RootBeanDefinition

Spring Bean Class 加载阶段

BeanDefinition 中定义的Class名称加载具体的Class类。

ClassLoader 类加载
Java Security 安全控制
ConfigurableBeanFactory 临时 ClassLoader

Spring Bean 实例化
实例化前:
InstantiationAwareBeanProcessor.postProcessorBeforeInstantiation()
提前生成一些代理对象,替换掉默认的springIOC的实现内容。
实例化
传统实例化方式
+ 实例化策略 InstantiationStrategy

构造器依赖注入(根据类型来注入)

实例化后
InstantiationAwareBeanProcessor.postProcessorAfterInstantiation()

Spring Bean 属性赋值前阶段

Bean的属性值元信息: PropertyValues
构造器参数值:ConstructorValues

Bean属性赋值前回调
<= 5.0 InstantiationAwareBeanPostProcessor#postProcessorPropertyValues();
>= 5.1 InstantiationAwareBeanPostProcessor#postProcessorProperties();

Spring Bean Aware 接口回调阶段

Aware接口是一个标志接口,并没有提供任何实现。
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
EnvironmentAware
EmbeddedValueResolverAware
ApplicationEventPublisherAware
MessageSourceAware
ApplicationContextAware

Spring Bean 初始化

初始化前
BeanPostProcessor#postProcessorBeforeInitialization
初始化
@PostConstructor
AfterPropertiesSet
init-method
初始化后
BeanPostProcessor#postProcessAfterInitialization
初始化完成
SmartinitializingSingleton#afterSingletonsInstanted

AbstractAutowireCapableBeanFactory
1
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
/**
* Initialize the given bean instance, applying factory callbacks
* as well as init methods and bean post processors.
* <p>Called from {@link #createBean} for traditionally defined beans,
* and from {@link #initializeBean} for existing bean instances.
* @param beanName the bean name in the factory (for debugging purposes)
* @param bean the new bean instance we may need to initialize
* @param mbd the bean definition that the bean was created with
* (can also be {@code null}, if given an existing bean instance)
* @return the initialized bean instance (potentially wrapped)
* @see BeanNameAware
* @see BeanClassLoaderAware
* @see BeanFactoryAware
* @see #applyBeanPostProcessorsBeforeInitialization
* @see #invokeInitMethods
* @see #applyBeanPostProcessorsAfterInitialization
*/
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean);
}

Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}

try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}

return wrappedBean;
}

Spring Bean 销毁
销毁前
DestructionAwareBeanPostProcessor#postProcessorBeforeDestruction
销毁
@PreDestroy
实现DisposableBean接口的destroy方法
自定义销毁方法
垃圾回收
关闭Spring 容器
执行GC
SpringBean 覆盖finalize()方法被回调