您的位置:首页 > 编程语言 > Java开发

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

2017-06-24 20:06 661 查看
创建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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