Spring Bean 创建过程

首先调用getBean(“beanName”); 

applicationContext.getBean("name");

然后再调用

org.springframework.context.support.AbstractApplicationContext#getBean(java.lang.String)
@Override
public Object getBean(String name) throws BeansException { assertBeanFactoryActive();
     // 调用getBean 进入AbstractBeanFactory
return getBeanFactory().getBean(name); }

在调用doGetBean

org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
    @SuppressWarnings("unchecked")
    protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
            @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
        // 做别名解析 删除工厂引用前缀 String FACTORY_BEAN_PREFIX = "&";
        final String beanName = transformedBeanName(name);
        Object bean;
     
     // 去单例缓存池中去取 如果取到了直接返回
// Eagerly check singleton cache for manually registered singletons. Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { if (logger.isDebugEnabled()) { if (isSingletonCurrentlyInCreation(beanName)) { logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference"); } else { logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); } }
// 创建的对象有可能不是我们想要的 也有可能是工厂Bean 在这里做处理 转换为Bean实例进行返回 bean
= getObjectForBeanInstance(sharedInstance, name, beanName, null); } else {
// 从单例缓存池中 没有获取到 走这里
// Fail if we're already creating this bean instance: // We're assumably within a circular reference.
// 判断是否是原型对象 是原型对象直接抛异常 spring 的原型对象不能解决循环依赖 if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } // Check if bean definition exists in this factory. BeanFactory parentBeanFactory = getParentBeanFactory();
       // 判断父容器是否为空 并判断当前beanDefinitionMap 中是否有改bean定义
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 { // No args -> delegate to standard getBean method. return parentBeanFactory.getBean(nameToLookup, requiredType); } } // 是否获取实例用于类型检查而不是实际使用(创建Bean做标记) if (!typeCheckOnly) { markBeanAsCreated(beanName); } try {
         // 合并父子 BeanDefinaitionMap  
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
// 判断mdb 四否是抽象的 是的话抛异常 checkMergedBeanDefinition(mbd, beanName, args);
// Guarantee initialization of beans that the current bean depends on.
          // 获取创建依赖对象 进行判断 并处理 如果A 依赖 B 的话 那么检测到后会先创建B 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); } } }           
          // 创建单实例Bean
// Create bean instance. if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { 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); }           // 创建其它Bean 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(); final 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 BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; consider " + "defining a scoped proxy for this bean if you intend to refer to it from a singleton", ex); } } } catch (BeansException ex) { cleanupAfterBeanCreationFailure(beanName); throw ex; } } // Check if required type matches the type of the actual bean instance. 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.isDebugEnabled()) { logger.debug("Failed to convert bean '" + name + "' to required type '" + ClassUtils.getQualifiedName(requiredType) + "'", ex); } throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } } return (T) bean; }

 

 getSingleton 方法解析

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)
@Nullable
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
     // 从缓存池中获取bean singletonObjects 一级缓存 Object singletonObject
= this.singletonObjects.get(beanName);
// 如果一级缓存中为null 再判断是否正在创建
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
// 防止并发创建
synchronized (this.singletonObjects) {
// 早期对象缓存中是否有该对象 singletonObject
= this.earlySingletonObjects.get(beanName);
// 早期对象没有 暴露早期对象 放入
earlySingletonObjects 用于解决循环依赖
           if (singletonObject == null && allowEarlyReference) {
ObjectFactory
<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) {
// 获取早期对象 singletonObject
= singletonFactory.getObject();
// 存入早期对象
this.earlySingletonObjects.put(beanName, singletonObject);
// 删除单例缓存工厂中bean
this.singletonFactories.remove(beanName); } } } } return singletonObject; }

 

posted @ 2020-04-29 19:24  TT007  阅读(507)  评论(0)    收藏  举报