spring源码系列二-refresh()

引言

上篇博文《spring源码学习系列一》https://blog.csdn.net/weixin_47061482/article/details/115405686
中提到refresh()中十几个重要方法,是spring启动的核心,结合源码,让我们依次来看看吧!
在这里插入图片描述

一、prepareRefresh()

prepareRefresh()为容器初始化做准备,初始化spring状态,使spring处于运行状态。

protected void prepareRefresh() {
		//spring启动时间
		this.startupDate = System.currentTimeMillis();
		//spring标记为未关闭
		this.closed.set(false);
		//spring激活状态
		this.active.set(true);
		//记录日志
		if (logger.isDebugEnabled()) {
			if (logger.isTraceEnabled()) {
				logger.trace("Refreshing " + this);
			}
			else {
				logger.debug("Refreshing " + getDisplayName());
			}
		}
		//点进去会发现没有任何内容,是个方法扩展点。留给子类覆盖,初始化属性资源
		initPropertySources();
		// 创建并获取环境对象,验证需要的属性文件是否都已经放入环境中
		getEnvironment().validateRequiredProperties();
		// 判断刷新前的应用程序监听器集合是否为空,如果为空,则将监听器添加到此集合中
		if (this.earlyApplicationListeners == null) {
			this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
		}
		else {
		//如果不等于空,则清空集合元素对象
			this.applicationListeners.clear();
	this.applicationListeners.addAll(this.earlyApplicationListeners);
		}
		// 创建刷新前的监听事件集合
		this.earlyApplicationEvents = new LinkedHashSet<>();
	}

二、obtainFreshBeanFactory()

obtainFreshBeanFactory方法主要作用:创建BeanFactory对象,并解析xml封装成BeanDefinition对象。

public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
...
  			//			* 1、创建BeanFactory对象
			//			* 2、xml解析
			//			* 	传统标签解析:bean、import等
			//			* 	自定义标签解析 如:<context:component-scan base-package="com.xiangxue.jack"/>
			//			* 	自定义标签解析流程:
			//			* 		a、根据当前解析标签的头信息找到对应的namespaceUri
			//			* 		b、加载spring所以jar中的spring.handlers文件。并建立映射关系
			//			* 		c、根据namespaceUri从映射关系中找到对应的实现了NamespaceHandler接口的类
			//			* 		d、调用类的init方法,init方法是注册了各种自定义标签的解析类
			//			* 		e、根据namespaceUri找到对应的解析类,然后调用paser方法完成标签解析
			//			*
			//			* 3、把解析出来的xml标签封装成BeanDefinition对象
		protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
			   // 1.刷新 BeanFactory,由AbstractRefreshableApplicationContext实现,初始化beanFactory,并执行加载和解析配置操作
				refreshBeanFactory();
				//返回beanFactory实例
				return getBeanFactory();
		}
...
}

obtainFreshBeanFactory方法内部调用链比较长,此处先不展开,可参考另一篇博文详细展开:
https://blog.csdn.net/weixin_47061482/article/details/115406384

三、prepareBeanFactory(beanFactory)

简单来说是给beanFactory设置一些属性值,对 beanFactory 进行功能扩展,如增加 SPEL 支持和属性编辑器等,

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        //设置类加载器:存在则直接设置/不存在则新建一个默认类加载器
        beanFactory.setBeanClassLoader(getClassLoader());
 
       //设置EL表达式解析器(Bean初始化完成后填充属性时会用到)
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
 
       //设置属性注册解析器PropertyEditor
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
 
     // 将当前的ApplicationContext对象交给ApplicationContextAwareProcessor类来处理,从而在Aware接口实现类中的注入applicationContext
        beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
 
        //设置忽略自动装配的接口
        beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
        beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
        beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
 
        //注册可以解析的自动装配
        // 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);
 
        //如果当前BeanFactory包含loadTimeWeaver Bean,说明存在类加载期织入AspectJ,则把当前BeanFactory交给类加载期BeanPostProcessor实现类LoadTimeWeaverAwareProcessor来处理,从而实现类加载期织入AspectJ的目的。
        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()));
        }
 
        //注册当前容器环境environment组件Bean
        if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
        }
 
       //注册系统配置systemProperties组件Bean
        if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
        }
 
       //注册系统环境systemEnvironment组件Bean
        if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
        }
    }

