Spring源码分析(二)IOC容器的创建-ClassPathXmlApplicationContext篇

版权声明:本文为博主原创文章,转载添加原文链接 https://blog.csdn.net/qq_34190023/article/details/80879382

ClassPathXmlApplicationContext流程:

ClassPathXmlApplicationContext内部维护了Resource[]数组对用户传入的配置文件进行保存。

AbstractRefreshableConfigApplicationContext的setConfigLocations方法,通过递归,将配置文件的真实路径进行记录。

构造方法中调用父类构造方法,最终将父容器设置进去保存起来。没有父容器则为null

调用setConfigLocations方法,对传入的配置文件进行设置以及保存

Refresh方法对ICO容器的初始化配置起到关键作用,默认是开启这个方法的,

Refresh是AbstractApplicationContext的一个关键方法。

AbstractApplicationContext中封装了很多初始化IOC容器的 关键方法。

AbstractApplicationContext类的refresh方法。

调用了prepareRefresh方法设置context当前的状态,是活动状态还是关闭状态。初始化contextenvironment(上下文环境)中的占位符属性来源。验证所有必需的属性。

调用obtainFreshBeanFactory方法创建了一个bean工厂,这里进行了加载xml,解析xml,获取bean到ioc容器
调用prepareBeanFactory方法配置这个工厂的标准环境,比如context的类加载器和后处理器。都是往BeanFactory中add什么东西,或者Register什么东西。反正在一系列的add和Register后工厂的功能会越来越健全

postProcessBeanFactory

invokeBeanFactoryPostProcessors调用所有的bean工厂处理器(BeanFactoryPostProcessor)对bean工厂进行一些处理

registerBeanPostProcessors/注册bean后处理器 注册用来拦截bean创建的BeanPostProcessor bean.这个方法需要在所有的application bean初始化之前调用。把这个注册的任务委托给了PostProcessorRegistrationDelegate来完成

initMessageSource初始化消息源

initApplicationEventMulticaster初始化应用上下文事件广播器

onRefresh初始化其他特殊的bean【子类可借助这个方法执行特殊的操作】

registerListeners注册事件监听器

finishBeanFactoryInitialization初始化所有单实例的bean,使用懒初始化模式的bean除外

finishRefresh完成刷新并发布容器刷新事件【创建上下文刷新事件,事件广播器负责将这些事件广播到每个注册的事件监听器中】

最后resetCommonCaches

其中,xml使用了XmlBeanDefinitionReader进行解析和注入。

public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext {
    private Resource[] configResources; // 将用户传入的配置资源文件进行保存
    public ClassPathXmlApplicationContext() {    }
    public ClassPathXmlApplicationContext(ApplicationContext parent) {
        super(parent);
    }
    public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
        this(new String[]{configLocation}, true, (ApplicationContext)null);
    }
    public ClassPathXmlApplicationContext(String... configLocations) throws BeansException {
        this(configLocations, true, (ApplicationContext)null);
    }
    public ClassPathXmlApplicationContext(String[] configLocations, ApplicationContext parent) throws BeansException {
        this(configLocations, true, parent);
    }
 public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh) throws BeansException {
        this(configLocations, refresh, (ApplicationContext)null);
    }
    public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {
        super(parent);
        this.setConfigLocations(configLocations);
        if (refresh) {   // refresh默认是true
            this.refresh();//AbstractApplicationContext中
        }
    }
    public ClassPathXmlApplicationContext(String path, Class<?> clazz) throws BeansException {
        this(new String[]{path}, clazz);
    }
    public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz) throws BeansException {
        this(paths, clazz, (ApplicationContext)null);
    }
    public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz, ApplicationContext parent) throws BeansException {
        super(parent); 
        this.configResources = new Resource[paths.length];
        for(int i = 0; i < paths.length; ++i) {
            this.configResources[i] = new ClassPathResource(paths[i], clazz);
        }
        this.refresh();
    }
    protected Resource[] getConfigResources() {
        return this.configResources;
    }
}

AbstractXmlApplicationContext:

