概述
开发人员写的类被spring扫描到容器后,并不是一开始就是一个完整的Bean了,spring扫描的是被注解或者是xml配置的类的信息,spring将类的信息或者是xml的信息保存在BeanDefinition的数据结构中,然而,如果我们想要得到一个可以使用的对象,是需要由spring来创建,这也就是网上常说的将bean的管理和创建交给spring
由于bean的生命十分复杂,涉及的点也比较多,本文主要对BeanDefintion的合并进行解析,而关于生命周期的后面的内容会陆续跟新
生命周期
首先简单看一下生命周期前的方法调用栈
从方法名字就可以看出核心的方法preInstantiateSingletons,在这里面就会完成spring 的单例Bean的初始化
接下来直接进入preInstantiateSingletons
在preInstantiateSingletons这个方法里面有两个for循环,我们来看第一个
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof FactoryBean) {
final FactoryBean<?> factory = (FactoryBean<?>) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
((SmartFactoryBean<?>) factory)::isEagerInit,
getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}