Spring Bean 生命周期
目前只写了各个阶段的轮廓,后续会继续补充
1. BeanDefinition的发现与注册
分为三个步骤: BeanDefinition的发现,抽象与注册。
Bean通过相应的Reader转变为Spring 内部数据的抽象BeanDefinition,调用 BeanDefinitionRegistry #registerBeanDefinition(String beanName, BeanDefinition beanDefinition)进行注册,一般是DefaultListableBeanFactory 作为 BeanDefinitionRegistry
-
XML
通过XmlBeanDefinitionReader 进行读取(例如classpath下面的bean.xml)
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("classpath:\\MATE-INFO\\bean.xml");
-
注解
通过 AnnotatedBeanDefinitionReader进行读取
2. BeanDefinition 的合并
getMergedLocalBeanDefinition, 如果有父类BeanDefinition 会将父类的属性先复制过来,然后子类有的属性覆盖父类
3. 实例化前阶段
如果有定义的实例化前置方法 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation返回不为空则不走spring自己的实例化方法直接将生成的Bean返回 ,applyBeanPostProcessorsAfterInitialization方法在返回Bean之前调用初始化后置方法 BeanPostProcessor#postProcessAfterInitialization
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(
targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(
bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass,
String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp =(InstantiationAwareBeanPostProcessor) bp;
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
}
return null;
}
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
4. 实例化阶段
创建一个Bean的实例
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
// Don't override the class with CGLIB if no overrides.
if (!bd.hasMethodOverrides()) {
Constructor<?> constructorToUse;
synchronized (bd.constructorArgumentLock) {
constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
if (constructorToUse == null) {
final Class<?> clazz = bd.getBeanClass();
if (clazz.isInterface()) {
throw new BeanInstantiationException(clazz, "Specified class is an interface");
}
try {
if (System.getSecurityManager() != null) {
constructorToUse = AccessController.doPrivileged(
(PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);
}
else {
constructorToUse = clazz.getDeclaredConstructor();
}
bd.resolvedConstructorOrFactoryMethod = constructorToUse;
}
catch (Throwable ex) {
throw new BeanInstantiationException(clazz, "No default constructor found", ex);
}
}
}
return BeanUtils.instantiateClass(constructorToUse);
}
else {
// Must generate CGLIB subclass.
return instantiateWithMethodInjection(bd, beanName, owner);
}
}
5.修改BeanDefinition
在调用populateBean方法前,允许定义的MergedBeanDefinitionPostProcessor修改BeanDefinition的内容,
例如AutowiredAnnotationBeanPostProcessor#applyMergedBeanDefinitionPostProcessors
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof MergedBeanDefinitionPostProcessor) {
MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
bdp.postProcessMergedBeanDefinition