四、postProcessBeanFactory(beanFactory)

此方法是空的,spring预留的扩展处理,是留给子类实现的


public void refresh() throws BeansException, IllegalStateException {
...
	// Allows post-processing of the bean factory in context subclasses.
	protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	}
...

五、invokeBeanFactoryPostProcessors(beanFactory)

refresh()方法中的第五个方法invokeBeanFactoryPostProcessors,作用:调用Bean工厂的后置处理器,完成对BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor两个接口的调用。

Bean工厂的后置处理器BeanFactoryPostProcessor(触发时机:bean定义注册之后bean实例化之前)和BeanDefinitionRegistryPostProcessor(触发时机:bean定义注册之前),

/*
 * BeanDefinitionRegistryPostProcessor
* BeanFactoryPostProcessor
* Bean工厂的后置处理器 、完成对这两个接口的调用
* * */
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        //传入Bean工厂并获取容器中的Bean工厂后置处理器(注意这里Bean工厂后置处理器还没有初始化)
        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()));
        }
    }

从上面的PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors方法进去-》

final class PostProcessorRegistrationDelegate {
    public static void invokeBeanFactoryPostProcessors(
            ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

        Set<String> processedBeans = new HashSet<>();

        //判断我们的beanFactory是否实现了BeanDefinitionRegistry
        if (beanFactory instanceof BeanDefinitionRegistry) {
            //强行把beanFactory转为BeanDefinitionRegistry
            BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
            //保存BeanFactoryPostProcessor类型的后置处理器
            List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
            //保存BeanDefinitionRegistryPostProcessor类型的后置处理器
            List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

            //循环我们传递进来的beanFactoryPostProcessors
            for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
                //判断我们的后置处理器是不是BeanDefinitionRegistryPostProcessor
                if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                    //进行强制转化
                    BeanDefinitionRegistryPostProcessor registryProcessor =
                            (BeanDefinitionRegistryPostProcessor) postProcessor;
                    //调用它的后置方法
                    registryProcessor.postProcessBeanDefinitionRegistry(registry);
                    //添加到我们用于保存的BeanDefinitionRegistryPostProcessor的集合中
                    registryProcessors.add(registryProcessor);
                }
                else {//若没有实现BeanDefinitionRegistryPostProcessor接口,那么他就是BeanFactoryPostProcessor 把当前的后置处理器加入到regularPostProcessors中
                    regularPostProcessors.add(postProcessor);
                }
            }

            //定义一个集合用户保存当前准备创建的BeanDefinitionRegistryPostProcessor
            List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

