BeanDefinition 配置
BeanDefinition 解析
XmlBeanDefinitionReaderPropertiesBeanDefinitionReaderAnnotatedBeanDefinitionReaderBeanDefinition 注册接口 --- BeanDefinitionRegistry
BeanDefinition 合并
父子 BeanDefinition 合并
层次性 BeanFactory 查找
<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 接口,执行顺序从上到下
BeanNameAwareBeanClassLoaderAwareBeanFactoryAware依赖于 ApplicationContext :
EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware在初始化 Bean 实例 AbstractAutowireCapableBeanFactory#initializeBean 的最开始执行此阶段,前三个接口直接调用,而依赖于 ApplicationContext 的几个 Aware 接口,在 ApplicationContext 的生命周期中,会在 beanFactory 中加入 ApplicationContextAwareProcessor ,在其 postProcessBeforeInitialization 方法中执行调用
ApplicationContextAwareProcessor 是包权限的
已完成
方法回调
BeanPostProcessor#postProcessBeforeInitializationBean 初始化(Initialization)
@PostConstruct 标注方法 -- 该方法在初始化前阶段执行InitializingBean 接口的 afterPropertiesSet() 方法对 @PostConstruct 的处理需要依赖于注解驱动,CommonAnnotationBeanPostProcessor#postProcessBeforeInitialization
方法回调
BeanPostProcessor#postProcessAfterInitialization方法回调
SmartInitializingSingleton#afterSingletonsInstantiatedSmartInitializingSingleton 通常在 Spring ApplicationContext 场景使用
使用 BeanFactory 时,需要显式的调用此方法;在 ApplicationContext 启动时,调用了此方法 AbstractApplicationContext#finishBeanFactoryInitialization ,这个方法做了两件事情:
BeanDefinition 初始化成 Spring BeanSmartInitializingSingleton#afterSingletonsInstantiatedDestructionAwareBeanPostProcessor#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生命周期与方法映射如下:
registerBeanDefinitiongetMergedBeanDefinitionresolveBeforeInstantiationcreateBeanInstancepopulateBeanpopulateBeanpopulateBeaninitializeBeaninitializeBeaninitializeBeaninitializeBeanpreInstantiateSingletonsdestroyBeandestroyBean