BeanDefinition 配置
BeanDefinition 解析
XmlBeanDefinitionReader
PropertiesBeanDefinitionReader
AnnotatedBeanDefinitionReader
BeanDefinition 注册接口 --- BeanDefinitionRegistry
BeanDefinition 合并
父子 BeanDefinition 合并
<bean id="user" class="org.geekbang.thinking.in.spring.ioc.overview.domain.User">
<property name="id" value="1"/>
...
</bean>
<bean id="superUser" class="org.geekbang.thinking.in.spring.ioc.overview.domain.SuperUser" parent="user"
primary="true">
<property name="address" value="杭州"/>
</bean>
XmlBeanDefinitionReader#loadBeanDefinitions
加载 XML 文件时,赋值 DefaultListableBeanFactory#beanDefinitionMap
,这个 Map 中的 BeanDefinition
还没有合并,也就是说 superUser 的属性值还没有从 user 中继承过来。
AbstractBeanFactory#getBean
获取 bean 时,执行 AbstractBeanFactory#getMergedBeanDefinition
,对 superUser 进行合并,放入 AbstractBeanFactory#mergedBeanDefinitions
中。
AbstractBeanDefinition#beanClass
被定义为 Object ,有两种形式,一种是 全类名 的 String,另一种是 Class 对象
Java Security 安全控制 相关
if (System.getSecurityManager() != null) {
return AccessController.doPrivileged((PrivilegedExceptionAction<Class<?>>) () ->
doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());
}
临时 ClassLoader 与 load-time weaving 技术有关,用于进行类型检查时(即尚未创建实际实例)
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
返回非 null 时,阻止 bean 的默认实例化过程及以下生命周期
唯一可以进一步生命周期处理的是 BeanPostProcessor#postProcessAfterInitialization
传统实例化方式
构造器依赖注入
实例化阶段,如果使用构造器注入,将解析构造器注入的依赖
AbstractAutowireCapableBeanFactory#createBeanInstance
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
在给 bean 实例做属性赋值的方法 AbstractAutowireCapableBeanFactory#populateBean
的最开始调用,如果返回 false ,阻止 bean 的属性赋值及以下生命周期
Bean 属性值元信息
Bean 属性赋值前回调
InstantiationAwareBeanPostProcessor#postProcessPropertyValues
此方法已过期,使用 postProcessProperties
替代,为了兼容,只有在 postProcessProperties
返回 null 时(默认实现),才会调用此方法
InstantiationAwareBeanPostProcessor#postProcessProperties
在工厂将给定属性值应用于给定 bean 之前,对它们进行处理。
在依赖注入( byName
或 byType
)之后,在将配置的属性赋值给 bean 实例 AbstractAutowireCapableBeanFactory#applyPropertyValues
之前执行此阶段方法
AbstractAutowireCapableBeanFactory#initializeBean
Spring Aware 接口,执行顺序从上到下
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
依赖于 ApplicationContext
:
EnvironmentAware
EmbeddedValueResolverAware
ResourceLoaderAware
ApplicationEventPublisherAware
MessageSourceAware
ApplicationContextAware
在初始化 Bean 实例 AbstractAutowireCapableBeanFactory#initializeBean
的最开始执行此阶段,前三个接口直接调用,而依赖于 ApplicationContext 的几个 Aware 接口,在 ApplicationContext 的生命周期中,会在 beanFactory 中加入 ApplicationContextAwareProcessor
,在其 postProcessBeforeInitialization
方法中执行调用
ApplicationContextAwareProcessor
是包权限的
已完成
方法回调
BeanPostProcessor#postProcessBeforeInitialization
Bean 初始化(Initialization)
@PostConstruct
标注方法 -- 该方法在初始化前阶段执行InitializingBean
接口的 afterPropertiesSet()
方法对 @PostConstruct
的处理需要依赖于注解驱动,CommonAnnotationBeanPostProcessor#postProcessBeforeInitialization
方法回调
BeanPostProcessor#postProcessAfterInitialization
方法回调
SmartInitializingSingleton#afterSingletonsInstantiated
SmartInitializingSingleton
通常在 Spring ApplicationContext 场景使用
使用 BeanFactory
时,需要显式的调用此方法;在 ApplicationContext
启动时,调用了此方法 AbstractApplicationContext#finishBeanFactoryInitialization
,这个方法做了两件事情:
BeanDefinition
初始化成 Spring BeanSmartInitializingSingleton#afterSingletonsInstantiated
DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
执行 ConfigurableBeanFactory#destroyBean
时,触发 Bean 前销毁阶段
对 @PreDestroy
的处理需要依赖于注解驱动,CommonAnnotationBeanPostProcessor#postProcessBeforeDestruction
Bean 销毁(Destroy)
@PreDestroy
标注方法DisposableBean
接口的 destroy()
方法对 @PreDestroy
的处理需要依赖于注解驱动,CommonAnnotationBeanPostProcessor#postProcessBeforeDestruction
CommonAnnotationBeanPostProcessor
是 DestructionAwareBeanPostProcessor
的实现类之一
如果其他 DestructionAwareBeanPostProcessor
排序在 CommonAnnotationBeanPostProcessor
后,会先执行 @PreDestroy
标注方法,后执行其他 DestructionAwareBeanPostProcessor
销毁前阶段方法
Bean 垃圾回收(GC)
finalize()
方法被回调答:BeanPostProcessor
提供 Spring Bean 初始化前和初始化后的生命周期回调,分别对应 postProcessBeforeInitialization
以及 postProcessAfterInitialization
方法,允许对关心的 Bean 进行扩展,甚至是替换。
加分项:其中,ApplicationContext
相关的 Aware
回调也是基于 BeanPostProcessor
实现,即 ApplicationContextAwareProcessor
。
答:BeanFactoryPostProcessor
是 Spring BeanFactory
(实际为 ConfigurableListableBeanFactory
) 的后置处理器,用于扩展 BeanFactory
,或通过 BeanFactory
进行依赖查找和依赖注入。
加分项:BeanFactoryPostProcessor
必须有 Spring ApplicationContext
执行,BeanFactory
无法与其直接交互。而 BeanPostProcessor
则直接与 BeanFactory
关联,属于 N 对 1 的关系。
BeanFactory
的默认实现为 DefaultListableBeanFactory
,其中 Bean生命周期与方法映射如下:
registerBeanDefinition
getMergedBeanDefinition
resolveBeforeInstantiation
createBeanInstance
populateBean
populateBean
populateBean
initializeBean
initializeBean
initializeBean
initializeBean
preInstantiateSingletons
destroyBean
destroyBean