            //第一步:去容器中获取BeanDefinitionRegistryPostProcessor的bean的处理器名称
            String[] postProcessorNames =
                    beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            //循环上一步获取的BeanDefinitionRegistryPostProcessor的类型名称
            for (String ppName : postProcessorNames) {
                //判断是否实现了PriorityOrdered接口的
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    //显示的调用getBean()的方式获取出该对象然后加入到currentRegistryProcessors集合中去
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    //同时也加入到processedBeans集合中去
                    processedBeans.add(ppName);
                }
            }
            //对currentRegistryProcessors集合中BeanDefinitionRegistryPostProcessor进行排序
            sortPostProcessors(currentRegistryProcessors, beanFactory);
            //把他加入到用于保存到registryProcessors中
            registryProcessors.addAll(currentRegistryProcessors);
            /**
             * 在这里典型的BeanDefinitionRegistryPostProcessor就是ConfigurationClassPostProcessor
             * 用于进行bean定义的加载 比如我们的包扫描,@import等
             */
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
            //调用完之后,马上clear
            currentRegistryProcessors.clear();

            //下一步 又去容器中获取BeanDefinitionRegistryPostProcessor的bean的处理器名称
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            //循环上一步获取的BeanDefinitionRegistryPostProcessor的类型名称
            for (String ppName : postProcessorNames) {
                //表示没有被处理过,且实现了Ordered接口的
                if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    //显示的调用getBean()的方式获取出该对象然后加入到currentRegistryProcessors集合中去
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    //同时也加入到processedBeans集合中去
                    processedBeans.add(ppName);
                }
            }
            //对currentRegistryProcessors集合中BeanDefinitionRegistryPostProcessor进行排序
            sortPostProcessors(currentRegistryProcessors, beanFactory);
            //把他加入到用于保存到registryProcessors中
            registryProcessors.addAll(currentRegistryProcessors);
            //调用他的后置处理方法
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
            //调用完之后,马上clear
            currentRegistryProcessors.clear();

            //调用没有实现任何优先级接口的BeanDefinitionRegistryPostProcessor
            //定义一个重复处理的开关变量 默认值为true
            boolean reiterate = true;
            //第一次就可以进来
            while (reiterate) {
                //进入循环马上把开关变量给改为false
                reiterate = false;
                //去容器中获取BeanDefinitionRegistryPostProcessor的bean的处理器名称
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                //循环上一步获取的BeanDefinitionRegistryPostProcessor的类型名称
                for (String ppName : postProcessorNames) {
                    //没有被处理过的
                    if (!processedBeans.contains(ppName)) {
                        //显示的调用getBean()的方式获取出该对象然后加入到currentRegistryProcessors集合中去
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        //同时也加入到processedBeans集合中去
                        processedBeans.add(ppName);
                        //再次设置为true
                        reiterate = true;
                    }
                }
                //对currentRegistryProcessors集合中BeanDefinitionRegistryPostProcessor进行排序
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                //把他加入到用于保存到registryProcessors中
                registryProcessors.addAll(currentRegistryProcessors);
                //调用他的后置处理方法
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                //进行clear
                currentRegistryProcessors.clear();
            }

            //调用实现了BeanDefinitionRegistryPostProcessor的接口 他是他也同时实现了BeanFactoryPostProcessor的方法
            invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
            //调用BeanFactoryPostProcessor
            invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
        }

        else { //若当前的beanFactory没有实现了BeanDefinitionRegistry 直接调用beanFactoryPostProcessor接口的方法进行后置处理
            invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
        }

        //最后一步 获取容器中所有的 BeanFactoryPostProcessor
        String[] postProcessorNames =
                beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

        //保存BeanFactoryPostProcessor类型实现了priorityOrdered
        List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
        //保存BeanFactoryPostProcessor类型实现了Ordered接口的
        List<String> orderedPostProcessorNames = new ArrayList<>();
        //保存BeanFactoryPostProcessor没有实现任何优先级接口的
        List<String> nonOrderedPostProcessorNames = new ArrayList<>();
        for (String ppName : postProcessorNames) {
            //processedBeans包含的话,表示在上面处理BeanDefinitionRegistryPostProcessor的时候处理过了
            if (processedBeans.contains(ppName)) {
                // skip - already processed in first phase above
            }
            //判断是否实现了PriorityOrdered
            else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
            }
            //判断是否实现了Ordered
            else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                orderedPostProcessorNames.add(ppName);
            }
            //没有实现任何的优先级接口的
            else {
                nonOrderedPostProcessorNames.add(ppName);
            }
        }

        //先调用BeanFactoryPostProcessor实现了PriorityOrdered接口的
        sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
        invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

        //再调用BeanFactoryPostProcessor实现了Ordered.
        List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
        for (String postProcessorName : orderedPostProcessorNames) {
            orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
        }
        sortPostProcessors(orderedPostProcessors, beanFactory);
        invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

        //调用没有实现任何方法接口的
        List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
        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();
    }

上面的内容有点长,重点看这里invokeBeanDefinitionRegistryPostProcessors方法:
在这里插入图片描述invokeBeanDefinitionRegistryPostProcessors()方法点进去-》看源码:

/**
     * Invoke the given BeanDefinitionRegistryPostProcessor beans.
     */
    private static void invokeBeanDefinitionRegistryPostProcessors(
            Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {
        //获取容器中的ConfigurationClassPostProcessor的后置处理器进行Bean定义的扫描
        for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
            postProcessor.postProcessBeanDefinitionRegistry(registry);
        }
    }

继续点进去postProcessBeanDefinitionRegistry()-》最下边的processConfigBeanDefinitions()点进去:

/**
     * Derive further bean definitions from the configuration classes in the registry.
     */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        int registryId = System.identityHashCode(registry);
        if (this.registriesPostProcessed.contains(registryId)) {
            throw new IllegalStateException(
                    "postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);
        }
        if (this.factoriesPostProcessed.contains(registryId)) {
            throw new IllegalStateException(
                    "postProcessBeanFactory already called on this post-processor against " + registry);
        }
        this.registriesPostProcessed.add(registryId);
        //真正的解析我们的Bean定义
        processConfigBeanDefinitions(registry);
    }
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
        List<BeanDefinitionHolder> configCandidates = new ArrayList<>();
        //获取Spring IoC容器中目前所有Bean定义的名称
        String[] candidateNames = registry.getBeanDefinitionNames();

        //循环所有的Bean定义信息
        for (String beanName : candidateNames) {
            //通过Bean的名称来获取Bean的定义对象
            BeanDefinition beanDef = registry.getBeanDefinition(beanName);
            //判断是否有没有解析过
            if (ConfigurationClassUtils.isFullConfigurationClass(beanDef) ||
                    ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);
                }
            }
            //判断是否是配置类
            else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
                //添加到候选的配置类集合中
                configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
            }
        }

        // 若没有找到配置类 直接返回
        if (configCandidates.isEmpty()) {
            return;
        }

        //对我们的配置类进行Order排序
        configCandidates.sort((bd1, bd2) -> {
            int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());
            int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());
            return Integer.compare(i1, i2);
        });

        //创建@CompentScan、@Import导入进来的bean名称的生成器
        SingletonBeanRegistry sbr = null;
        if (registry instanceof SingletonBeanRegistry) {
            sbr = (SingletonBeanRegistry) registry;
            if (!this.localBeanNameGeneratorSet) {
                BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR);
                if (generator != null) {
                    //设置@CompentScan导入进来的bean的名称生成器
                    this.componentScanBeanNameGenerator = generator;
                    //设置@Import导入进来的bean的名称生成器
                    this.importBeanNameGenerator = generator;
                }
            }
        }

        if (this.environment == null) {
            this.environment = new StandardEnvironment();
        }

        //创建一个配置类解析器对象
        ConfigurationClassParser parser = new ConfigurationClassParser(
                this.metadataReaderFactory, this.problemReporter, this.environment,
                this.resourceLoader, this.componentScanBeanNameGenerator, registry);

        //创建一个集合用于保存我们的配置类BeanDefinitionHolder集合默认长度是配置类集合的长度
        Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);
        //创建一个集合用于保存我们的已经解析的配置类,长度默认为解析出来默认的配置类的集合长度
        Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());
        //do while
        do {
            //真正的解析我们的配置类
            parser.parse(candidates);
            parser.validate();

            //解析出来的配置类
            Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());
            configClasses.removeAll(alreadyParsed);

            // Read the model and create bean definitions based on its content
            if (this.reader == null) {
                this.reader = new ConfigurationClassBeanDefinitionReader(
                        registry, this.sourceExtractor, this.resourceLoader, this.environment,
                        this.importBeanNameGenerator, parser.getImportRegistry());
            }
            //真正的把我们解析出来的配置类注册到容器中
            this.reader.loadBeanDefinitions(configClasses);
            //加入到已经解析的集合中
            alreadyParsed.addAll(configClasses);

            candidates.clear();
            //判断我们Spring IoC容器中Bean的定义数量是否 > 候选原始的bean定义的个数
            if (registry.getBeanDefinitionCount() > candidateNames.length) {
                //获取所有的bean定义
                String[] newCandidateNames = registry.getBeanDefinitionNames();
                //原始的老的候选的bean定义
                Set<String> oldCandidateNames = new HashSet<>(Arrays.asList(candidateNames));
                Set<String> alreadyParsedClasses = new HashSet<>();
                //赋值已经解析的
                for (ConfigurationClass configurationClass : alreadyParsed) {
                    alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());
                }

                for (String candidateName : newCandidateNames) {
                    //表示当前循环的还没有被解析过
                    if (!oldCandidateNames.contains(candidateName)) {
                        BeanDefinition bd = registry.getBeanDefinition(candidateName);
                        //判断有没有被解析过
                        if (ConfigurationClassUtils.checkConfigurationClassCandidate(bd, this.metadataReaderFactory) &&
                                !alreadyParsedClasses.contains(bd.getBeanClassName())) {
                            candidates.add(new BeanDefinitionHolder(bd, candidateName));
                        }
                    }
                }
                candidateNames = newCandidateNames;
            }
        }
        //存在没有解析过的 需要循环解析
        while (!candidates.isEmpty());

        // Register the ImportRegistry as a bean in order to support ImportAware @Configuration classes
        if (sbr != null && !sbr.containsSingleton(IMPORT_REGISTRY_BEAN_NAME)) {
            sbr.registerSingleton(IMPORT_REGISTRY_BEAN_NAME, parser.getImportRegistry());
        }

        if (this.metadataReaderFactory instanceof CachingMetadataReaderFactory) {
            // Clear cache in externally provided MetadataReaderFactory; this is a no-op
            // for a shared cache since it'll be cleared by the ApplicationContext.
            ((CachingMetadataReaderFactory) this.metadataReaderFactory).clearCache();
        }
    }

