bean实例化解析 doGetBean()

  1 protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
  2             @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
  3 
  4         final String beanName = transformedBeanName(name);
  5         Object bean;
  6 
  7         // Eagerly check singleton cache for manually registered singletons.
       //beanA第一次走到这里结果=null
       //如果有依赖循环,beanA第二次走到这里,一级缓存=null,二级缓存=null,三级缓存有值,会把三级缓存中的值放入到二级缓存中去,
       //此时通过三级缓存中拿到的bean就是代理对象(lambda表达式调用
getEarlyBeanReference()获取的值),此时二级缓存中才会有数据,
       //之后调用 Object earlySingletonReference = getSingleton(beanName, false);获取二级缓存中的bean
8     Object sharedInstance = getSingleton(beanName);
  9         if (sharedInstance != null && args == null) {
 10             if (logger.isTraceEnabled()) {
            //一般都会处于创建中
11 if (isSingletonCurrentlyInCreation(beanName)) { 12 logger.trace("Returning eagerly cached instance of singleton bean '" + beanName + 13 "' that is not fully initialized yet - a consequence of a circular reference"); 14 } 15 else { 16 logger.trace("Returning cached instance of singleton bean '" + beanName + "'"); 17 } 18 }
          //对FactoryBean的处理逻辑,如果不是FactoryBean的实现类,直接返回从二级缓存中获取的对象
19 bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); 20 } 21 22 else { 23 // Fail if we're already creating this bean instance: 24 // We're assumably within a circular reference.
         //bean的作用域是多例时,如果bean已经在创建中,说明存在依赖循环,抛异常
25 if (isPrototypeCurrentlyInCreation(beanName)) { 26 throw new BeanCurrentlyInCreationException(beanName); 27 } 28 29 // Check if bean definition exists in this factory. 30 BeanFactory parentBeanFactory = getParentBeanFactory(); 31 if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { 32 // Not found -> check parent. 33 String nameToLookup = originalBeanName(name); 34 if (parentBeanFactory instanceof AbstractBeanFactory) { 35 return ((AbstractBeanFactory) parentBeanFactory).doGetBean( 36 nameToLookup, requiredType, args, typeCheckOnly); 37 } 38 else if (args != null) { 39 // Delegation to parent with explicit args. 40 return (T) parentBeanFactory.getBean(nameToLookup, args); 41 } 42 else if (requiredType != null) { 43 // No args -> delegate to standard getBean method. 44 return parentBeanFactory.getBean(nameToLookup, requiredType); 45 } 46 else { 47 return (T) parentBeanFactory.getBean(nameToLookup); 48 } 49 } 50 51 if (!typeCheckOnly) { 52 markBeanAsCreated(beanName); 53 } 54 55 try { 56 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); 57 checkMergedBeanDefinition(mbd, beanName, args); 58 59 // Guarantee initialization of beans that the current bean depends on. 60 String[] dependsOn = mbd.getDependsOn(); 61 if (dependsOn != null) { 62 for (String dep : dependsOn) { 63 if (isDependent(beanName, dep)) { 64 throw new BeanCreationException(mbd.getResourceDescription(), beanName, 65 "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); 66 } 67 registerDependentBean(dep, beanName); 68 try { 69 getBean(dep); 70 } 71 catch (NoSuchBeanDefinitionException ex) { 72 throw new BeanCreationException(mbd.getResourceDescription(), beanName, 73 "'" + beanName + "' depends on missing bean '" + dep + "'", ex); 74 } 75 } 76 } 77 78 // Create bean instance.
            //但bean的作用域是单例时 79 if (mbd.isSingleton()) { 80 // getSingleton()第2个入参是一个函数式接口,当调用ObjectFactory的getObject()时,才会调用到这里的createBean(beanName, mbd, args);
            //解析过程详见@getSingleton......... 81 sharedInstance = getSingleton(beanName, () -> { 82 try { 83 return createBean(beanName, mbd, args); 84 } 85 catch (BeansException ex) { 86 // Explicitly remove instance from singleton cache: It might have been put there 87 // eagerly by the creation process, to allow for circular reference resolution. 88 // Also remove any beans that received a temporary reference to the bean. 89 destroySingleton(beanName); 90 throw ex; 91 } 92 }); 93 bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); 94 } 95 96 else if (mbd.isPrototype()) { 97 // It's a prototype -> create a new instance. 98 Object prototypeInstance = null; 99 try { 100 beforePrototypeCreation(beanName); 101 prototypeInstance = createBean(beanName, mbd, args); 102 } 103 finally { 104 afterPrototypeCreation(beanName); 105 } 106 bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); 107 } 108 109 else { 110 String scopeName = mbd.getScope(); 111 final Scope scope = this.scopes.get(scopeName); 112 if (scope == null) { 113 throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'"); 114 } 115 try { 116 Object scopedInstance = scope.get(beanName, () -> { 117 beforePrototypeCreation(beanName); 118 try { 119 return createBean(beanName, mbd, args); 120 } 121 finally { 122 afterPrototypeCreation(beanName); 123 } 124 }); 125 bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); 126 } 127 catch (IllegalStateException ex) { 128 throw new BeanCreationException(beanName, 129 "Scope '" + scopeName + "' is not active for the current thread; consider " + 130 "defining a scoped proxy for this bean if you intend to refer to it from a singleton", 131 ex); 132 } 133 } 134 } 135 catch (BeansException ex) { 136 cleanupAfterBeanCreationFailure(beanName); 137 throw ex; 138 } 139 } 140 141 // Check if required type matches the type of the actual bean instance. 142 if (requiredType != null && !requiredType.isInstance(bean)) { 143 try { 144 T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType); 145 if (convertedBean == null) { 146 throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); 147 } 148 return convertedBean; 149 } 150 catch (TypeMismatchException ex) { 151 if (logger.isTraceEnabled()) { 152 logger.trace("Failed to convert bean '" + name + "' to required type '" + 153 ClassUtils.getQualifiedName(requiredType) + "'", ex); 154 } 155 throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); 156 } 157 } 158 return (T) bean; 159 } 160 161 162 163 @Override 164 protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) 165 throws BeanCreationException { 166 167 if (logger.isTraceEnabled()) { 168 logger.trace("Creating instance of bean '" + beanName + "'"); 169 } 170 RootBeanDefinition mbdToUse = mbd; 171 172 // Make sure bean class is actually resolved at this point, and 173 // clone the bean definition in case of a dynamically resolved Class 174 // which cannot be stored in the shared merged bean definition. 175 Class<?> resolvedClass = resolveBeanClass(mbd, beanName); 176 if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) { 177 mbdToUse = new RootBeanDefinition(mbd); 178 mbdToUse.setBeanClass(resolvedClass); 179 } 180 181 // Prepare method overrides. 182 try { 183 mbdToUse.prepareMethodOverrides(); 184 } 185 catch (BeanDefinitionValidationException ex) { 186 throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), 187 beanName, "Validation of method overrides failed", ex); 188 } 189 190 try { 191 // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. 192 Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 193 if (bean != null) { 194 return bean; 195 } 196 } 197 catch (Throwable ex) { 198 throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, 199 "BeanPostProcessor before instantiation of bean failed", ex); 200 } 201 202 try { 203 //这里面开始 204 Object beanInstance = doCreateBean(beanName, mbdToUse, args); 205 if (logger.isTraceEnabled()) { 206 logger.trace("Finished creating instance of bean '" + beanName + "'"); 207 } 208 return beanInstance; 209 } 210 catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) { 211 // A previously detected exception with proper bean creation context already, 212 // or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry. 213 throw ex; 214 } 215 catch (Throwable ex) { 216 throw new BeanCreationException( 217 mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex); 218 } 219 } 220 221 222 223 224 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) 225 throws BeanCreationException { 226 227 // Instantiate the bean. 228 BeanWrapper instanceWrapper = null; 229 if (mbd.isSingleton()) { 230 instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); 231 } 232 if (instanceWrapper == null) { 233 //开始创建实例,很重要,里面很复杂,主要是通过推断构造函数来生成对象,但此时的对象只是最基础的,没有对属性赋值,也没有初始化,比如new A() 234 instanceWrapper = createBeanInstance(beanName, mbd, args); 235 } 236 final Object bean = instanceWrapper.getWrappedInstance(); 237 Class<?> beanType = instanceWrapper.getWrappedClass(); 238 if (beanType != NullBean.class) { 239 mbd.resolvedTargetType = beanType; 240 } 241 242 // Allow post-processors to modify the merged bean definition. 243 synchronized (mbd.postProcessingLock) { 244 if (!mbd.postProcessed) { 245 try { 246 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); 247 } 248 catch (Throwable ex) { 249 throw new BeanCreationException(mbd.getResourceDescription(), beanName, 250 "Post-processing of merged bean definition failed", ex); 251 } 252 mbd.postProcessed = true; 253 } 254 } 255 256 // Eagerly cache singletons to be able to resolve circular references 257 // even when triggered by lifecycle interfaces like BeanFactoryAware.
        //是单例&&允许依赖循环&&在创建中,一般都会满足3个条件
258 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && 259 isSingletonCurrentlyInCreation(beanName)); 260 if (earlySingletonExposure) { 261 if (logger.isTraceEnabled()) { 262 logger.trace("Eagerly caching bean '" + beanName + 263 "' to allow for resolving potential circular references"); 264 }
         //将bean包装成ObjectFactory<?> singletonFactory,这样的好处是如果有依赖循环时,才生成代理对象,调用链如下:
         //在Object sharedInstance = getSingleton(beanName);这里面通过singletonObject = singletonFactory.getObject()会调用到getEarlyBeanReference()有AOP则会生成代理对象
         //三级缓存在这个方法里面增加,默认所有的bean都会存在三级缓存中一次
265 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
         //三级缓存是可以去掉的,但是会违背spring的设计原则。spring的aop的生命周期,是在bean完全创建完后通过AnnotationAwareAspectJAutoProxyCreator这个来完成的,
         //通过里面的postProcessAfterInitialization来进行处理的,而因为存在依赖循环只能提前创建代理对象。
         //如果立马从三级缓存中把bean放入二级缓存中,实际上也没有任何问题 getSingleton(beanName,true)
266 }
        