public abstract class AbstractXmlApplicationContext extends AbstractRefreshableConfigApplicationContext {
    private boolean validating = true;
    public AbstractXmlApplicationContext() {  }
    public AbstractXmlApplicationContext(ApplicationContext parent) {
        super(parent);
    }
    public void setValidating(boolean validating) {      this.validating = validating;    }
    protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
// 这里最终还是通过XmlBeanDefinitionReader进行加载xml
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
        beanDefinitionReader.setEnvironment(this.getEnvironment());
        beanDefinitionReader.setResourceLoader(this);
        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
        this.initBeanDefinitionReader(beanDefinitionReader);
        this.loadBeanDefinitions(beanDefinitionReader);
    }
    protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
        reader.setValidating(this.validating);
    }
   protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
        Resource[] configResources = this.getConfigResources();  // 获取配置文件路径的资源。
        if (configResources != null) {
            reader.loadBeanDefinitions(configResources);  // 这里调用了XmlBeanDefinitionReader的loadBeanDefinitions方法。这里将对xml进行解析,最终加入到map中
        }
        String[] configLocations = this.getConfigLocations();
        if (configLocations != null) {
            reader.loadBeanDefinitions(configLocations);
        }
    }
    protected Resource[] getConfigResources() {
        return null;
    }
}

XmlBeanDefinitionReader

public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader {
。。。
   private Class<?> documentReaderClass = DefaultBeanDefinitionDocumentReader.class; 
   private NamespaceHandlerResolver namespaceHandlerResolver;
   private DocumentLoader documentLoader = new DefaultDocumentLoader();
   private EntityResolver entityResolver;
   private ErrorHandler errorHandler = new SimpleSaxErrorHandler(logger);
   private final XmlValidationModeDetector validationModeDetector = new XmlValidationModeDetector();
   private final ThreadLocal<Set<EncodedResource>> resourcesCurrentlyBeingLoaded =new NamedThreadLocal<Set<EncodedResource>>("XML bean definition resources currently being loaded");
   public XmlBeanDefinitionReader(BeanDefinitionRegistry registry) {
      super(registry);  // 将XmlBeanFactory进行保存
   }
……. 
   @Override
   public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
      return loadBeanDefinitions(new EncodedResource(resource));  // 包装了一下
   }
// 返回发现bean的个数
  public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
      Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get(); //尝试获取
      if (currentResources == null) {   // 如果没有,是刚初始化,就进行初始化
         currentResources = new HashSet<EncodedResource>(4); // 默认空间大小为4
         this.resourcesCurrentlyBeingLoaded.set(currentResources);  
      }
      if (!currentResources.add(encodedResource)) {  // 添加当前的资源文件到Set容器中
         throw new BeanDefinitionStoreException("Detected cyclic loading of " + encodedResource + " - check your import definitions!");
      }
      try { // 获得配置文件的输入流(将配置资源文件转换为流)
         InputStream inputStream = encodedResource.getResource().getInputStream(); 
         try {
            InputSource inputSource = new InputSource(inputStream); // 包装了这个流,为Source
            if (encodedResource.getEncoding() != null) {   // 是否编码。编码了就进行解码
               inputSource.setEncoding(encodedResource.getEncoding());
            }
            return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); // 这里加载这个配置
         } finally {
            inputStream.close();
         }
      } catch (IOException ex) {。。。。
      }
      finally {
         currentResources.remove(encodedResource); //
         if (currentResources.isEmpty()) {   // 如果为空,则从ThreadLocal中移除
            this.resourcesCurrentlyBeingLoaded.remove();
         }
      }
   }
   public int loadBeanDefinitions(InputSource inputSource) throws BeanDefinitionStoreException {
      return loadBeanDefinitions(inputSource, "resource loaded through SAX InputSource");
   }
   public int loadBeanDefinitions(InputSource inputSource, String resourceDescription) throws BeanDefinitionStoreException {
      return doLoadBeanDefinitions(inputSource, new DescriptiveResource(resourceDescription));
   }
//实际完成对xml进行载入的方法
   protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException {
      try {      // Document代表xml文档对象
         Document doc = doLoadDocument(inputSource, resource); // 总之这里会返回一个Document
         return registerBeanDefinitions(doc, resource);  // 将返回的Document注册
      } catch (BeanDefinitionStoreException ex) {
         throw ex; …. 
      catch (Throwable ex) {
         throw new BeanDefinitionStoreException(resource.getDescription(),"Unexpected om ");
      }
   }
// 加载xml文件,返回Document。使用DefaultDocumentLoader的loadDocument方法,返回一个Document
   protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception {
      return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler,
            getValidationModeForResource(resource), isNamespaceAware());
   }
//使用DefaultNamespaceHandlerResolver 进行解析Document
   public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
      BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