至此我们已经大体了解到:通过调用我们的Bean工厂的后置处理器,第一步:ConfigurationClassPostProcessor,解析我们的配置类,将所有的Bean的定义信息注册到Spring IoC容器中;第二步调用自定义的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinition Registry后置方法,然后再调用postProcessBeanFactory;最后调用自定义的BeanFactoryPostProcessor的postProcessBean Factory方法

invokeBeanDefinitionRegistryPostProcessors方法不更多的展开,详细参考https://www.cnblogs.com/toby-xu/p/11332666.html

可以在Bean工厂的后置处理器中修改Bean的定义信息,比如是否延迟加载、加入一些新的Bean的定义信息等

六、registerBeanPostProcessors(beanFactory)

作用:把实现了 BeanPostProcessor接口的类实例化并注册到工厂.

简单理解:

  • 获取实现了BeanPostProcessor的bean Name,最开始Bean的信息注册到了beandifinitionMap中
  • 将获取到的BeanPostProcessor分类,分为PriorityOrdered,Ordered和常规的类型
  • 分别将PriorityOrdered,Ordered和常规的Bean添加进ApplicationContext的beanPostProcessors中,ApplicationContext的beanPostProcessors是ArrayList。
BeanPostProcessor接口是Spring中一个非常重要的接口,它的接口定义如下:

public interface BeanPostProcessor {

    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
当你实现了这个接口的时候,Spring会保证在每一个bean对象初始化方法调用之前调用postProcessBeforeInitialization方法,在初始化方法调用之后调用postProcessAfterInitialization

接下来看下registerBeanPostProcessors()方法:


public static void registerBeanPostProcessors(
        ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

    //获取BeanFactory中注册的类型为BeanPostProcessor.class的bean名称。一般获取到的是实现了BeanPostProcessor接口的Bean
    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

    // BeanPostProcessor的目标计数
    int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
    // 添加BeanPostProcessorChecker(主要用于记录信息)到beanFactory中
    beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
    // 将BeanPostProcessors分为实现了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)) {
            // 如果ppName对应的Bean实例实现了PriorityOrdered接口, 则拿到ppName对应的Bean实例并添加到priorityOrderedPostProcessors
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
            priorityOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                //如果ppName对应的Bean实例也实现了MergedBeanDefinitionPostProcessor接口,
                // 则将ppName对应的Bean实例添加到internalPostProcessors
                internalPostProcessors.add(pp);
            }
        }
        else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            //如果ppName对应的Bean实例没有实现PriorityOrdered接口, 但是实现了Ordered接口, 则将ppName添加到orderedPostProcessorNames
            orderedPostProcessorNames.add(ppName);
        }
        else {
            nonOrderedPostProcessorNames.add(ppName);
        }
    }
    // 对priorityOrderedPostProcessors进行排序
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    // priorityOrderedPostProcessors
    registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
    // 注册实现Ordered接口的BeanPostProcessors
    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);
    // 注册所有常规的BeanPostProcessors
    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);
    // 最后, 重新注册所有内部BeanPostProcessors(相当于内部的BeanPostProcessor会被移到处理器链的末尾)
    // 排序
    sortPostProcessors(internalPostProcessors, beanFactory);
    // 注册
    registerBeanPostProcessors(beanFactory, internalPostProcessors);
    // 加入ApplicationListenerDetector
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

从registerBeanPostProcessors()方法继续点进去-》

	/**
	 * 注册 BeanPostProcessor beans.
	 * 容器中beanPostProcessors是一个ArrayList来持有这些BeanPostProcessors
	 */
	private static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {

		for (BeanPostProcessor postProcessor : postProcessors) {
			beanFactory.addBeanPostProcessor(postProcessor);
		}
	}
