【知识库】--spring 创建bean的实例-createBeanInstance方法解析(240)

来源:互联网 发布:linux找不到mysql命令 编辑:程序博客网 时间:2024/06/06 20:04

创建bean的实例


protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args){
         //解析class
         Class beanClass  = resolveBeanClass(mbd, beanName);
         if(beanClass!=null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()){
                    throw new BeanCreationException(//" Bean class is not public ,and no-public access not allowed");
         }
        //如果工厂方法不为空则使用工厂方法初始化策略
        if(mbd.getFactoryMethodName()!=null){//配置了factory-method
                  return instantiateUsingFactoryMethod(beanName,mbd,args);
       }
      // 短路操作 re-creating the same 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);
                  }
       }


      //需要根据参数解析构造函数
      Constructor[] ctors = determineConstuctorsFromBeanPostProcessors(beanClass,beanName);
      if(actors != null || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR || 
                    mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args) ){
                    return autowireConstructor(beanName,mbd,ctors,args);//构造函数自动注入
       }
      //使用默认构造函数构造
      return instantiateBean(beanName,mbd);
}

阅读全文
0 0
原创粉丝点击