// 用代理对象
      int countBefore = getRegistry().getBeanDefinitionCount();  // 获取父类的BeanDefinitionRegistry(这里也就是IOC容器DefaultListableBeanFactory),然后调用getBeanDefinitionCount方法。获得注册之前的数量
      documentReader.registerBeanDefinitions(doc, createReaderContext(resource));// 这里进行了解析和注入,DefaultBeanDefinitionDocumentReader中实现
      return getRegistry().getBeanDefinitionCount() - countBefore;  // 这里返回了数量
   }
   protected BeanDefinitionDocumentReader createBeanDefinitionDocumentReader() {
  return BeanDefinitionDocumentReader.class.cast(BeanUtils.instantiateClass(this.documentReaderClass));
   }
   public XmlReaderContext createReaderContext(Resource resource) {
      return new XmlReaderContext(resource, this.problemReporter, this.eventListener, this.sourceExtractor, this, getNamespaceHandlerResolver());
   }
   public NamespaceHandlerResolver getNamespaceHandlerResolver() {  // 单例模式获取
      if (this.namespaceHandlerResolver == null) {
         this.namespaceHandlerResolver = createDefaultNamespaceHandlerResolver();
      }
      return this.namespaceHandlerResolver;
   }
   protected NamespaceHandlerResolver createDefaultNamespaceHandlerResolver() {
      return new DefaultNamespaceHandlerResolver(getResourceLoader().getClassLoader());
   }
}

AbstractRefreshableConfigApplicationContext:

public abstract class AbstractRefreshableConfigApplicationContext extends AbstractRefreshableApplicationContext implements BeanNameAware, InitializingBean {
   private String[] configLocations;
   private boolean setIdCalled = false; 
   public AbstractRefreshableConfigApplicationContext() { }
   public AbstractRefreshableConfigApplicationContext(ApplicationContext parent) {
      super(parent);
   }
   public void setConfigLocation(String location) {
      setConfigLocations(StringUtils.tokenizeToStringArray(location, CONFIG_LOCATION_DELIMITERS));
   }
   public void setConfigLocations(String... locations) {  // 将配置文件进行保存
      if (locations != null) {
         Assert.noNullElements(locations, "Config locations must not be null");
         this.configLocations = new String[locations.length];
         for (int i = 0; i < locations.length; i++) {
            this.configLocations[i] = resolvePath(locations[i]).trim(); // 查找出真实的路径
         }
      } else {
         this.configLocations = null;
      }
   }
   protected String[] getConfigLocations() {
      return (this.configLocations != null ? this.configLocations : getDefaultConfigLocations());
   }
   protected String[] getDefaultConfigLocations() {
      return null;
   }
   protected String resolvePath(String path) {
      return getEnvironment().resolveRequiredPlaceholders(path);
   }
   @Override
   public void setId(String id) {
      super.setId(id);
      this.setIdCalled = true;
   }
   @Override
   public void setBeanName(String name) {
      if (!this.setIdCalled) {
         super.setId(name);
         setDisplayName("ApplicationContext '" + name + "'");
      }
   }
   @Override
   public void afterPropertiesSet() {
      if (!isActive()) {
         refresh();
      }
   }
}

AbstractRefreshableApplicationContext:

public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext {
   private Boolean allowBeanDefinitionOverriding;
   private Boolean allowCircularReferences; 
   private DefaultListableBeanFactory beanFactory; 
   private final Object beanFactoryMonitor = new Object();
   public AbstractRefreshableApplicationContext() { }
   public AbstractRefreshableApplicationContext(ApplicationContext parent) {
      super(parent);
   }
   public void setAllowBeanDefinitionOverriding(boolean allowBeanDefinitionOverriding) {
      this.allowBeanDefinitionOverriding = allowBeanDefinitionOverriding;
   }
   public void setAllowCircularReferences(boolean allowCircularReferences) {
      this.allowCircularReferences = allowCircularReferences;
   }
   @Override
   protected final void refreshBeanFactory() throws BeansException {
      if (hasBeanFactory()) {  // 判断是否有BeanFactory
         destroyBeans();   // 如果有就销毁,并且关闭
         closeBeanFactory();
      }
      try {
         DefaultListableBeanFactory beanFactory = createBeanFactory();  // 创建新的BeanFactory
         beanFactory.setSerializationId(getId());  // 设置序列化
         customizeBeanFactory(beanFactory);
         loadBeanDefinitions(beanFactory);
         synchronized (this.beanFactoryMonitor) {
            this.beanFactory = beanFactory;
         }
      } catch (IOException ex) {
         throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
      }
   }
   @Override
   protected void cancelRefresh(BeansException ex) {
      synchronized (this.beanFactoryMonitor) {
         if (this.beanFactory != null)
            this.beanFactory.setSerializationId(null);
      }
      super.cancelRefresh(ex);
   }
   @Override
   protected final void closeBeanFactory() {
      synchronized (this.beanFactoryMonitor) {
         this.beanFactory.setSerializationId(null);
         this.beanFactory = null;
      }
   }
   protected final boolean hasBeanFactory() {  // 判断是否有BeanFactory
      synchronized (this.beanFactoryMonitor) {
         return (this.beanFactory != null);
      }
   }
   @Override
   public final ConfigurableListableBeanFactory getBeanFactory() {
      synchronized (this.beanFactoryMonitor) {
         if (this.beanFactory == null) {
            throw new IllegalStateException("BeanFactory not initialized or already closed 。xt");
         }
         return this.beanFactory;
      }
   }
   @Override
   protected void assertBeanFactoryActive() {  }
   protected DefaultListableBeanFactory createBeanFactory() {  // 创建BeanFactory
      return new DefaultListableBeanFactory(getInternalParentBeanFactory());  // 根据容器父类进行创建新的BeanFactory
   }
   protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
      if (this.allowBeanDefinitionOverriding != null) {
         beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
      }
      if (this.allowCircularReferences != null) {
         beanFactory.setAllowCircularReferences(this.allowCircularReferences);
      }
   }
   protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)  throws BeansException, IOException;
}

AbstractApplicationContext:

public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean {
public static final String MESSAGE_SOURCE_BEAN_NAME = "messageSource";
public static final String LIFECYCLE_PROCESSOR_BEAN_NAME = "lifecycleProcessor";
public static final String APPLICATION_EVENT_MULTICASTER_BEAN_NAME = "applicationEventMulticaster";
static {
   ContextClosedEvent.class.getName();
}
protected final Log logger = LogFactory.getLog(getClass());
private String id = ObjectUtils.identityToString(this); 
private String displayName = ObjectUtils.identityToString(this); 
private ApplicationContext parent; //父类的applicationContext
private ConfigurableEnvironment environment; 
private final List<BeanFactoryPostProcessor> beanFactoryPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
private long startupDate; 
private final AtomicBoolean active = new AtomicBoolean();
private final AtomicBoolean closed = new AtomicBoolean();
private final Object startupShutdownMonitor = new Object();
private Thread shutdownHook; 
private ResourcePatternResolver resourcePatternResolver; 
private LifecycleProcessor lifecycleProcessor; 
private MessageSource messageSource; 
private ApplicationEventMulticaster applicationEventMulticaster; 
private final Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet<ApplicationListener<?>>();
private Set<ApplicationEvent> earlyApplicationEvents;
public AbstractApplicationContext() {
   this.resourcePatternResolver = getResourcePatternResolver();//资源正则解析
}
public AbstractApplicationContext(ApplicationContext parent) {
   this();
   setParent(parent);
}
@Override
public void setParent(ApplicationContext parent) {
   this.parent = parent;
   if (parent != null) {
      Environment parentEnvironment = parent.getEnvironment();
      if (parentEnvironment instanceof ConfigurableEnvironment) {
         getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
      }
   }
}
protected ResourcePatternResolver getResourcePatternResolver() {
   return new PathMatchingResourcePatternResolver(this);
}
// getBean:
@Override
public Object getBean(String name) throws BeansException {
   assertBeanFactoryActive();
   return getBeanFactory().getBean(name);
}
@Override
public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
   assertBeanFactoryActive();
   return getBeanFactory().getBean(name, requiredType);
}
@Override
public <T> T getBean(Class<T> requiredType) throws BeansException {
   assertBeanFactoryActive();
   return getBeanFactory().getBean(requiredType);
}
@Override
public Object getBean(String name, Object... args) throws BeansException {
   assertBeanFactoryActive();
   return getBeanFactory().getBean(name, args);
}
@Override
public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException {
   assertBeanFactoryActive();
   return getBeanFactory().getBean(requiredType, args);
}
protected void assertBeanFactoryActive() {
   if (!this.active.get()) {
      if (this.closed.get()) {
         throw new IllegalStateException(getDisplayName() + " has been closed already");
      }  else {
         throw new IllegalStateException(getDisplayName() + " has not been refreshed yet");
      }
   }
}
@Override
public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
 @Override
