典型回答 ✅Spring Bean的生命周期是怎么样的?
先看过上面这篇,我们就能知道,Spring的可以分为5个小的阶段:实例化、初始化、注册Destruction回调、Bean的正常使用以及Bean的销毁。
我们再把初始化的这个过程单独拿出来展开介绍一下。(本文代码基于 Spring 6.0版本)
首先先看一下初始化和实例化的区别是什么?
在Spring框架中,初始化和实例化是两个不同的概念:
实例化(Instantiation):
实例化是创建对象的过程。在Spring中,这通常指的是通过调用类的构造器来创建Bean的实例。这是对象生命周期的开始阶段。对应doCreateBean中的createBeanInstance方法。 初始化(Initialization):
初始化是在Bean实例创建后,进行一些设置或准备工作的过程。在Spring中,包括设置Bean的属性,调用各种前置&后置处理器。对应doCreateBean中的populateBean和initializeBean方法。 下面是SpringBean的实例化+初始化的完整过程:
实例化Bean Spring容器在这一步创建Bean实例。其主要代码在AbstractAutowireCapableBeanFactory类中的createBeanInstance方法中实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) { // 解析Bean的类,确保Bean的类在这个点已经被确定 Class<?> beanClass = resolveBeanClass(mbd, beanName); // 检查Bean的访问权限,确保非public类允许访问 if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Bean class isn't public, and non-public access not allowed: " + beanClass.getName()); } // 如果Bean定义中指定了工厂方法,则通过工厂方法创建Bean实例 if (mbd.getFactoryMethodName() != null) { return instantiateUsingFactoryMethod(beanName, mbd, args); } // 当重新创建相同的Bean时的快捷路径 boolean resolved = false; boolean autowireNecessary = false; if (args == null) { synchronized (mbd.constructorArgumentLock) { // 如果构造方法或工厂方法已经被解析,直接使用解析结果 if (mbd.resolvedConstructorOrFactoryMethod != null) { resolved = true; autowireNecessary = mbd.constructorArgumentsResolved; } } } if (resolved) { // 如果需要自动装配构造函数参数,则调用相应方法进行处理 if (autowireNecessary) { return autowireConstructor(beanName, mbd, null, null); } else { // 否则使用无参构造函数或默认构造方法创建实例 return instantiateBean(beanName, mbd); } } // 通过BeanPostProcessors确定构造函数候选 Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); // 如果有合适的构造函数或需要通过构造函数自动装配,则使用相应的构造函数创建实例 if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR || mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { return autowireConstructor(beanName, mbd, ctors, args); } // 没有特殊处理,使用默认的无参构造函数创建Bean实例 return instantiateBean(beanName, mbd); } 其实就是先确保这个Bean对应的类已经被加载,然后确保它是public的,然后如果有工厂方法,则直接调用工厂方法创建这个Bean,如果没有的话就调用它的构造方法来创建这个Bean。
...