美文网首页
AbstractApplicationContext#refre

AbstractApplicationContext#refre

作者: 王侦 | 来源:发表于2022-12-09 23:36 被阅读0次

    1.AbstractApplicationContext#refresh主流程

        public void refresh() throws BeansException, IllegalStateException {
            synchronized (this.startupShutdownMonitor) {
                // Prepare this context for refreshing.
                // 刷新容器 预准备工作
                prepareRefresh();
    
                // Tell the subclass to refresh the internal bean factory.
                // 获取一个全新的BeanFactory接口实例
                ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
                // Prepare the bean factory for use in this context.
                // 预处理bf.
                prepareBeanFactory(beanFactory);
    
                try {
                    // Allows post-processing of the bean factory in context subclasses.
                    // 空方法,留给子类实现,用于注册一些 beanFactoryPostProcessor
                    postProcessBeanFactory(beanFactory);
    
                    // Invoke factory processors registered as beans in the context.
                    // 查找 并 执行 bfpp 后处理器
                    invokeBeanFactoryPostProcessors(beanFactory);
    
                    // Register bean processors that intercept bean creation.
                    // 注册后处理器
                    registerBeanPostProcessors(beanFactory);
    
                    // Initialize message source for this context.
                    initMessageSource();
    
                    // Initialize event multicaster for this context.
                    // 初始化事件传播器。
                    initApplicationEventMulticaster();
    
                    // Initialize other special beans in specific context subclasses.
                    // 留给子类去实现的,在这个方法内,你可以硬编码提供一些组件,
                    // 比如说 提供了一些Listeners
                    onRefresh();
    
                    // Check for listener beans and register them.
                    // 注册通过配置提供的Listener,这些监听器 最终都会注册到 Multicaster内。
                    registerListeners();
    
                    // Instantiate all remaining (non-lazy-init) singletons.
                    // 实例化非懒加载状态的单实例。
                    finishBeanFactoryInitialization(beanFactory);
    
                    // Last step: publish corresponding event.
                    // 完成刷新 后做的一些事情,主要是启动生命周期对象。
                    finishRefresh();
                }
    

    2.AbstractApplicationContext#prepareRefresh

        protected void prepareRefresh() {
            // Switch to active.
            //设置容器启动时间
            this.startupDate = System.currentTimeMillis();
            this.closed.set(false);
            this.active.set(true);
    
            if (logger.isDebugEnabled()) {
                if (logger.isTraceEnabled()) {
                    logger.trace("Refreshing " + this);
                }
                else {
                    logger.debug("Refreshing " + getDisplayName());
                }
            }
    
            // Initialize any placeholder property sources in the context environment.
            // 留给子类扩展
            initPropertySources();
    
            // Validate that all properties marked as required are resolvable:
            // see ConfigurablePropertyResolver#setRequiredProperties
            // 校验必须有的环境变量
            getEnvironment().validateRequiredProperties();
    
            // Store pre-refresh ApplicationListeners...
            if (this.earlyApplicationListeners == null) {
                this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
            }
            else {
                // Reset local application listeners to pre-refresh state.
                this.applicationListeners.clear();
                this.applicationListeners.addAll(this.earlyApplicationListeners);
            }
    
            // Allow for the collection of early ApplicationEvents,
            // to be published once the multicaster is available...
            this.earlyApplicationEvents = new LinkedHashSet<>();
        }
    

    示例:

    public class Main {
        public static void main(String[] args) {
            ApplicationContext ac =
                    new MyClassPathXmlApplicationContext("spring-required-properties-test.xml");
        }
    
    }
    
    public class MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext {
        public MyClassPathXmlApplicationContext(String... configLocations) {
            super(configLocations);
        }
    
        /**
         * 重写AbstractApplicationContext.initPropertySources() 方法
         * 在此指定需要验证非空的环境变量
         */
        @Override
        protected void initPropertySources() {
            getEnvironment().setRequiredProperties("LG_HOME");
        }
    }
    
    

    如果必需的属性没有设置,就会报错:

    Exception in thread "main" org.springframework.core.env.MissingRequiredPropertiesException: The following properties were declared as required but could not be resolved: [LG_HOME]
        at org.springframework.core.env.AbstractPropertyResolver.validateRequiredProperties(AbstractPropertyResolver.java:145)
        at org.springframework.core.env.AbstractEnvironment.validateRequiredProperties(AbstractEnvironment.java:519)
        at org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:605)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:95)
        at com.wz.spring.requiredProperties.MyClassPathXmlApplicationContext.<init>(MyClassPathXmlApplicationContext.java:8)
        at com.wz.spring.requiredProperties.Main.main(Main.java:8)
    
    FAILURE: Build failed with an exception.
    

    3.AbstractApplicationContext#obtainFreshBeanFactory

        protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
            refreshBeanFactory();
            return getBeanFactory();
        }
    
        protected final void refreshBeanFactory() throws BeansException {
            // 条件成立:说明当前applicationContext内部拥有一个beanFactory接口实例,
            // 咱们需要将该beanFactory实例完全释放掉。
            if (hasBeanFactory()) {
                // 销毁原beanFactory内部的实例的流程。
                destroyBeans();
                closeBeanFactory();
            }
            try {
                DefaultListableBeanFactory beanFactory = createBeanFactory();
                beanFactory.setSerializationId(getId());
                customizeBeanFactory(beanFactory);
                // 加载bd信息,这一步完成之后,所有的配置信息(bd)就注册到 bf内了。
                loadBeanDefinitions(beanFactory);
                // 保留引用。
                this.beanFactory = beanFactory;
            }
            catch (IOException ex) {
                throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
            }
        }
    

    3.1 重点分析一下bean的销毁逻辑

        protected void destroyBeans() {
            // 销毁原beanFactory内部的单实例。
            getBeanFactory().destroySingletons();
        }
    
        public void destroySingletons() {
            super.destroySingletons();
            updateManualSingletonNames(Set::clear, set -> !set.isEmpty());
            clearByTypeCache();
        }
    
        public void destroySingletons() {
            if (logger.isTraceEnabled()) {
                logger.trace("Destroying singletons in " + this);
            }
            synchronized (this.singletonObjects) {
                // 设置该属性,表示当前beanFactory状态转变为了销毁状态。
                this.singletonsCurrentlyInDestruction = true;
            }
    
            // disposable ? 创建单实例时,会检查当前单实例类型
            // 是否实现了DisposableBean接口,如果实现了该接口,
            // 对应,容器销毁时,需要执行该bean.destroy() 方法。
            String[] disposableBeanNames;
            synchronized (this.disposableBeans) {
                disposableBeanNames = StringUtils.toStringArray(this.disposableBeans.keySet());
            }
            for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
                destroySingleton(disposableBeanNames[i]);
            }
    
            this.containedBeanMap.clear();
            this.dependentBeanMap.clear();
            this.dependenciesForBeanMap.clear();
    
            clearSingletonCache();
        }
    
        public void destroySingleton(String beanName) {
            // Remove a registered singleton of the given name, if any.
            // 清空3级缓存 + registeredSingletons 里面 对应当前beanName的数据。
            removeSingleton(beanName);
    
            // Destroy the corresponding DisposableBean instance.
            DisposableBean disposableBean;
            synchronized (this.disposableBeans) {
                // 注册时会向 disposableBeans 内部存放 实现了  DisposableBean 接口的 bean
                disposableBean = (DisposableBean) this.disposableBeans.remove(beanName);
            }
            destroyBean(beanName, disposableBean);
        }
    
        protected void destroyBean(String beanName, @Nullable DisposableBean bean) {
            // Trigger destruction of dependent beans first...
            Set<String> dependencies;
            // dependentBeanMap ? 保存的是依赖当前 bean 的其它bean信息。
            //比如说:b/c/d 这三个bean依赖了a,那么dependentBeanMap 内部 就应该有这样一个数据:
            //{key:a, value: {b,c,d}}
            synchronized (this.dependentBeanMap) {
                // Within full synchronization in order to guarantee a disconnected Set
                dependencies = this.dependentBeanMap.remove(beanName);
            }
            if (dependencies != null) {
                if (logger.isTraceEnabled()) {
                    logger.trace("Retrieved dependent beans for bean '" + beanName + "': " + dependencies);
                }
                // 因为依赖对象要被回收了,所以 依赖当前bean的其它对象,
                // 都要执行destroySingleton逻辑。
                for (String dependentBeanName : dependencies) {
                    destroySingleton(dependentBeanName);
                }
            }
    
            // Actually destroy the bean now...
            if (bean != null) {
                try {
                    //执行当前bean的销毁方法。
                    bean.destroy();
                }
                catch (Throwable ex) {
                    if (logger.isWarnEnabled()) {
                        logger.warn("Destruction of bean with name '" + beanName + "' threw an exception", ex);
                    }
                }
            }
    
            // Trigger destruction of contained beans...
            Set<String> containedBeans;
            synchronized (this.containedBeanMap) {
                // Within full synchronization in order to guarantee a disconnected Set
                containedBeans = this.containedBeanMap.remove(beanName);
            }
            if (containedBeans != null) {
                for (String containedBeanName : containedBeans) {
                    destroySingleton(containedBeanName);
                }
            }
    
            // Remove destroyed bean from other beans' dependencies.
            synchronized (this.dependentBeanMap) {
                for (Iterator<Map.Entry<String, Set<String>>> it = this.dependentBeanMap.entrySet().iterator(); it.hasNext();) {
                    Map.Entry<String, Set<String>> entry = it.next();
                    Set<String> dependenciesToClean = entry.getValue();
                    dependenciesToClean.remove(beanName);
                    if (dependenciesToClean.isEmpty()) {
                        it.remove();
                    }
                }
            }
    
            // Remove destroyed bean's prepared dependency information.
            // 比如说a 它依赖了 w,x ,那么对应dependenciesForBeanMap 就应该有:
            // {a, {w,x}}
            this.dependenciesForBeanMap.remove(beanName);
        }
    
    

    4.AbstractApplicationContext#prepareBeanFactory

        protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
            // Tell the internal bean factory to use the context's class loader etc.
            // 给当前bf设置一个类加载器,用于加载bd的class信息。
            beanFactory.setBeanClassLoader(getClassLoader());
            // Spring EL 表达式,这个表达式谁解析? 
            // StandardBeanExpressionResolver .  #{object.a}
            beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
            //BeanWrapper 本身就是属性编辑器注册中心,
            // 属性编辑器作用于beanWrapper内部管理的真实bean 注入 字段值时,
            //当某个字段对应的类型 在 BeanWrapper内 有对应的 属性编辑器,
            // 那么对应类型的字段值 就由该属性编辑器 代理写入。
            beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
    
            // Configure the bean factory with context callbacks.
            // 添加后处理器,该后处理器 主要用于向bean内部注入一些 框架级别的实例,
            // 比如说:环境变量、ApplicationContext
            beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
            //忽略指定类型的依赖。
            //意思就是说,bean内部有这些类型的字段的话,这些字段 不参与 依赖注入。
            // 统一放在上面的ApplicationContextAwareProcessor里面处理
            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.
            // 该后处理器 将配置的监听者 注册到 ac中。
            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());
            }
        }
    

    4.1 属性编辑器

    属性编辑器:属性注入进Bean实例之前,可以通过属性编辑器操作一下。

    public class DatePropertyEditorRegistrar implements PropertyEditorRegistrar {
        @Override
        public void registerCustomEditors(PropertyEditorRegistry registry) {
            registry.registerCustomEditor(Date.class, new DatePropertyEditor());
        }
    }
    
    
    public class DatePropertyEditor extends PropertyEditorSupport {
        private String format = "yyyy-MM-dd";
    
        public void setFormat(String format) {
            this.format = format;
        }
    
        public void setAsText(String arg0) {
            System.out.println("arg0:" + arg0);
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            try {
                Date d = sdf.parse(arg0);
                this.setValue(d);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="student" class="com.wz.spring.fieldEditor.Student">
            <property name="name" value="zhangsan"/>
            <property name="birthday" value="2000-01-01"/>
        </bean>
    
        <!-- 自定义属性编辑器 -->
        <bean class = "org.springframework.beans.factory.config.CustomEditorConfigurer">
            <property name="propertyEditorRegistrars">
                <list>
                    <bean class="com.wz.spring.fieldEditor.DatePropertyEditorRegistrar"/>
                </list>
            </property>
        </bean>
    </beans>
    

    4.2 ApplicationListenerDetector

        @Override
        public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
            if (ApplicationListener.class.isAssignableFrom(beanType)) {
                this.singletonNames.put(beanName, beanDefinition.isSingleton());
            }
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) {
            return bean;
        }
    
    
        /**
         * 判断当前创建出来的bean实例 是否是 实现了 ApplicationListener 接口的 实例,如果是,
         * 当前bean就是一个 事件监听器 对象,需要把监听者注册到 ac 中。
         */
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) {
            if (bean instanceof ApplicationListener) {
                // potentially not detected as a listener by getBeanNamesForType retrieval
                Boolean flag = this.singletonNames.get(beanName);
                if (Boolean.TRUE.equals(flag)) {
                    // singleton bean (top-level or inner): register on the fly
                    this.applicationContext.addApplicationListener((ApplicationListener<?>) bean);
                }
                else if (Boolean.FALSE.equals(flag)) {
                    if (logger.isWarnEnabled() && !this.applicationContext.containsBean(beanName)) {
                        // inner bean with other scope - can't reliably process events
                        logger.warn("Inner bean '" + beanName + "' implements ApplicationListener interface " +
                                "but is not reachable for event multicasting by its containing ApplicationContext " +
                                "because it does not have singleton scope. Only top-level listener beans are allowed " +
                                "to be of non-singleton scope.");
                    }
                    this.singletonNames.remove(beanName);
                }
            }
            return bean;
        }
    

    5.AbstractApplicationContext#invokeBeanFactoryPostProcessors

        protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
            PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    
            // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
            // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
            if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
                beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
                beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
            }
        }
    
        public static void invokeBeanFactoryPostProcessors(
                ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    
            // Invoke BeanDefinitionRegistryPostProcessors first, if any.
            // 存储已经执行过的bfpp beanName
            Set<String> processedBeans = new HashSet<>();
    
            // 条件成立:说明当前bf是bd注册中心。bd全部注册到bf内。
            if (beanFactory instanceof BeanDefinitionRegistry) {
                // 将bf 转换成 bdRegistry。
                BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
                // 规整的 普通的 PostProcessor集合。
                List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
                // 存储 BeanDefinitionRegistryPostProcessor 集合。
                // BeanDefinitionRegistryPostProcessor 这种类型的容器后处理器 
                // 可以再向容器内 手动硬编码注册一些bd。
                List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
    
                // 处理ApplicationContext上面 硬编码注册的一些 bfpp 处理器。
                for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
                    if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                        BeanDefinitionRegistryPostProcessor registryProcessor =
                                (BeanDefinitionRegistryPostProcessor) postProcessor;
                        // 这里调用 可以向 bf 内部再次注册一些 bd信息。
                        registryProcessor.postProcessBeanDefinitionRegistry(registry);
                        registryProcessors.add(registryProcessor);
                    }
                    else {
                        //因为当前postProcessor非registry类型,
                        // 即当前postProcessor是个普通的。就加入到普通集合,后续会统一执行一些方法。
                        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.
                // 临时的,当前阶段的 registry后处理器集合。
                List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
    
                // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
                //使用bf获取BeanDefinitionRegistryPostProcessor类型的全部beanName
                String[] postProcessorNames =
                        beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                //处理每个beanName,每个beanName其实都是
                // BeanDefinitionRegistryPostProcessor。
                for (String ppName : postProcessorNames) {
                    // 判断对应的bean是否实现了 主排序接口PriorityOrdered ,
                    // 如果实现了,就让该 bdrpp 添加到 currentRegistryProcessors。
                    if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        // 因为接下来马上就是要执行 bfrpp 的 registry 相关接口方法,
                        // 所以将beanName添加到processedBeans 表示已执行。
                        processedBeans.add(ppName);
                    }
                }
                //排序,根据order值进行 升序排序。
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                //添加到registry类型后处理器集合内。
                registryProcessors.addAll(currentRegistryProcessors);
                // 调用每个bdrpp的postProcessBeanDefinitionRegistry 方法,
                // 向bf内注册bd信息。
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                // 清空集合。
                currentRegistryProcessors.clear();
    
                // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                for (String ppName : postProcessorNames) {
                    //!processedBeans.contains(ppName)  确保每个bdrpp只执行一次 注册 bd的逻辑。
                    if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        processedBeans.add(ppName);
                    }
                }
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                registryProcessors.addAll(currentRegistryProcessors);
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                currentRegistryProcessors.clear();
    
                // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
                // 控制while是否需要再次循环,因为循环内就是查找并执行
                // bdrpp后处理器的registry相关的接口方法。
                // 接口方法执行之后 会向bf 内注册 bd,再次注册的bd 
                // 也有可能是 bdrpp 类型,所以,需要该变量控制while循环。
                boolean reiterate = true;
                while (reiterate) {
                    reiterate = false;
                    postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                    for (String ppName : postProcessorNames) {
                        if (!processedBeans.contains(ppName)) {
                            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                            processedBeans.add(ppName);
                            reiterate = true;
                        }
                    }
                    sortPostProcessors(currentRegistryProcessors, beanFactory);
                    registryProcessors.addAll(currentRegistryProcessors);
                    invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                    currentRegistryProcessors.clear();
                }
    
                // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
                invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
                // 执行硬编码提供的【beanFactoryPostProcessor】接口实现类的 
                // postProcessBeanFactory() 方法。
                invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
            }
    
            else {
                // Invoke factory processors registered with the context instance.
                invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
            }
    
            //上面的代码处理了:硬编码提供的bfpp 和 bdrpp 这两种类型的bfpp。
            //还有普通的bfpp需要处理。
    
            // Do not initialize FactoryBeans here: We need to leave all regular beans
            // uninitialized to let the bean factory post-processors apply to them!
            // 获取容器内注册的bfpp类型的 beanName 数组集合。
            String[] postProcessorNames =
                    beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    
            // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
            // Ordered, and the rest.
            List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
            List<String> orderedPostProcessorNames = new ArrayList<>();
            List<String> nonOrderedPostProcessorNames = new ArrayList<>();
            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(priorityOrderedPostProcessors, beanFactory);
            invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    
            // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
            List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
            for (String postProcessorName : orderedPostProcessorNames) {
                orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
            }
            sortPostProcessors(orderedPostProcessors, beanFactory);
            invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    
            // Finally, invoke all other BeanFactoryPostProcessors.
            List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
            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();
        }
    

    6.AbstractApplicationContext#initApplicationEventMulticaster

        protected void initApplicationEventMulticaster() {
            ConfigurableListableBeanFactory beanFactory = getBeanFactory();
            // 条件成立:说明用户自定义了事件传播器。 
            // 咱们可以实现ApplicationEventMulticaster接口,
            // 写一款自己的事件传播器,通过bean的方式提供给Spring。
            if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
                this.applicationEventMulticaster =
                        beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
                if (logger.isTraceEnabled()) {
                    logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
                }
            }
            else {
                this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
                // 注册到一级缓存内。
                beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
                if (logger.isTraceEnabled()) {
                    logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
                            "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
                }
            }
        }
    
    

    7.AbstractApplicationContext#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!
            // 注册通过配置提供的Listener。
            // 用户可以通过beanDefinition的方式 提供 Listener。
            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;
            this.earlyApplicationEvents = null;
            if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
                for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
                    getApplicationEventMulticaster().multicastEvent(earlyEvent);
                }
            }
        }
    

    8.AbstractApplicationContext#finishBeanFactoryInitialization

        protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
            // Initialize conversion service for this context.
            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(strVal -> 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.
            // 冻结配置信息,冻结bd信息。 冻结之后,就无法再向bf内注册bd。
            beanFactory.freezeConfiguration();
    
            // Instantiate all remaining (non-lazy-init) singletons.
            // 预初始化非懒加载状态的单实例。
            beanFactory.preInstantiateSingletons();
        }
    
        public void preInstantiateSingletons() throws BeansException {
            if (logger.isTraceEnabled()) {
                logger.trace("Pre-instantiating singletons in " + this);
            }
    
            // Iterate over a copy to allow for init methods which in turn register new bean definitions.
            // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
            List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
    
            // Trigger initialization of all non-lazy singleton beans...
            for (String beanName : beanNames) {
                // 获取bd信息。
                RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
                // 条件成立:说明bd是非抽象 且 是单实例 且 非懒加载,就需要预先实例化出来。
                if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                    //当前beanDefinition对应的class可能是 普通的,也可能是 FactoryBean。
                    //条件成立:说明当前bd的class是FactoryBean
                    if (isFactoryBean(beanName)) {
                        // 获取FactoryBean实例本身。
                        Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                        if (bean instanceof FactoryBean) {
                            FactoryBean<?> factory = (FactoryBean<?>) bean;
                            boolean isEagerInit;
                            if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                                isEagerInit = AccessController.doPrivileged(
                                        (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
                                        getAccessControlContext());
                            }
                            else {
                                // 控制FactoryBean内部管理的真实bean,在refresh阶段 是否也初始化。
                                isEagerInit = (factory instanceof SmartFactoryBean &&
                                        ((SmartFactoryBean<?>) factory).isEagerInit());
                            }
                            // 需要初始化FactoryBean管理的Bean
                            if (isEagerInit) {
                                getBean(beanName);
                            }
                        }
                    }
                    else {
                        getBean(beanName);
                    }
                }
    

    9.AbstractApplicationContext#finishRefresh

        protected void finishRefresh() {
            // Clear context-level resource caches (such as ASM metadata from scanning).
            clearResourceCaches();
    
            // 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);
        }
    

    9.1 initLifecycleProcessor()

        protected void initLifecycleProcessor() {
            ConfigurableListableBeanFactory beanFactory = getBeanFactory();
            // 条件成立:说明用户自定义了 生命周期处理器。
            if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
                this.lifecycleProcessor =
                        beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
                if (logger.isTraceEnabled()) {
                    logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
                }
            }
            else {
                // Spring 默认提供的生命周期处理器。
                DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
                defaultProcessor.setBeanFactory(beanFactory);
                this.lifecycleProcessor = defaultProcessor;
                // 将生命周期处理器 注册到 bf的一级缓存内。
                beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
                if (logger.isTraceEnabled()) {
                    logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " +
                            "[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");
                }
            }
        }
    

    9.2 DefaultLifecycleProcessor#onRefresh

        public void onRefresh() {
            startBeans(true);
            this.running = true;
        }
    
        /**
         * autoStartupOnly ?
         * true:表示只启动 SmartLifecycle 生命周期对象,并且启动 SmartLifecycle对象它的autoStartup是true。
         *       不会启动 普通的 lifecycle 生命周期对象。
         *
         * false:全部启动。
         */
        private void startBeans(boolean autoStartupOnly) {
            // 获取到所有实现了 Lifecycle接口的对象,
            // 包装到map内,key是beanName,value 是 lifecycle对象。
            Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
            // 因为生命周期对象 可能依赖其它生命周期对象的执行结果,
            // 所以需要执行顺序,靠什么实现呢?
            // 靠 phase 数值,phase 越低的 lifecycle 越先执行 start 方法。
            Map<Integer, LifecycleGroup> phases = new HashMap<>();
            lifecycleBeans.forEach((beanName, bean) -> {
                // true:表示只启动 SmartLifecycle 生命周期对象,
                // 并且启动 SmartLifecycle对象它的autoStartup是true。
                // false :全部启动。
                if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {
                    // 获取当前lifecycle对象的 执行排序值。
                    int phase = getPhase(bean);
                    // LifecycleGroup 内部存储的都是 phase 值一致的 lifecycle。
                    LifecycleGroup group = phases.get(phase);
                    if (group == null) {
                        group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);
                        phases.put(phase, group);
                    }
                    // 将当前lifecycle添加到 当前phase值一致的 group 内。
                    group.add(beanName, bean);
                }
            });
            //执行到这里,lifecycle就按照phase分完组了
            if (!phases.isEmpty()) {
                List<Integer> keys = new ArrayList<>(phases.keySet());
                //从小到大的一个排序。
                Collections.sort(keys);
                for (Integer key : keys) {
                    //执行 lifecycleGroup.start() 启动分组内的lifecycle。
                    phases.get(key).start();
                }
            }
        }
    

    DefaultLifecycleProcessor.LifecycleGroup#start

            public void start() {
                if (this.members.isEmpty()) {
                    return;
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Starting beans in phase " + this.phase);
                }
                //排序..
                Collections.sort(this.members);
    
    
                for (LifecycleGroupMember member : this.members) {
                    doStart(this.lifecycleBeans, member.name, this.autoStartupOnly);
                }
    
            }
    
        private void doStart(Map<String, ? extends Lifecycle> lifecycleBeans, String beanName, boolean autoStartupOnly) {
            // 确保lifecycle只被启动一次。 在一个分组内 被启动了,
            // 其它分组内,就看不到该lifecycle了。
            Lifecycle bean = lifecycleBeans.remove(beanName);
            if (bean != null && bean != this) {
                // 获取当前即将要被启动的lifecycle所依赖的其它beanName
                String[] dependenciesForBean = getBeanFactory().getDependenciesForBean(beanName);
                // 先启动当前lifecycle所依赖的lifecycle。
                for (String dependency : dependenciesForBean) {
                    doStart(lifecycleBeans, dependency, autoStartupOnly);
                }
                // true:表示只启动 SmartLifecycle 生命周期对象,
                //   并且启动 SmartLifecycle对象它的autoStartup是true。
                // false :全部启动。
                if (!bean.isRunning() &&
                        (!autoStartupOnly || !(bean instanceof SmartLifecycle) || ((SmartLifecycle) bean).isAutoStartup())) {
                    if (logger.isTraceEnabled()) {
                        logger.trace("Starting bean '" + beanName + "' of type [" + bean.getClass().getName() + "]");
                    }
                    try {
                        //启动当前lifecycle。
                        bean.start();
                    }
                    catch (Throwable ex) {
                        throw new ApplicationContextException("Failed to start bean '" + beanName + "'", ex);
                    }
                    if (logger.isDebugEnabled()) {
                        logger.debug("Successfully started bean '" + beanName + "'");
                    }
                }
            }
        }
    

    9.3 DefaultLifecycleProcessor#stop

        public void stop() {
            stopBeans();
            this.running = false;
        }
    
        private void stopBeans() {
            // 获取到所有实现了 Lifecycle接口的对象,
            // 包装到map内,key是beanName,value 是 lifecycle对象。
            Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
            // 因为生命周期对象 可能依赖其它生命周期对象的执行结果,
            // 所以需要执行顺序,靠什么实现呢?
            // 靠 phase 数值,phase 越低的 lifecycle 越晚执行 stop 方法。
            Map<Integer, LifecycleGroup> phases = new HashMap<>();
            lifecycleBeans.forEach((beanName, bean) -> {
                int shutdownPhase = getPhase(bean);
                LifecycleGroup group = phases.get(shutdownPhase);
                if (group == null) {
                    group = new LifecycleGroup(shutdownPhase, this.timeoutPerShutdownPhase, lifecycleBeans, false);
                    phases.put(shutdownPhase, group);
                }
                group.add(beanName, bean);
            });
            if (!phases.isEmpty()) {
                List<Integer> keys = new ArrayList<>(phases.keySet());
                //降序 ,lifecycle 最先启动的,最晚关闭;最晚启动,最先关闭。
                keys.sort(Collections.reverseOrder());
                for (Integer key : keys) {
                    phases.get(key).stop();
                }
            }
        }
    

    DefaultLifecycleProcessor.LifecycleGroup#stop

            public void stop() {
                if (this.members.isEmpty()) {
                    return;
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Stopping beans in phase " + this.phase);
                }
                this.members.sort(Collections.reverseOrder());
    
                // 创建了latch,并且设置latch内部的值为  当前分组内 smartLifecycle的数量。
                CountDownLatch latch = new CountDownLatch(this.smartMemberCount);
    
                // 保存当前正在处于 关闭ing 的 smartLifecycle beanName。
                Set<String> countDownBeanNames = Collections.synchronizedSet(new LinkedHashSet<>());
    
                // bf 全部的lifecycle BeanNames
                Set<String> lifecycleBeanNames = new HashSet<>(this.lifecycleBeans.keySet());
    
                // 处理本分组内的需要关闭的 lifecycle。
                for (LifecycleGroupMember member : this.members) {
    
                    if (lifecycleBeanNames.contains(member.name)) {
    
                        doStop(this.lifecycleBeans, member.name, latch, countDownBeanNames);
                    }
                    else if (member.bean instanceof SmartLifecycle) {
                        // Already removed: must have been a dependent bean from another phase
                        latch.countDown();
                    }
                }
    
    
                try {
                    // 关闭分组lifecycle的主线程,会在这里等待,等待latch 归0,或者超时。   30s.
                    latch.await(this.timeout, TimeUnit.MILLISECONDS);
    
                    if (latch.getCount() > 0 && !countDownBeanNames.isEmpty() && logger.isInfoEnabled()) {
                        logger.info("Failed to shut down " + countDownBeanNames.size() + " bean" +
                                (countDownBeanNames.size() > 1 ? "s" : "") + " with phase value " +
                                this.phase + " within timeout of " + this.timeout + "ms: " + countDownBeanNames);
                    }
                }
                catch (InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    
        private void doStop(Map<String, ? extends Lifecycle> lifecycleBeans, final String beanName,
                final CountDownLatch latch, final Set<String> countDownBeanNames) {
    
            Lifecycle bean = lifecycleBeans.remove(beanName);
            if (bean != null) {
                // 依赖当前lifecycle的其它对象 beanName.
                String[] dependentBeans = getBeanFactory().getDependentBeans(beanName);
                // 因为当前lifecycle即将要关闭了,所以那些依赖了 
                // 当前lifecycle的bean,如果也是lifecycle对象的话,也要先于当前对象关闭。
                for (String dependentBean : dependentBeans) {
                    doStop(lifecycleBeans, dependentBean, latch, countDownBeanNames);
                }
                try {
                    if (bean.isRunning()) {
                        if (bean instanceof SmartLifecycle) {
                            if (logger.isTraceEnabled()) {
                                logger.trace("Asking bean '" + beanName + "' of type [" +
                                        bean.getClass().getName() + "] to stop");
                            }
                            // 将当前SmartLifecycle beanName 添加到 
                            // countDownBeanNames 集合内,该集合表示正在关闭的 smartLifecycle。
                            countDownBeanNames.add(beanName);
                            // Smartlifecycle 可以传递一个Callback ,
                            // 理论上可以支持异步关闭 生命周期 对象了。
                            ((SmartLifecycle) bean).stop(() -> {
                                latch.countDown();
                                countDownBeanNames.remove(beanName);
                                if (logger.isDebugEnabled()) {
                                    logger.debug("Bean '" + beanName + "' completed its stop procedure");
                                }
                            });
                        }
                        else {
                            // 普通的lifecycle 对象,直接调用 lifecycle.stop() 
                            if (logger.isTraceEnabled()) {
                                logger.trace("Stopping bean '" + beanName + "' of type [" +
                                        bean.getClass().getName() + "]");
                            }
                            bean.stop();
                            if (logger.isDebugEnabled()) {
                                logger.debug("Successfully stopped bean '" + beanName + "'");
                            }
                        }
                    }
                    else if (bean instanceof SmartLifecycle) {
                        // Don't wait for beans that aren't running...
                        latch.countDown();
                    }
                }
                catch (Throwable ex) {
                    if (logger.isWarnEnabled()) {
                        logger.warn("Failed to stop bean '" + beanName + "'", ex);
                    }
                }
            }
        }
    
    

    相关文章

      网友评论

          本文标题:AbstractApplicationContext#refre

          本文链接:https://www.haomeiwen.com/subject/wplafdtx.html