public void refresh() throws BeansException, IllegalStateException {
   synchronized (this.startupShutdownMonitor) {
      prepareRefresh();  // 配置, 设置context当前的状态,是活动状态还是关闭状态。初始化context environment(上下文环境)中的占位符属性来源。验证所有必需的属性。
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 创建了一个bean工厂,这里进行了加载xml,解析xml,获取bean到ioc容器
      prepareBeanFactory(beanFactory);// 配置这个工厂的标准环境,比如context的类加载器和后处理器。都是往BeanFactory中add什么东西,或者Register什么东西。反正在一系列的add和Register后工厂的功能会越来越健全。
      try {
         postProcessBeanFactory(beanFactory);   // 这个
         invokeBeanFactoryPostProcessors(beanFactory); //调用所有的bean工厂处理器(BeanFactoryPostProcessor)对bean工厂进行一些处理
         registerBeanPostProcessors(beanFactory); //注册bean后处理器 注册用来拦截bean创建的BeanPostProcessor bean.这个方法需要在所有的application bean初始化之前调用。把这个注册的任务委托给了PostProcessorRegistrationDelegate来完成
         initMessageSource();//初始化消息源
         initApplicationEventMulticaster();//初始化应用上下文事件广播器
         onRefresh();//初始化其他特殊的bean【子类可借助这个方法执行特殊的操作】
         registerListeners();//注册事件监听器
         finishBeanFactoryInitialization(beanFactory); //初始化所有单实例的bean,使用懒初始化模式的bean除外
         finishRefresh();//完成刷新并发布容器刷新事件【创建上下文刷新事件,事件广播器负责将这些事件广播到每个注册的事件监听器中】
      }  catch (BeansException ex) {
         destroyBeans();
         cancelRefresh(ex); 
         throw ex;
      } finally {
         resetCommonCaches();
      }
   }
}
protected void prepareRefresh() {
   this.startupDate = System.currentTimeMillis();
   this.closed.set(false);
   this.active.set(true); 
   initPropertySources();  // 初始化配置文件
   getEnvironment().validateRequiredProperties();
   this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();
}
protected void initPropertySources() { }  // 默认不实现,供子类实现
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
   refreshBeanFactory();  // 这里对xml进行了解析,并且已经成功加入到map中了
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
   return beanFactory; // 最终返回这个bean,就是DefaultListableBeanFactory对象,加载了xml的工厂
}
protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
@Override
public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
@Override
public ConfigurableEnvironment getEnvironment() {
   if (this.environment == null) {  // 单例环境
      this.environment = createEnvironment();
   }
   return this.environment;
}
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
   // Tell the internal bean factory to use the context's class loader etc.
   beanFactory.setBeanClassLoader(getClassLoader());
//主要是在解析依赖注入bean的时候,以及在完成bean的初始化和属性获取后进行属性填充的时候  
   beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
//表达式语言处理器默认可以使用#{bean.xx}  
   beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
//bean属性设置管理的工具 通用的属性编辑器 如Class URL 等。自定义属性编辑器:只需要实现 PropertyEditorRegistrar接口即可(最终会被AbstractBeanFactory持用) 或者 xml注入到CustomEditorConfigurer中的customEditors Map中。等待初始化beanWrapper时调用initBeanWrapper触发。
   // Configure the bean factory with context callbacks.
   beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
   beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
   beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
   beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
   beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
   beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
   beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
   // BeanFactory interface not registered as resolvable type in a plain factory.
   // MessageSource registered (and found for autowiring) as a bean.
   beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
   beanFactory.registerResolvableDependency(ResourceLoader.class, this);
   beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
   beanFactory.registerResolvableDependency(ApplicationContext.class, this);
   // Register early post-processor for detecting inner beans as ApplicationListeners.
   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
   // Detect a LoadTimeWeaver and prepare for weaving, if found.
   if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { //loadTimeWeaver
      beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
      // Set a temporary ClassLoader for type matching.
      beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
   }
   // Register default environment beans.
   if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {//environment
      beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
   }
   if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { //systemProperties
      beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
   }
   if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { //systemEnvironment
      beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
   }
}
子类实现:
  ①、添加一个ServletContextAwareProcessor到bean工厂中。
  ②、在bean工厂自动装配的时候忽略一些接口。如:ServletContextAware、ServletConfigAware
  ③、注册WEB应用特定的域(scope)到bean工厂中,以便WebApplicationContext可以使用它们。比如"request", "session", "globalSession", "application",
  ④、注册WEB应用特定的Environment bean到bean工厂中,以便WebApplicationContext可以使用它们。如:"contextParameters", "contextAttributes"
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
}
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
   PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());//主要是在这里面调用了所有的BeanFactoryPostProcessor
   if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
      beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
      beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
   }
}
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
   PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