267 268 // Initialize the bean instance. 269 Object exposedObject = bean; 270 try {, 271 //填充属性,很重要,即给bean中依赖的变量实例化,注入到容器中,@AutoWired注解就在这里面实现 buildAutowiringMetadata这里面可以看出@Autowired不支持static属性 272 populateBean(beanName, mbd, instanceWrapper); 273 //初始化,这里面会处理BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、beanPostProcessors、afterPropertiesSet、init-Method 274 exposedObject = initializeBean(beanName, exposedObject, mbd); 275 } 276 catch (Throwable ex) { 277 if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) { 278 throw (BeanCreationException) ex; 279 } 280 else { 281 throw new BeanCreationException( 282 mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex); 283 } 284 } 285 286 if (earlySingletonExposure) {
        //直接从二级缓存中获取bean,false表示不从三级缓存中取bean,没有依赖循环则earlySingletonReference==null, 有依赖循环才会有值,如果是结合了AOP依赖循环,那么获取的就是代理类
287 Object earlySingletonReference = getSingleton(beanName, false); 288 if (earlySingletonReference != null) {
          //在初始化过程中如果bean没有被修改过(一般都相等,除非通过beanPostProcess接口after进行修改)
289 if (exposedObject == bean) {
            //不管是cglib代理还是jdk动态代理生成的代理类,内部都持有一个目标类的引用,当调用代理对象的方法时,实际会去调用目标对象的方法,A完成初始化相当于代理对象自身也完成了初始化
290 exposedObject = earlySingletonReference; 291 } 292 else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) { 293 String[] dependentBeans = getDependentBeans(beanName); 294 Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length); 295 for (String dependentBean : dependentBeans) { 296 if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) { 297 actualDependentBeans.add(dependentBean); 298 } 299 } 300 if (!actualDependentBeans.isEmpty()) { 301 throw new BeanCurrentlyInCreationException(beanName, 302 "Bean with name '" + beanName + "' has been injected into other beans [" + 303 StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + 304 "] in its raw version as part of a circular reference, but has eventually been " + 305 "wrapped. This means that said other beans do not use the final version of the " + 306 "bean. This is often the result of over-eager type matching - consider using " + 307 "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example."); 308 } 309 } 310 } 311 } 312 313 // Register bean as disposable. 314 try { 315 registerDisposableBeanIfNecessary(beanName, bean, mbd); 316 } 317 catch (BeanDefinitionValidationException ex) { 318 throw new BeanCreationException( 319 mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex); 320 } 321 322 return exposedObject; 323 }

 

