public GenericApplicationContext(){this.customClassLoader =false;this.refreshed = new AtomicBoolean();this.beanFactory = new DefaultListableBeanFactory();}
public AnnotationConfigApplicationContext(){this.reader = new AnnotatedBeanDefinitionReader(this);this.scanner = new ClassPathBeanDefinitionScanner(this);}
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry){this(registry, getOrCreateEnvironment(registry));}public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment){this.beanNameGenerator = new AnnotationBeanNameGenerator();this.scopeMetadataResolver = new AnnotationScopeMetadataResolver();Assert.notNull(registry, "BeanDefinitionRegistry must not be null");Assert.notNull(environment, "Environment must not be null");this.registry = registry;this.conditionEvaluator = new ConditionEvaluator(registry, environment, (ResourceLoader)null);AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);}
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {Assert.hasText(beanName, "Bean name must not be empty");Assert.notNull(beanDefinition, "BeanDefinition must not be null");if(beanDefinition instanceof AbstractBeanDefinition){try {((AbstractBeanDefinition) beanDefinition).validate();} catch (BeanDefinitionValidationException ex){throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Validation of bean definition failed", ex);}}//注冊BeanDefinition,就是將BeanDefinition放入一個map中,key是beanName//注冊之前,先查下是否被注冊過BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);//如果已經存在,那么就檢查是否允許覆蓋,不允許直接跑異常,允許的話就記錄一些日志,然后覆蓋if(existingDefinition != null){//默認允許覆蓋if(!isAllowBeanDefinitionOverriding()){//如果bean已經被注冊了,并且不允許覆蓋,那么拋出異常throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +"': There is already [" + existingDefinition + "] bound.");}elseif(existingDefinition.getRole()< beanDefinition.getRole()){// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTUREif(logger.isWarnEnabled()){logger.warn("Overriding user-defined bean definition for bean '" + beanName +"' with a framework-generated bean definition: replacing [" +existingDefinition + "] with [" + beanDefinition + "]");}}elseif(!beanDefinition.equals(existingDefinition)){if(logger.isInfoEnabled()){logger.info("Overriding bean definition for bean '" + beanName +"' with a different definition: replacing [" + existingDefinition +"] with [" + beanDefinition + "]");}}else{if(logger.isDebugEnabled()){logger.debug("Overriding bean definition for bean '" + beanName +"' with an equivalent definition: replacing [" + existingDefinition +"] with [" + beanDefinition + "]");}}this.beanDefinitionMap.put(beanName, beanDefinition);}else{//檢查bean的創建過程是否已經開始了//通過判斷一個set集合是否為空,因為創建過的bean都會放到那個set中保存下if(hasBeanCreationStarted()){// Cannot modify startup-time collection elements anymore (for stable iteration)synchronized (this.beanDefinitionMap){this.beanDefinitionMap.put(beanName, beanDefinition);//下面4行是更新beanDefinitionNames的listList<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames = updatedDefinitions;//manualSingletonNames人工注冊的單例集合,也要更新if(this.manualSingletonNames.contains(beanName)){Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);updatedSingletons.remove(beanName);this.manualSingletonNames = updatedSingletons;}}}else{// Still in startup registration phase:仍然在啟動注冊階段this.beanDefinitionMap.put(beanName, beanDefinition);this.beanDefinitionNames.add(beanName);this.manualSingletonNames.remove(beanName);}this.frozenBeanDefinitionNames = null;}if(existingDefinition != null || containsSingleton(beanName)){resetBeanDefinition(beanName);}}
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses){this();this.register(annotatedClasses);this.refresh();}
2.1進入到 this.register(annotatedClasses);
public void register(Class<?>... annotatedClasses){Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");this.reader.register(annotatedClasses);}
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor){Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");this.beanPostProcessors.remove(beanPostProcessor);this.beanPostProcessors.add(beanPostProcessor);if(beanPostProcessor instanceof InstantiationAwareBeanPostProcessor){this.hasInstantiationAwareBeanPostProcessors =true;}if(beanPostProcessor instanceof DestructionAwareBeanPostProcessor){this.hasDestructionAwareBeanPostProcessors =true;}}
addBeanPostProcessor()方法定義在AbstractBeanFactory抽象類中,Spring添加自己定義的后置處理器 通過this.beanPostProcessors.add(beanPostProcessor);將spring后置處理器全部添加到BeanPostProcessor泛型的一個list當中 private final List beanPostProcessors = new ArrayList(); 3.4BeanPostProcessor接口:
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext){//從beanFactory查詢之前注冊的BeanPostProcessor類型的bean名字String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);//實例化一個BeanPostProcessorChecker,用于記錄日志信息,比如當一個bean沒有被任何后置處理器處理時//BeanPostProcessorChecker是一個內部類,實現了BeanPostProcessor接口// Register BeanPostProcessorChecker that logs an info message when// a bean is created during BeanPostProcessor instantiation, i.e. when// a bean is not eligible for getting processed by all BeanPostProcessors.int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Separate between BeanPostProcessors that implement PriorityOrdered,Ordered, and the rest.//這里也分為PriorityOrdered,Ordered, and 其他 3中情況分開處理;所以先遍歷一遍,把類型分開;//遍歷時候,順便把PriorityOrdered實例化了List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();//是否框架內部使用的PostProcessorList<BeanPostProcessor> internalPostProcessors = new ArrayList<>();List<String> orderedPostProcessorNames = new ArrayList<>();List<String> nonOrderedPostProcessorNames = new ArrayList<>();for(String ppName : postProcessorNames){if(beanFactory.isTypeMatch(ppName, PriorityOrdered.class)){BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);if(pp instanceof MergedBeanDefinitionPostProcessor){internalPostProcessors.add(pp);}}elseif(beanFactory.isTypeMatch(ppName, Ordered.class)){orderedPostProcessorNames.add(ppName);}else{nonOrderedPostProcessorNames.add(ppName);}}// First, register the BeanPostProcessors that implement PriorityOrdered.//首先注冊實現了PriorityOrdered接口的,注冊就是把實例化的ostProcessors放到容器的list結合中sortPostProcessors(priorityOrderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// Next, register the BeanPostProcessors that implement Ordered.//然后注冊Ordered實現了Ordered接口的List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();for(String ppName : orderedPostProcessorNames){BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);orderedPostProcessors.add(pp);if(pp instanceof MergedBeanDefinitionPostProcessor){internalPostProcessors.add(pp);}}sortPostProcessors(orderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, orderedPostProcessors);// Now, register all regular BeanPostProcessors.//最后注冊其他類型的List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();for(String ppName : nonOrderedPostProcessorNames){BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);nonOrderedPostProcessors.add(pp);if(pp instanceof MergedBeanDefinitionPostProcessor){internalPostProcessors.add(pp);}}registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);// Finally, re-register all internal BeanPostProcessors.//最后注冊內部類型的BeanPostProcessorssortPostProcessors(internalPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, internalPostProcessors);// Re-register post-processor for detecting inner beans as ApplicationListeners,// moving it to the end of the processor chain (for picking up proxies etc).//初始化一個類,用于監聽器的探測beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));}
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) throws BeanCreationException {BeanWrapper instanceWrapper = null;if(mbd.isSingleton()){instanceWrapper =(BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);}if(instanceWrapper == null){instanceWrapper = this.createBeanInstance(beanName, mbd, args);}final Object bean = instanceWrapper != null ? instanceWrapper.getWrappedInstance(): null;Class<?> beanType = instanceWrapper != null ? instanceWrapper.getWrappedClass(): null;mbd.resolvedTargetType = beanType;synchronized(mbd.postProcessingLock){if(!mbd.postProcessed){try {this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);} catch (Throwable var17){throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", var17);}mbd.postProcessed =true;}}boolean earlySingletonExposure = mbd.isSingleton()&& this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);if(earlySingletonExposure){if(this.logger.isDebugEnabled()){this.logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");}this.addSingletonFactory(beanName, new ObjectFactory<Object>(){public Object getObject() throws BeansException {return AbstractAutowireCapableBeanFactory.this.getEarlyBeanReference(beanName, mbd, bean);}});}Object exposedObject = bean;try {this.populateBean(beanName, mbd, instanceWrapper);if(exposedObject != null){exposedObject = this.initializeBean(beanName, exposedObject, mbd);}} catch (Throwable var18){if(var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())){throw (BeanCreationException)var18;}throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);}if(earlySingletonExposure){Object earlySingletonReference = this.getSingleton(beanName, false);if(earlySingletonReference != null){if(exposedObject == bean){exposedObject = earlySingletonReference;}elseif(!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)){String[] dependentBeans = this.getDependentBeans(beanName);Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length);String[] var12 = dependentBeans;int var13 = dependentBeans.length;for(int var14 = 0; var14 < var13; ++var14){String dependentBean = var12[var14];if(!this.removeSingletonIfCreatedForTypeCheckOnly(dependentBean)){actualDependentBeans.add(dependentBean);}}if(!actualDependentBeans.isEmpty()){throw new BeanCurrentlyInCreationException(beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + "] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");}}}}try {this.registerDisposableBeanIfNecessary(beanName, bean, mbd);return exposedObject;} catch (BeanDefinitionValidationException var16){throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16);}}