//初始化MessageSource接口的一个实现类。这个接口提供了消息处理功能。主要用于国际化/i18n。
protected void initMessageSource() {
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
   if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
      this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
      // Make MessageSource aware of parent MessageSource.
      if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
         HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
         if (hms.getParentMessageSource() == null) {
   // Only set parent context as parent MessageSource if no parent MessageSource registered already.
            hms.setParentMessageSource(getInternalParentMessageSource());
         }
      }
   } else {
      // Use empty MessageSource to be able to accept getMessage calls.
      DelegatingMessageSource dms = new DelegatingMessageSource();
      dms.setParentMessageSource(getInternalParentMessageSource());
      this.messageSource = dms;
      beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource); 
   }
}
//为这个context初始化一个事件广播器(ApplicationEventMulticaster)。
protected void initApplicationEventMulticaster() {
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
   if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {//’applicationEventMulticaster’ 检查是否给context配了一个ApplicationEventMulticaster实现类
      this.applicationEventMulticaster =beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); 
   }
   else {//如果没有,就是用默认的实现类 SimpleApplicationEventMulticaster
      this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
      beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); 
   }
}
protected void onRefresh() throws BeansException {  // 子类实现.在AbstractApplicationContext的子类中初始化其他特殊的bean。其实就是初始化ThemeSource接口的实例。这个方法需要在所有单例bean初始化之前调用。
   // For subclasses: do nothing by default.
}
protected void registerListeners() {//注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的。这不会影响到其它监听器bean。在注册完以后,还会将其前期的事件发布给相匹配的监听器。
   // Register statically specified listeners first.
   for (ApplicationListener<?> listener : getApplicationListeners()) {
      getApplicationEventMulticaster().addApplicationListener(listener);
   }
   // Do not initialize FactoryBeans here: We need to leave all regular beans
   // uninitialized to let post-processors apply to them!
   String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
   for (String listenerBeanName : listenerBeanNames) {
      getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
   }
   // Publish early application events now that we finally have a multicaster... 至此,已经完成将监听器注册到ApplicationEventMulticaster中,下面将发布前期的事件给监听器。
   Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
   this.earlyApplicationEvents = null;
   if (earlyEventsToProcess != null) {
      for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
         getApplicationEventMulticaster().multicastEvent(earlyEvent);
      }
   }
}
//完成bean工厂的初始化工作。这一步非常复杂,也非常重要,涉及到了bean的创建。第二步中只是完成了BeanDefinition的定义、解析、处理、注册。但是还没有初始化bean实例。这一步将初始化所有非懒加载的单例bean。这一步将会重新在一篇新的笔记中介绍。
//对配置了lazy-init属性的Bean进行预实例化处理
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
   // Initialize conversion service for this context. 为容器指定一个转换服务(ConversionService)  在对某些Bean属性进行转换时使用  
   if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
         beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
      beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
   }
   // Register a default embedded value resolver if no bean post-processor
   // (such as a PropertyPlaceholderConfigurer bean) registered any before:
   // at this point, primarily for resolution in annotation attribute values.
   if (!beanFactory.hasEmbeddedValueResolver()) {
      beanFactory.addEmbeddedValueResolver(new StringValueResolver() {
         @Override
         public String resolveStringValue(String strVal) {
            return getEnvironment().resolvePlaceholders(strVal);
         }
      });
   }
   // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
   String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
   for (String weaverAwareName : weaverAwareNames) {
      getBean(weaverAwareName);
   }
   // Stop using the temporary ClassLoader for type matching. //为了类型匹配,停止使用临时的类加载器  
   beanFactory.setTempClassLoader(null);
   // Allow for caching all bean definition metadata, not expecting further changes. /缓存容器中所有注册的BeanDefinition元数据,以防被修改
   beanFactory.freezeConfiguration();
   // Instantiate all remaining (non-lazy-init) singletons. //对配置了lazy-init属性的单态模式Bean进行预实例化处理
   beanFactory.preInstantiateSingletons();//DefaultListableBeanFactory对配置lazy-init属性的单例bean预实例化
}
//完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)
protected void finishRefresh() {
   // Initialize lifecycle processor for this context.
   initLifecycleProcessor();
   // Propagate refresh to lifecycle processor first.
   getLifecycleProcessor().onRefresh();
   // Publish the final event.
   publishEvent(new ContextRefreshedEvent(this));
   // Participate in LiveBeansView MBean, if active.
   LiveBeansView.registerApplicationContext(this);
}
protected void resetCommonCaches() {
   ReflectionUtils.clearCache();
   ResolvableType.clearCache();
   CachedIntrospectionResults.clearClassLoader(getClassLoader());
}