@Override
	public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
		Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
		this.beanPostProcessors.remove(beanPostProcessor);
		this.beanPostProcessors.add(beanPostProcessor);
		//将是否 hasInstantiationAwareBeanPostProcessors设置为true 
		//关于InstantiationAwareBeanPostProcessor作用请看
		//https://blog.csdn.net/u010634066/article/details/80321854
		if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
			this.hasInstantiationAwareBeanPostProcessors = true;
		}
		if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
			this.hasDestructionAwareBeanPostProcessors = true;
		}
	}

七、initMessageSource()

主要作用:是初始化国际化文件
判断beanFactory中是否有名字为messageSource的bean,如果有,从beanFactory中获取并且判断获取的是不是HierarchicalMessageSource类型的,如果是设置其父级消息源

如果没有,新建DelegatingMessageSource类作为messageSource的Bean。
不过多涉猎。

八、initApplicationEventMulticaster()

initApplicationEventMulticaster():初始化应用的事件广播器

protected void initApplicationEventMulticaster() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    // 判断BeanFactory是否已经存在事件广播器(固定使用beanName=applicationEventMulticaster)
    if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
        // 如果已经存在,则将该bean赋值给applicationEventMulticaster
        this.applicationEventMulticaster =
                beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
        if (logger.isDebugEnabled()) {
            logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
        }
    } else {
        // 如果不存在,则使用SimpleApplicationEventMulticaster
        this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
        // 并将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 + "]");
        }
    }
}

九、onRefresh()

空方法,spring扩展点。

protected void onRefresh() throws BeansException {
		// For subclasses: do nothing by default.
	}

十、registerListeners()

registerListeners():注册监听器

protected void registerListeners() {
    // Register statically specified listeners first.
    // 1.通过硬编码调用addApplicationListener方法添加的监听器处理(可以通过自定义ApplicationContextInitializer添加)
    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!
    // 2.通过配置文件或注解注入BeanFactory的监听器处理
    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...
    // 3.使用事件广播器,发布早期应用程序事件到相应的监听器
    Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
    this.earlyApplicationEvents = null;
    if (earlyEventsToProcess != null) {
        for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
            getApplicationEventMulticaster().multicastEvent(earlyEvent);
        }
    }
}

AppicationContext的事件机制是观察者模式的实现,按以下方式可以实现。
首先我们需要自定义一个事件类,此事件类是需要继承ApplicationEvent类
然后我们定义一个监听类,监听类作为一个Spring容器中的bean,同时需要实现ApplicationListner接口
然后我们就可以使用ApplicationContext的实例发布事件,相应监听类的实例(bean)负责监听具体的事件

十一、finishBeanFactoryInitialization(beanFactory)

作用:实例化bean,以及在bean的实例化通过各种各样的后置处理器完成bean的增强。

如果想实例化,前提是不能是抽象类,不能是接口,非懒加载, 而且针对FactoryBean还有不同的处理模式

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

    // 检查上下文中是否存在类型转换器
	if (!beanFactory.hasEmbeddedValueResolver()) {
		beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
	}
    // 尽早初始化LoadTimeWeaverAware bean,以便尽早注册它们的转换器。
	// 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
    // 允许缓存所有的bean的定义数据
	beanFactory.freezeConfiguration();

	// Instantiate all remaining (non-lazy-init) singletons.
    // 准备实例化bean
	beanFactory.preInstantiateSingletons();
}

从准备实例化bean方法preInstantiateSingletons一路跟下去-》
(详细的可以参考博文:https://www.cnblogs.com/ZhuChangwu/p/11755973.html)

----------------------------------------这个方法跟完,我们会发现几个重点!!!----------------------------------------
1、Spring为bean生成了代理对象,默认会先检查被代理的对象有没有实现接口,如果实现了接口,就是用jdk动态代理,否则就看看有没有cglib的相关依赖,如果存在的相关依赖而没有实现接口,就会使用cglib的代理模式
2、循环依赖是怎么通过三级缓存解决的:
先从一级缓存singletonObjects中去获取。(如果获取到就直接return)
如果获取不到或者对象正在创建中(isSingletonCurrentlyInCreation()),那就再从二级缓存earlySingletonObjects中获取。(如果获取到就直接return)
如果还是获取不到,且允许singletonFactories(allowEarlyReference=true)通过getObject()获取。就从三级缓存singletonFactory.getObject()获取。(如果获取到了就从singletonFactories中移除,并且放进earlySingletonObjects。

private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); //一级缓存
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); // 二级缓存
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); // 三级缓存
  • singletonObjects:一级缓存。用于存放完全初始化好的 bean,从该缓存中取出的 bean 可以直接使用
  • earlySingletonObjects:二级缓存。提前曝光的单例对象的cache,存放原始的 bean 对象(尚未填充属性),用于解决循环依赖
  • singletonFactories:三级缓存。单例对象工厂的cache,存放 bean 工厂对象,用于解决循环依赖解决AOP问题。 代理的问题,代理对象非原对象,需要先给原对象设置属性,再代理。