@解析getSingleton.............

 1     public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
 2         Assert.notNull(beanName, "Bean name must not be null");
      //加锁是为了不获取不完整的bean
3 synchronized (this.singletonObjects) {
        //首次进入一级缓存中肯定没有,所以为null
4 Object singletonObject = this.singletonObjects.get(beanName); 5 if (singletonObject == null) { 6 if (this.singletonsCurrentlyInDestruction) { 7 throw new BeanCreationNotAllowedException(beanName, 8 "Singleton bean creation not allowed while singletons of this factory are in destruction " + 9 "(Do not request a bean from a BeanFactory in a destroy method implementation!)"); 10 } 11 if (logger.isDebugEnabled()) { 12 logger.debug("Creating shared instance of singleton bean '" + beanName + "'"); 13 }
          //对bean打上在创建中的标记,如果打不上去(add失败),说明依赖循环有问题
14 beforeSingletonCreation(beanName); 15 boolean newSingleton = false; 16 boolean recordSuppressedExceptions = (this.suppressedExceptions == null); 17 if (recordSuppressedExceptions) { 18 this.suppressedExceptions = new LinkedHashSet<>(); 19 } 20 try {
            //调用 return createBean(beanName, mbd, args);
21 singletonObject = singletonFactory.getObject(); 22 newSingleton = true; 23 } 24 catch (IllegalStateException ex) { 25 // Has the singleton object implicitly appeared in the meantime -> 26 // if yes, proceed with it since the exception indicates that state. 27 singletonObject = this.singletonObjects.get(beanName); 28 if (singletonObject == null) { 29 throw ex; 30 } 31 } 32 catch (BeanCreationException ex) { 33 if (recordSuppressedExceptions) { 34 for (Exception suppressedException : this.suppressedExceptions) { 35 ex.addRelatedCause(suppressedException); 36 } 37 } 38 throw ex; 39 } 40 finally { 41 if (recordSuppressedExceptions) { 42 this.suppressedExceptions = null; 43 } 44 afterSingletonCreation(beanName); 45 } 46 if (newSingleton) { 47 addSingleton(beanName, singletonObject); 48 } 49 } 50 return singletonObject; 51 } 52 }

 

   //此处会把 singletonFactory 放入三级缓存中
1
protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) { 2 Assert.notNull(singletonFactory, "Singleton factory must not be null"); 3 synchronized (this.singletonObjects) { 4 if (!this.singletonObjects.containsKey(beanName)) { 5 this.singletonFactories.put(beanName, singletonFactory); 6 this.earlySingletonObjects.remove(beanName); 7 this.registeredSingletons.add(beanName); 8 } 9 } 10 }

 

         一级缓存:singletonObjects 二级缓存:earlySingletonObjects 三级缓存:singletonFactories
1
protected Object getSingleton(String beanName, boolean allowEarlyReference) { 2 Object singletonObject = this.singletonObjects.get(beanName); 3 if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { 4 synchronized (this.singletonObjects) { 5 singletonObject = this.earlySingletonObjects.get(beanName); 6 if (singletonObject == null && allowEarlyReference) { 7 ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); 8 if (singletonFactory != null) {
                //生成代理对象
9 singletonObject = singletonFactory.getObject(); 10 this.earlySingletonObjects.put(beanName, singletonObject); 11 this.singletonFactories.remove(beanName); 12 } 13 } 14 } 15 } 16 return singletonObject; 17 }

 

 

 1     protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
 2         Object exposedObject = bean;
 3         if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
 4             for (BeanPostProcessor bp : getBeanPostProcessors()) {
        //
它实际上就是调用了后置处理器的getEarlyBeanReference,而真正实现了这个方法的后置处理器只有一个,
        //就是通过@EnableAspectJAutoProxy注解导入的AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator。也就是说如果在不考虑AOP的情况下,上面的代码等价于:
          protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {

              Object exposedObject = bean;
              return exposedObject;
            }

 5                 if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
 6                     SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
 7                     exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
 8                 }
 9             }
10         }
11         return exposedObject;
12     }

 

buildAutowiringMetadata
posted @ 2021-04-30 09:12  龙之谷2019  阅读(131)  评论(0)    收藏  举报