。。。。。。


class PostProcessorRegistrationDelegate {
   public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
      // Invoke BeanDefinitionRegistryPostProcessors first, if any.
      Set<String> processedBeans = new HashSet<String>();
      if (beanFactory instanceof BeanDefinitionRegistry) {
         BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
         List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();
         List<BeanDefinitionRegistryPostProcessor> registryPostProcessors =
               new LinkedList<BeanDefinitionRegistryPostProcessor>();
         for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
            if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
               BeanDefinitionRegistryPostProcessor registryPostProcessor =
                     (BeanDefinitionRegistryPostProcessor) postProcessor;
               registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
               registryPostProcessors.add(registryPostProcessor);
            }
            else {
               regularPostProcessors.add(postProcessor);
            }
         }
         // Do not initialize FactoryBeans here: We need to leave all regular beans
         // uninitialized to let the bean factory post-processors apply to them!
         // Separate between BeanDefinitionRegistryPostProcessors that implement
         // PriorityOrdered, Ordered, and the rest.
         String[] postProcessorNames =
               beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
         // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
         List<BeanDefinitionRegistryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
         for (String ppName : postProcessorNames) {
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
               priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
               processedBeans.add(ppName);
            }
         }
         sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
         registryPostProcessors.addAll(priorityOrderedPostProcessors);
         invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);
         // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
         postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
         List<BeanDefinitionRegistryPostProcessor> orderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
         for (String ppName : postProcessorNames) {
            if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
               orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
               processedBeans.add(ppName);
            }
         }
         sortPostProcessors(beanFactory, orderedPostProcessors);
         registryPostProcessors.addAll(orderedPostProcessors);
         invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);
         // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
         boolean reiterate = true;
         while (reiterate) {
            reiterate = false;
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            for (String ppName : postProcessorNames) {
               if (!processedBeans.contains(ppName)) {
                  BeanDefinitionRegistryPostProcessor pp = beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);
                  registryPostProcessors.add(pp);
                  processedBeans.add(ppName);
                  pp.postProcessBeanDefinitionRegistry(registry);
                  reiterate = true;
               }
            }
         }
         // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
         invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
         invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
      }
      else {
         // Invoke factory processors registered with the context instance.
         invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
      }
      // Do not initialize FactoryBeans here: We need to leave all regular beans
      // uninitialized to let the bean factory post-processors apply to them!
      String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
      // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
      // Ordered, and the rest.
      List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
      List<String> orderedPostProcessorNames = new ArrayList<String>();
      List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
      for (String ppName : postProcessorNames) {
         if (processedBeans.contains(ppName)) {
            // skip - already processed in first phase above
         }
         else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
            priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
         }
         else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            orderedPostProcessorNames.add(ppName);
         }
         else {
            nonOrderedPostProcessorNames.add(ppName);
         }
      }
      // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.       sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
      invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
      // Next, invoke the BeanFactoryPostProcessors that implement Ordered. 
      List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
      for (String postProcessorName : orderedPostProcessorNames) {
         orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
      }
      sortPostProcessors(beanFactory, orderedPostProcessors);
      invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
      // Finally, invoke all other BeanFactoryPostProcessors. 
      List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
      for (String postProcessorName : nonOrderedPostProcessorNames) {
         nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
      }
      invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
      // Clear cached merged bean definitions since the post-processors might have
      // modified the original metadata, e.g. replacing placeholders in values...
      beanFactory.clearMetadataCache();
   }
   public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
      String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
      // 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.
      List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
      List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
      List<String> orderedPostProcessorNames = new ArrayList<String>();
      List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
      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);
            }
         }
         else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            orderedPostProcessorNames.add(ppName);
         }
         else {
            nonOrderedPostProcessorNames.add(ppName);
         }
      }
      // First, register the BeanPostProcessors that implement PriorityOrdered. 首先,注册实现了PriorityOrdered接口的BeanPostProcessor
      sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
      registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
      // Next, register the BeanPostProcessors that implement Ordered. 然后注册实现了Ordered接口的BeanPostProcessor
      List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
      for (String ppName : orderedPostProcessorNames) {
         BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
         orderedPostProcessors.add(pp);
         if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
         }
      }
      sortPostProcessors(beanFactory, orderedPostProcessors);
      registerBeanPostProcessors(beanFactory, orderedPostProcessors);
      // Now, register all regular BeanPostProcessors. 注册所有常规的的BeanPostProcessor
      List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
      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. 最后重新注册所有的内部BeanPostProcessor
      sortPostProcessors(beanFactory, internalPostProcessors);
      registerBeanPostProcessors(beanFactory, internalPostProcessors);
      // Re-register post-processor for detecting inner beans as ApplicationListeners, 重新注册用来自动探测内部ApplicationListener的post-processor,这样可以将他们移到处理器链条的末尾。
      // moving it to the end of the processor chain (for picking up proxies etc).
      beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
   }
