zoukankan      html  css  js  c++  java
  • spring源码解析五( refresh()方法)

    1、refresh()

    public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
            this();
            register(annotatedClasses);
            refresh();
        }
    
    public void refresh() throws BeansException, IllegalStateException {
            synchronized (this.startupShutdownMonitor) {
                // Prepare this context for refreshing.
    //准备工作:设置启动时间、是否激活标识位 初始化早期事件 prepareRefresh(); // 获取DefaultListableBeanFactory,创建容器是在上面this()方法中实现的,如果是xml配置的,会在这里解析bean定义 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 准备bean工厂,注册了部分类 prepareBeanFactory(beanFactory); try { // 待子类实现 postProcessBeanFactory(beanFactory); // 注册bean工厂后置处理器,并解析java代码配置bean定义,前面已经分析过,见https://www.cnblogs.com/pjfmeng/p/13948535.html invokeBeanFactoryPostProcessors(beanFactory); // 注册bean后置处理器,并不会执行后置处理器,在后面实例化的时候执行 registerBeanPostProcessors(beanFactory); // 国际化支持 initMessageSource(); // 初始化事件监听多路广播器 initApplicationEventMulticaster(); // 待子类实现,springBoot在这里实现创建内置的tomact容器 onRefresh(); // 注册监听器 registerListeners(); // 单例实例化,前面已经分析过,见 https://www.cnblogs.com/pjfmeng/p/13957917.html finishBeanFactoryInitialization(beanFactory); // 广播事件,ApplicationContext初始化完成,springColud有实现该方法,待后续分析 finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } // 刷新失败后的处理,主要是将一些保存环境信息的集合做清理 destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } finally { // Reset common introspection caches in Spring's core, since we // might not ever need metadata for singleton beans anymore... resetCommonCaches(); } } }

    1.1 prepareRefresh()

    protected void prepareRefresh() {
            this.startupDate = System.currentTimeMillis();
            this.closed.set(false);
            //设置激活
            this.active.set(true);
    
            if (logger.isInfoEnabled()) {
                logger.info("Refreshing " + this);
            }
    
            // Initialize any placeholder property sources in the context environment
            //空方法,可以自己实现做一些环境变量的设置,比如说设置某些变量必填
            initPropertySources();
    
            // 校验环境变量的缺失
            getEnvironment().validateRequiredProperties();
    
            // Allow for the collection of early ApplicationEvents,
            // to be published once the multicaster is available...
            //新建一个list保存早期事件,因为这时候还没有注册监听器,不能发布事件
            this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();
        }

    1.2、obtainFreshBeanFactory

    protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
            //刷新bean工厂,xml配置的bean定义会在这里被加载进来存储在DefaultListableBeanFactory的beanDefinitionMap里面
            //java配置的@bean,或者componentScan扫描的组件是在后面通过bean工厂后处理器倒进来的,也就是上面的第五步
            refreshBeanFactory();
            ConfigurableListableBeanFactory beanFactory = getBeanFactory();
            if (logger.isDebugEnabled()) {
                logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
            }
            return beanFactory;
        }
    //AbstractRefreshableApplicationContext#refreshBeanFactory
    protected final void refreshBeanFactory() throws BeansException {
            if (hasBeanFactory()) {
                destroyBeans();
                closeBeanFactory();
            }
            try {
                DefaultListableBeanFactory beanFactory = createBeanFactory();
                beanFactory.setSerializationId(getId());
                customizeBeanFactory(beanFactory);
                //注册xml配置的bean定义
                loadBeanDefinitions(beanFactory);
                synchronized (this.beanFactoryMonitor) {
                    this.beanFactory = beanFactory;
                }
            }
            catch (IOException ex) {
                throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
            }
        }

    1.3 prepareBeanFactory

    protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
            // Tell the internal bean factory to use the context's class loader etc.
    //给beanFactory设置类加载器 beanFactory.setBeanClassLoader(getClassLoader());
    //设置EL表达式解析器 beanFactory.setBeanExpressionResolver(
    new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
    //添加属性 beanFactory.addPropertyEditorRegistrar(
    new ResourceEditorRegistrar(this, getEnvironment())); // Configure the bean factory with context callbacks.
    //设置ApplicationContextAwareProcessor,打开这个类的postProcessBeforeInitialization()方法,会发现用于在bean初始化之前,前置调用
    EnvironmentAware EmbeddedValueResolverAware ApplicationEventPublisherAware MessageSourceAware ApplicationContextAware,注入bean中
    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)) { 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)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); } }

    1.4 、postProcessBeanFactory

    空方法,待子类实现

    1.5、invokeBeanFactoryPostProcessors

    注册bean工厂后置处理器,并解析java代码配置bean定义,前面已经分析过,见 spring源码解析bean定义

    1.6、registerBeanPostProcessors

    protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
            PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
        }
    
    public static void registerBeanPostProcessors(
                ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
            //理解了上一步的invokeBeanFactoryPostProcessors, 那这里就理解起来就相当容易了, 
             //唯一有区别的是由于这里是注册BeanPostProcessor,而BeanPostProcessor是在每个bean实例化前后调用的, 
             //所以这里只是单独的注册到beanFactory,并没有逐个执行 
            //先执行PriorityOrdered修饰的,然后执行Ordered,最后执行普通的
            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.
            //开始根据beanName遍历BeanPostProcessor,并按照PriorityOrdered、Ordered以及其他进行分类
    
            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(priorityOrderedPostProcessors, beanFactory);
            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(orderedPostProcessors, beanFactory);
            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.
            //4、排序并注册了实现了MergedBeanDefinitionPostProcessor的BeanPostProcessor
            sortPostProcessors(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));
        }

    1.7 initMessageSource

    国际化支持,如果需要用到国际化可以从bean容器中获取messageSource,然后调用他的getMessage方法获取国际化支持

    protected void initMessageSource() {
            ConfigurableListableBeanFactory beanFactory = getBeanFactory();
            //查看bean容器中是否有定义messageSource,若没有则会实例化一个DelegatingMessageSource并注册到beanFactory
            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());
                    }
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Using MessageSource [" + this.messageSource + "]");
                }
            }
            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);
                if (logger.isDebugEnabled()) {
                    logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
                            "': using default [" + this.messageSource + "]");
                }
            }
        }

    1.8、initApplicationEventMulticaster

    protected void initApplicationEventMulticaster() {
            ConfigurableListableBeanFactory beanFactory = getBeanFactory();
            //从beanFactory中查找applicationEventMulticaster,
    //若没有则会初始化一个SimpleApplicationEventMulticaster并注册到beanFactory
    //我们也可以实现多播器,可以设置异步线程等等
    if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) { this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); if (logger.isDebugEnabled()) { logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]"); } } else { this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); if (logger.isDebugEnabled()) { logger.debug("Unable to locate ApplicationEventMulticaster with name '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "': using default [" + this.applicationEventMulticaster + "]"); } } }

    1.9、onRefresh()

    空方法,给子类扩展,springBoot的内嵌tomact就是在这一部创建的,待后续分析

    1.10、registerListeners

    protected void registerListeners() {
            // 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!
            //然后再从beanFactory中获取所有ApplicationListener,将beanName绑定到事件广播器中
            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...
            Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
            //在这里发布早期事件,也就是上面说的earlyApplicationEvents 
            this.earlyApplicationEvents = null;
            if (earlyEventsToProcess != null) {
                for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
                    getApplicationEventMulticaster().multicastEvent(earlyEvent);
                }
            }
        }

    1.11、finishBeanFactoryInitialization

    实例化单例,前面分析过,见spring源码解析二( getBean())

    1.12、finishRefresh

    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);
        }

     

  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/pjfmeng/p/14150992.html
Copyright © 2011-2022 走看看