zoukankan      html  css  js  c++  java
  • Spring IOC 初始化刷新流程十二:finishRefresh()

    Spring IOC 初始化刷新流程:https://www.cnblogs.com/jhxxb/p/13609289.html

    方法源码

    public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
        protected void finishRefresh() {
            // Clear context-level resource caches (such as ASM metadata from scanning).
            // 这个是 Spring5.0 之后才有的方法
            // 表示清除一些 resourceCaches,如 doc 说,清楚 context 级别的资源缓存,比如 ASM 的元数据
            clearResourceCaches();
    
            // Initialize lifecycle processor for this context.
            // 初始化所有的 LifecycleProcessor
            // 在 Spring 中还提供了 Lifecycle 接口, Lifecycle 中包含 start/stop 方法,实现此接口后 Spring 会保证在启动的时候调用其 start 方法开始生命周期,
            // 并在 Spring 关闭的时候调用 stop 方法来结束生命周期,通常用来配置后台程序,在启动后一直运行(如对 MQ 进行轮询等)。ApplicationContext 的初始化最后正是保证了这一功能的实现。
            initLifecycleProcessor();
    
            // Propagate refresh to lifecycle processor first.
            // 上面注册好的处理器,这里就拿出来,调用它的 onRefresh 方法
            getLifecycleProcessor().onRefresh();
    
            // Publish the final event.
            // 发布容器刷新的事件
            publishEvent(new ContextRefreshedEvent(this));
    
            // Participate in LiveBeansView MBean, if active.
            // 和 MBeanServer 和 MBean 有关的。相当于把当前容器上下文,注册到 MBeanServer 里面去。
            // 这样子,MBeanServer 持有了容器的引用,就可以拿到容器的所有内容了,也就让 Spring 支持到了 MBean 的相关功能
            LiveBeansView.registerApplicationContext(this);
        }
    
        protected void initLifecycleProcessor() {
            // 当 ApplicationContext 启动或停止时,它会通过 LifecycleProcessor 来与所有声明的 Bean 的周期做状态更新,而在 LifecycleProcessor 的使用前首先需要初始化。
            ConfigurableListableBeanFactory beanFactory = getBeanFactory();
            if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) { // 如果工厂里已经存在 LifecycleProcessor,那就拿出来,把值放上去 this.lifecycleProcessor
                this.lifecycleProcessor = beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
                if (logger.isTraceEnabled()) {
                    logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
                }
            }
            else { // 一般情况下,都会注册上这个默认的处理器 DefaultLifecycleProcessor
                DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
                defaultProcessor.setBeanFactory(beanFactory);
                this.lifecycleProcessor = defaultProcessor;
                // 直接注册成单例 Bean 进去容器里
                beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
                if (logger.isTraceEnabled()) {
                    logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " + "[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");
                }
            }
        }

    Spring 中的 Lifecycle 接口

    public interface Lifecycle {
        void start();
        void stop();
        boolean isRunning();
    }
    
    public interface SmartLifecycle extends org.springframework.context.Lifecycle, org.springframework.context.Phased {
        int DEFAULT_PHASE = Integer.MAX_VALUE;
    
        // 是否伴随这容器的启动而启动
        // true:表示容器 refreshed 它就会启动了
        // false:必须显示的执行它的 start() 才行
        default boolean isAutoStartup() {
            return true;
        }
    
        // 相比于 Lifecycle 的 stop,增加了回调函数
        default void stop(Runnable callback) {
            stop();
            callback.run();
        }
    
        @Override
        default int getPhase() {
            return DEFAULT_PHASE;
        }
    }
    
    public interface LifecycleProcessor extends Lifecycle {
        void onRefresh();
        void onClose();
    }
    
    public interface Phased {
        // 权重值
        int getPhase();
    }

    getLifecycleProcessor().onRefresh()

    stopBeans 基本同 startBeans,只是顺序是倒序的

    public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactoryAware {
        /**
         * 只有这个方法才是容器启动时候自动会调用的,其余都不是
         * 它默认只会执行实现了 SmartLifecycle 接口并且 isAutoStartup = true 的 Bean 的 start 方法
         */
        @Override
        public void onRefresh() {
            startBeans(true);
            this.running = true;
        }
    
        /**
         * autoStartupOnly:是否仅支持自动启动
         * true:只支持伴随容器启动(Bean 必须实现了 SmartLifecycle 接口且 isAutoStartup 为 true 才行)
         * false:表示无所谓。都会执行 Bean 的 start 方法
         */
        private void startBeans(boolean autoStartupOnly) {
            // 拿到所有的实现了 Lifecycle/SmartLifecycle 的,已经在 IOC 容器里面的单例 Bean 们(备注:不包括自己 this,也就是说处理器自己不包含进去)
            // 这里若我们自己没有定义过实现 Lifecycle 的 Bean,这里就是空的
            Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
            // phases 这个 Map,表示按照 phase 值,把这个 Bean 进行分组,最后分组执行
            Map<Integer, LifecycleGroup> phases = new HashMap<>();
            lifecycleBeans.forEach((beanName, bean) -> {
                // 若 Bean 实现了 SmartLifecycle 接口并且标注是 AutoStartup,或者强制要求自动自行的(autoStartupOnly = true)
                if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {
                    int phase = getPhase(bean);
                    LifecycleGroup group = phases.get(phase);
                    if (group == null) {
                        group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);
                        phases.put(phase, group);
                    }
                    // 添加到 phase 值相同的组分组
                    group.add(beanName, bean);
                }
            });
            if (!phases.isEmpty()) {
                List<Integer> keys = new ArrayList<>(phases.keySet());
                // 此处有个根据 key 从小到大的排序,然后一个个的调用它们的 start 方法
                Collections.sort(keys);
                for (Integer key : keys) {
                    // 这里调用 LifecycleGroup#start()
                    phases.get(key).start();
                }
            }
        }
    
        private class LifecycleGroup {
            public void start() {
                if (this.members.isEmpty()) {
                    return;
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Starting beans in phase " + this.phase);
                }
                // 按照权重值进行排序,若没有实现 Smart 接口的,权重值都为 0
                Collections.sort(this.members);
                for (LifecycleGroupMember member : this.members) {
                    // 一次执行这些 Bean 的 start 方法
                    doStart(this.lifecycleBeans, member.name, this.autoStartupOnly);
                }
            }
        }
    
        private void doStart(Map<String, ? extends Lifecycle> lifecycleBeans, String beanName, boolean autoStartupOnly) {
            Lifecycle bean = lifecycleBeans.remove(beanName);
            if (bean != null && bean != this) {
                // 控制 Bean 的依赖关系
                String[] dependenciesForBean = getBeanFactory().getDependenciesForBean(beanName);
                for (String dependency : dependenciesForBean) {
                    doStart(lifecycleBeans, dependency, autoStartupOnly);
                }
                if (!bean.isRunning() && (!autoStartupOnly || !(bean instanceof SmartLifecycle) || ((SmartLifecycle) bean).isAutoStartup())) {
                    if (logger.isTraceEnabled()) {
                        logger.trace("Starting bean '" + beanName + "' of type [" + bean.getClass().getName() + "]");
                    }
                    try {
                        // 执行 Bean 的 start 方法
                        bean.start();
                    } catch (Throwable ex) {
                        throw new ApplicationContextException("Failed to start bean '" + beanName + "'", ex);
                    }
                    if (logger.isDebugEnabled()) {
                        logger.debug("Successfully started bean '" + beanName + "'");
                    }
                }
            }
        }
    
        private class LifecycleGroupMember implements Comparable<LifecycleGroupMember> {
            private final String name;
            private final Lifecycle bean;
    
            LifecycleGroupMember(String name, Lifecycle bean) {
                this.name = name;
                this.bean = bean;
            }
    
            @Override
            public int compareTo(org.springframework.context.support.DefaultLifecycleProcessor.LifecycleGroupMember other) {
                int thisPhase = getPhase(this.bean);
                int otherPhase = getPhase(other.bean);
                return Integer.compare(thisPhase, otherPhase);
            }
        }

    Lifecycle 这个接口并不能直接使用。因为 DefaultLifecycleProcessor 的 onRefresh 方法传值为 autoStartupOnly = true:表示只有实现了 SmartLifecycle 的 Bean 才会调用 start 方法,因为实现了 SmartLifecycle 接口会有一个 phase 值,根据上面源码会根据此值分组执行。

    autoStartupOnly = false 则只要是 Lifecycle 的实现既可以被调用,我们会给其默认的 phase。

    所以,我们要想要这个功能,要实现 SmartLifecycle,而不是 Lifecycle 接口

    事件发布

    // ApplicationContext 是有发布事件能力的
    public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
        @Override
        public void publishEvent(ApplicationEvent event) {
            publishEvent(event, null);
        }
    
        @Override
        public void publishEvent(Object event) {
            publishEvent(event, null);
        }
    
        protected void publishEvent(Object event, @Nullable ResolvableType eventType) {
            Assert.notNull(event, "Event must not be null");
    
            // Decorate event as an ApplicationEvent if necessary
            ApplicationEvent applicationEvent;
            if (event instanceof ApplicationEvent) {
                applicationEvent = (ApplicationEvent) event;
            } else { // 最终会被包装成 ApplicationEvent 的事件类型,带有一个 Payload 而已
                applicationEvent = new PayloadApplicationEvent<>(this, event);
                if (eventType == null) {
                    eventType = ((PayloadApplicationEvent<?>) applicationEvent).getResolvableType();
                }
            }
    
            // Multicast right now if possible - or lazily once the multicaster is initialized
            // 如果早期事件已经被初始化了,那就先放进早期事件里,否则 esle 那里,就直接发送事件了
            if (this.earlyApplicationEvents != null) {
                this.earlyApplicationEvents.add(applicationEvent);
            } else {
                // 拿到多播器,发送这个事件
                getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
            }
    
            // Publish event via parent context as well...
            if (this.parent != null) { // 这里注意:如果存在父容器,那父容器也会发送一个事件
                if (this.parent instanceof AbstractApplicationContext) {
                    ((AbstractApplicationContext) this.parent).publishEvent(event, eventType);
                } else {
                    this.parent.publishEvent(event);
                }
            }
        }
    
    // refresh() 中 initApplicationEventMulticaster() 添加进 IOC 的
    public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
        @Override
        public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
            ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
            Executor executor = getTaskExecutor();
            for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
                if (executor != null) {
                    executor.execute(() -> invokeListener(listener, event));
                }
                else {
                    invokeListener(listener, event);
                }
            }
        }
  • 相关阅读:
    ansible-playbook启动的多种方式
    git版本控制
    特征工程
    特征工程:图像特征提取和深度学习
    tensorflow数据读取机制tf.train.slice_input_producer 和 tf.train.batch 函数
    浙大版《C语言程序设计(第3版)》题目集 练习2-9 整数四则运算 (10 分)
    浙大版《C语言程序设计(第3版)》题目集 练习2-8 计算摄氏温度 (10 分)
    浙大版《C语言程序设计(第3版)》题目集 练习2-6 计算物体自由下落的距离 (5 分)
    浙大版《C语言程序设计(第3版)》题目集 练习2-4 温度转换 (5 分)
    浙大版《C语言程序设计(第3版)》题目集 练习2-3 输出倒三角图案 (5 分)
  • 原文地址:https://www.cnblogs.com/jhxxb/p/13985589.html
Copyright © 2011-2022 走看看