01|Bean的初始化
1、AbstractApplicationContext
Spring管理的所有的非懒加载的单例Bean会随着容器的初始化加载到容器中,初始化入口依旧在AbstractApplicationContext的refresh方法中
public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {@Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// 代码略...// 1.1、实例化并调⽤实现了BeanFactoryPostProcessor接⼝的Bean// 会扫描注册Bean的元数据信息并存入BeanFactory的beanDefinitionNames中// Spring会将需要创建的Bean的信息封装到BeanDefinition类中,其中包含的类的所有元数据信息,如类的全路径名、声明周期等等invokeBeanFactoryPostProcessors(beanFactory);// 代码略...// 1.2、依据1.1中的Bean元数据信息实例话所有非懒加载的单例beanfinishBeanFactoryInitialization(beanFactory);// 代码略...}protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// 调用DefaultListableBeanFactory的preInstantiateSingletons方法进行开始Bean的创建beanFactory.preInstantiateSingletons();}}
2、DefaultListableBeanFactory
DefaultListableBeanFactory的preInstantiateSingletons方法中会遍历注册到beanFactory的Bean信息进行对象的逐一创建
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {@Overridepublic void preInstantiateSingletons() throws BeansException {// 代码略...// 此处先不关注其余代码,只看getBean方法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) {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);}}}else {getBean(beanName);}}// 代码略...}}}
3、AbstractBeanFactory
getBean方法是定义在其父类AbstractBeanFactory中
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {@Overridepublic Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);}protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)throws BeansException {String beanName = transformedBeanName(name);Object bean;// 3.1、检查缓存中或者实例工厂中是否有对应的实例// 在创建单例Bean时会存在依赖注入的情况,Spring会通过ObjectFactory如提早曝光Bean对象,避免循环依赖,Object sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// Fail if we're already creating this bean instance:// We're assumably within a circular reference.if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// Check if bean definition exists in this factory.BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// Not found -> check parent.String nameToLookup = originalBeanName(name);if (parentBeanFactory instanceof AbstractBeanFactory) {return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);}else if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);}else if (requiredType != null) {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}else {return (T) parentBeanFactory.getBean(nameToLookup);}}if (!typeCheckOnly) {markBeanAsCreated(beanName);}StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate").tag("beanName", name);try {if (requiredType != null) {beanCreation.tag("beanType", requiredType::toString);}RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// 3.2、检查是否存在依赖,若需要进行递归创建依赖String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dep : dependsOn) {if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}registerDependentBean(dep, beanName);try {getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}// 3.3、通过回调的方式创建Beanif (mbd.isSingleton()) {sharedInstance = getSingleton(beanName, () -> {try {// 此处会调用AbstractAutowireCapableBeanFactory的doCreateBean方法进行Bean的实例化return createBean(beanName, mbd, args);}catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}else if (mbd.isPrototype()) {// It's a prototype -> create a new instance.Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else {String scopeName = mbd.getScope();if (!StringUtils.hasLength(scopeName)) {throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");}Scope scope = this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");}try {Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {throw new ScopeNotActiveException(beanName, scopeName, ex);}}}catch (BeansException ex) {beanCreation.tag("exception", ex.getClass().toString());beanCreation.tag("message", String.valueOf(ex.getMessage()));cleanupAfterBeanCreationFailure(beanName);throw ex;}finally {beanCreation.end();}}// 3.4、类型检查if (requiredType != null && !requiredType.isInstance(bean)) {try {T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);if (convertedBean == null) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch (TypeMismatchException ex) {if (logger.isTraceEnabled()) {logger.trace("Failed to convert bean '" + name + "' to required type '" +ClassUtils.getQualifiedName(requiredType) + "'", ex);}throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return (T) bean;}}
02|循环依赖对象创建分析
//开始初始化BeanDefaultListableBeanFactory#preInstantiateSingletonsAbstractBeanFactory#getBeanAbstractBeanFactory#doGetBean// #从三级缓存中获取Bean,解决循环依赖关键位置,第一次返回nullDefaultSingletonBeanRegistry#getSingletonprotected Object getSingleton(String beanName, boolean allowEarlyReference) {// 从一级缓存获取,获取成功则对象已经创建成功Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {synchronized (this.singletonObjects) {// 从二级缓存取singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);if (singletonFactory != null) {// 从三级缓存取,获取成功则从三件缓存**剪切**对象到二级缓存singletonObject = singletonFactory.getObject();this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}return singletonObject;}// 创建实例bean,还未对实例bean对象属性进行赋值AbstractAutowireCapableBeanFactory#doCreateBeanAbstractAutowireCapableBeanFactory#createBeanInstance// 将实例bean包装未ObjectFactory对象,放入三级缓存提前暴露对象 DefaultSingletonBeanRegistry#addSingletonFactory(ObjectFactory)// 属性填充AbstractAutowireCapableBeanFactory#populateBeanAbstractAutowireCapableBeanFactory#autowire*AbstractBeanFactory#getBeanAbstractBeanFactory#doGetBean// 继续尝试从三级缓存中获取对象,如获取失败,执行bean创建逻辑,并放入缓存供依赖对象获取填充DefaultSingletonBeanRegistry#getSingleton

