⼀、前⾔
Spring 中 Bean 的⽣命周期⼀直都是个⾼频⾯试题,丙丙基本上⾯哪⾥也都会被问到,⼤家是不是可能
都是很简单的回答, 就好了?
讲道理以前我也是这么认为的,但是后⾯我看了spring的源码之后(绝对是所有源码⾥⾯最难看懂的)
发现没那么简单,⽽且上⾯的回答,基本上在⼤⼚的⾯试⾥⾯都是GG。
本⽂就来结合源码来分析 Bean 的实例化和初始化两个阶段,并引出相关的拓展点。
⼆、bean的创建
DefaultListableBeanFactory 的抽象⽗类 AbstractAutowireCapableBeanFactory 完成了 Bean 的实例化
和初始化。
protected Object createBean(String beanName, RootBeanDefinition mbd,
@Nullable Object[] args){
RootBeanDefinition mbdToUse = mbd;
// 1-类加载校验
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() &&
mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// 2-⽅法覆盖校验和准备
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new
BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
// 3-如果 Bean 配置了实例化的前置处理器,则返回对应的代理对象
try {
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
评论