springIOC初始化过程(13个核心方法说明)

1. ApplicationContext context = new ClassPathXmlApplicationContext("test.xml");

1.1. setConfigLocation

        资源定位功能,创建了环境对象Enviroment,包含了当前JVM的profile配置信息、环境变量、java进程变量等。还创建了PropertyReslover、PropertyPlaceholderHelper对象用于替换配置文件中的${}对象

1.1.1. reslovePath()

1.1.1.1. getEnviroment()

1.1.1.1.1. standardEnveriment()

PropertiesPropertySource {name='systemProperties'}

SystemEnvironmentPropertySource {name='systemEnvironment'}

1.1.1.2. resolveRequiredPlaceholders()

        解析并替换资源路径的占位符资源  ${ 、} 、:、

1.1.1.2.1. doResolvePlaceholders()

        替换占位符

1.2 *refresh()

        初始化入库

1.2.1 prepareRefresh()

        为读取上下文做准备,完成一些基础的准备工作:设置时间、设置启动关闭标志、检查环境变量。并且提供了提供子类扩展,用来将属性注入到ApplicationContext中,设置事件监听器集合

1.2.2. obtainFreshBeanFactory()

        1.刷新bean工厂 refreshBeanFactory()

        1.1 判断当前是否存在beanFactory 存在则销毁所有bean,关闭bean工厂;

        1.2 然后创建一个新的beanFactory并设置容器ID等信息 createBeanFactory()

        1.3 customizeBeanFactory() 用于子类扩展实现,可以对现有bean做个性化设置,allowBeanDefinitionOverriding 是否允许注册一个同名类来覆盖原有的类;allowCircularReferences 是否多个类之间循环引用

        1.4 loadBeanDefinitions()  加载bean定义 BeanDefinition 、BeanDefinitionReader(读取配置文件信息) 把bean定义后保存在context中(beanDefinitionReader读取配置文件、beanDefinition加载bean信息-> beanDefinitionMap中)

         2. getBeanFactory() 得到bean工厂

        1.2.2.1. refreshBeanFactory()

        1.2.2.1.1. createBeanFactory()

        1.2.2.1.2. customizeBeanFactory()

        1.2.2.1.3. loadBeanDefinitions()

                beanDefinition加载入口

        1.2.2.1.3.1. XmlBeanDefinitionReader

                解析Xml配置文件

        1.2.2.1.3.2. loadBeanDefinitions()

                解析XML文件入口

        1.2.2.2. getBeanFactory()

1.2.3. prepareBeanFactory()

        使用beanFactory之前对beanFactory准备(设置一些信息:类加载器、解析器、自动装配等等)

1.2.4. postProcessBeanFactory()

         beanFactory准备工作完成后进行的后置处理,可以在创建bean之前修改bean的定义属性  在bean配置文件加载后,bean实例化之前执行。只为容器的某些特定子类提供特殊的post时间处理器。null方法,可自行实现

        作用是在BeanFactory准备工作完成后做一些定制化的处理,一般结合BeanPostProcessor接口的实现类一起使用,注入一些重要资源(类似Application的属性和ServletContext的属性)

1.2.5. invokeBeanFactoryPostProcessors()

        实例化和调用所有已注册BeanFactoryPostProcessor的bean  ,如果给定了明确的顺序则按顺序执行。ps:必须在单例实例化之前调用。

        BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。

        BeanDefinitionRegistryPostProcessor 继承自 BeanFactoryPostProcessor,比 BeanFactoryPostProcessor 具有更高的优先级,主要用来在常规的 BeanFactoryPostProcessor 检测开始之前注册其他 bean 定义。特别是,你可以通过 BeanDefinitionRegistryPostProcessor 来注册一些常规的 BeanFactoryPostProcessor,因为此时所有常规的 BeanFactoryPostProcessor 都还没开始被处理。 

1.2.6. registerBeanPostProcessors()

        注册beanPostProcessor(bean的后置处理器)在bean创建前后执行

        invokeBeanFactoryPostProcessors 方法主要用于处理 BeanFactoryPostProcessor 接口,

        registerBeanPostProcessors 方法主要用于处理 BeanPostProcessor 接口。

        BeanFactoryPostProcessor 是针对 BeanFactory 的扩展,主要用在 bean 实例化之前,读取 bean 的定义,并可以修改它。

        BeanPostProcessor 是针对 bean 的扩展,主要用在 bean 实例化之后,执行初始化方法前后,允许开发者对 bean 实例进行修改。

1.2.7. initMessageSource()

        初始化信息源:初始化MessageSource组件(做国际化功能;消息绑定,消息解析)

1.2.8. initApplicationEventMulticaster()

        初始化容器事件传播器(事件派发)

1.2.9. onRefresh()

        调用子类的某些特殊bean的初始化:

        模板方法,可以重写该方法以添加特定于上下文的刷新工作。

         在初始化特殊bean时,在实例化单例对象之前调用。

         子类重写这个方法,在容器刷新的时候可以自定义逻辑;如创建Tomcat,Jetty等WEB服务器

1.2.10. registerListeners()

        为事件传播器注册事件监听器

1.2.11  *finishBeanFactoryInitialization()

        初始化所有剩下的非懒加载的单例bean

        1.初始化上下文的转换服务  bean工厂的类型转化器(判断是否有bdName为conversionService的bd(实现ConversionService接口),有的话注册为格式转换器服务类)

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

        2.EmbeddedValueResolver可以用来读取配置文件内容

if (!beanFactory.hasEmbeddedValueResolver()) {

   beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));

}

        3.获取LoadTimeWeaverAware类型的bd,提前实例化

String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);

for (String weaverAwareName : weaverAwareNames) {

   getBean(weaverAwareName);

}

        4. 冻结所有bean定义,到了这一步注册的bean定义将不被修改/任何进一步的处理

@Override

public void freezeConfiguration() {

   this.configurationFrozen = true;

   this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);

}

        5.实例化所有的非懒加载的单例bean

        1.2.11.1. freezeConfiguration()

                冻结上下文,不允许在修改配置

        1.2.11.2. *preInstantiateSingletons()

                实例化所有非懒加载的bean

                1. getBean()  获取bean

                 2. doGetBean()  实际获取bean的执行方法

                        尝试从缓存中获取bean,获取不到则createBean()

                3.createBean()  创建bean

                4.doCreateBean()  实际创建bean的方法

1.2.12. finishRefresh()

        完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)

1.2.13. destroyBeans()

        销毁已创建的bean

1.2.14. cancelRefresh()

        取消prepareRefresh()阶段的刷新操作,将活跃状态等信息重置

1.2.15. resetCommonCaches()

        重设公共缓存

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值