。。。。。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
      implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
//对配置lazy-init属性单态Bean的预实例化
public void preInstantiateSingletons() throws BeansException {
   List<String> beanNames;
   //在对配置lazy-init属性单态Bean的预实例化过程中,必须多线程同步,以确保数据一致性
   synchronized (this.beanDefinitionMap) {
      beanNames = new ArrayList<String>(this.beanDefinitionNames);
   }
   for (String beanName : beanNames) {
      //获取指定名称的Bean定义
      RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
      //Bean不是抽象的,是单态模式的,且lazy-init属性配置为false
      if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
         //如果指定名称的bean是创建容器的Bean
         if (isFactoryBean(beanName)) {
            //FACTORY_BEAN_PREFIX=”&”,当Bean名称前面加”&”符号  
            //时,获取的是产生容器对象本身,而不是容器产生的Bean.  
            //调用getBean方法,触发容器对Bean实例化和依赖注入过程  
            final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
            //标识是否需要预实例化  
            boolean isEagerInit;
            if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
               //一个匿名内部类
               isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                  public Boolean run() {
                     return ((SmartFactoryBean<?>) factory).isEagerInit();
                  }
               }, getAccessControlContext());
            }
            else {
               isEagerInit = (factory instanceof SmartFactoryBean &&
                     ((SmartFactoryBean<?>) factory).isEagerInit());
            }
            if (isEagerInit) {
               //调用getBean方法,触发容器对Bean实例化和依赖注入过程 
               getBean(beanName);
            }
         }
         else {
            //调用getBean方法,触发容器对Bean实例化和依赖注入过程
            getBean(beanName);
         }
      }
   }
}
//向IoC容器注册解析的BeanDefinito
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");

   //校验解析的BeanDefiniton
   if (beanDefinition instanceof AbstractBeanDefinition) {
      try {
         ((AbstractBeanDefinition) beanDefinition).validate();
      }
      catch (BeanDefinitionValidationException ex) {
         throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
               "Validation of bean definition failed", ex);
      }
   }

   //注册的过程中需要线程同步,以保证数据的一致性
   synchronized (this.beanDefinitionMap) {
      Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);

      //检查是否有同名的BeanDefinition已经在IOC容器中注册,如果已经注册,  
      //并且不允许覆盖已注册的Bean,则抛出注册失败异常
      if (oldBeanDefinition != null) {
         if (!this.allowBeanDefinitionOverriding) {
            throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
                  "Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
                        "': There is already [" + oldBeanDefinition + "] bound.");
         }
         else {//如果允许覆盖,则同名的Bean,后注册的覆盖先注册的
            if (this.logger.isInfoEnabled()) {
               this.logger.info("Overriding bean definition for bean '" + beanName +
                     "': replacing [" + oldBeanDefinition + "] with [" + beanDefinition + "]");
            }
         }
      }
      else {//IOC容器中没有已经注册同名的Bean,按正常注册流程注册
         this.beanDefinitionNames.add(beanName);
         this.frozenBeanDefinitionNames = null;
      }
      this.beanDefinitionMap.put(beanName, beanDefinition);
   }
   //重置所有已经注册过的BeanDefinition的缓存
   resetBeanDefinition(beanName);
}





猜你喜欢

转载自blog.csdn.net/qq_34190023/article/details/80879382