对于Spring循环依赖的情况总结如下:
不能解决的情况:
构造器注入循环依赖
prototype模式field属性注入循环依赖
能解决的情况:
singleton模式field属性注入(setter方法注入)循环依赖

十二、finishRefresh()

作用:完成上下文的刷新工作

protected void finishRefresh() {
    // Initialize lifecycle processor for this context.
    // 1.为此上下文初始化生命周期处理器
    initLifecycleProcessor();
    // Propagate refresh to lifecycle processor first.
    // 2.首先将刷新完毕事件传播到生命周期处理器(触发isAutoStartup方法返回true的SmartLifecycle的start方法)
    getLifecycleProcessor().onRefresh();
    // Publish the final event.
    // 3.推送上下文刷新完毕事件到相应的监听器
    publishEvent(new ContextRefreshedEvent(this));
    // Participate in LiveBeansView MBean, if active.
    LiveBeansView.registerApplicationContext(this);
}

十三、destroyBeans()

作用:bean的销毁
Bean的销毁分为两大部分:LifeCycle相关的销毁、DisposableBean的销毁。每一部分都会优先销毁该Bean的dependent Bean。且在每一部分内部,执行完单个Bean的所有销毁工作后,才会执行下一个Bean的销毁工作。若不同Bean之间不存在依赖关系,如果仍然需要控制不同Bean销毁方法的执行顺序,可以手动配置depends-on,或者通过控制生命周期的phase实现(实现SmartLifecycle接口)。

三种销毁 Spring Bean 的方式
1)DisposableBean
我们可以通过实现 DisposableBean 接口,在其唯一方法 destroy 内完成 bean 销毁的工作,但是 Spring Framework 官方并不建议我们通过这种方法来销毁 bean,这同样是一种强耦合的方式。

2)@PreDestroy
这种方式是 Spring 非常提倡的一种方式,我们通常将其标记在方法上即可,通常习惯将这个方法起名为 destory()
3)destroy-method

相应的对应初始化方式有三个,分别是:

1)InitializingBean的afterPropertiesSet方法
2)PostConstruct注解标注的方法
3)配置的init-method

以上三种 Bean 的销毁方式也是可以组合使用时调用顺序:
首先 @PreDestroy 会被调用
其次 DisposableBean.destroy() 会被调用
最后调用通过 XML 配置的 destroy-method 方法或通过设置 @Bean 注解 设置 destroyMethod 属性的方法

总结

跟完一遍源码大概了解了Spring的容器中Bean生命周期简单概括如下:
对象创建:
1、解析xml读取配置的Bean,【@Bean注解,或者Java代码BeanDefinitionBuilder中读取Bean的定义】
2、java 反射机制实例化Bean对象;
3、设置Bean的属性;
4、注入Bean实现了的Aware的依赖(BeanNameAware,BeanClassLoaderAware,BeanFactoryAware,ApplicationContextAware等);
5、执行通用的方法前置处理,BeanPostProcessor.postProcessorBeforeInitialization()【如果加载了BeanPostProcessor相关实现类】
6、执行 InitalizingBean.afterPropertiesSet() 方法
7、执行Bean自定义的初始化方法【PostConstruct注解或者配置的init-method】;
8、执行方法后置处理BeanPostProcessor.postProcessorAfterInitialization()【如果加载了BeanPostProcessor相关实现类】
对象创建完毕:
销毁:
9、如果Bean实现了DisposableBean接口,则执行 DisposableBean.destory() 方法;
10、执行自定义的destory方法或者 @PreDestory 标注的方法,则执行定义的销毁方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只IT攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值