带你阅读spring容器源码创建过程

一.引言

    在java体系中,spring是一个非常出名的框架。它包含了很多东西,但是IOC容器是它的基本功能,这个不可不知。

二.spring容器加载方式

在spring中,主要有三种方式加载容器:

1.使用类路径加载配置文件

  ClassPathXmlApplicationContext("bean.xml")

2.使用文件系统加载配置文件

FileSystemXmlApplicationContext("/opt/bean.xml")

3.使用注解方式加载

AnnotationConfigApplicationContext(SpringConfig.class);

在实际的使用中,随着spring-boot的流行,注解方式使用的越来越普遍。

三.注解加载过程

AnnotationConfigApplicationContext(SpringConfig.class); 

代码断点跟进去

第一步: this()

创建给bean definition的解析器,其中里面会添加一个ConfigurationClassPostProcessor.class 后置处理器来加载系统配置.

第二步:register(annotatedClasses); 将该类注册到容器中

  1).需要判断该类是否有Primary.class,Lazy.class注解修饰

  2).添加bean的别名

第三步:refresh(); 创建容器

  1).prepareRefresh();刷新前的预处理

    ①.initPropertySources();留给子类来初始化一些环境属性变量

    ②.getEnvironment().validateRequiredProperties(); 验证环境属性变量

    ③.this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();

    创建早期的事件集合

  2). obtainFreshBeanFactory() 获取bean工厂

    ①.refreshBeanFactory(); 刷新bean工厂,添加序列化id

    ②.getBeanFactory() 获取bean工厂 new了一个 DefaultListableBeanFactory();

  3)prepareBeanFactory(beanFactory); 在beanFactory中预初始化一些值

    ①.设置bean的类加载器

    ②.设置bean表达式的解析器

    ③.设置系统预定义的后置处理器,,比如ApplicationContextAwareProcessor

    ④.忽略一些自动装配的接口,比如EnvironmentAware,EmbeddedValueResolverAware

    ⑤.注册一些可解析的依赖类,BeanFactory,ResourceLoader,ApplicationEventPublisher....

    ⑥.添加事件的侦测器ApplicationListenerDetector

    ⑦.侦测是否有织入,有的话还要添加LoadTimeWeaverAwareProcessor 后置处理器

     ⑧.注册默认的系统环境bean environment,systemProperties,systemEnvironment

  4).postProcessBeanFactory(beanFactory);

  在子类中重写该方法,可以自定义添加一些bean 的后置处理器,修改spring 容器上下文

  5)invokeBeanFactoryPostProcessors(beanFactory); 调用bean工厂的后置处理器

    ①.加载BeanFactoryPostProcessor

      1.找到实现了PriorityOrdered接口的后置处理器,排序,调用

      2.找到实现了Ordered接口的后置处理器,排序,调用

      3.找到没有实现上两个接口的后置处理器,调用

    ②.加载BeanDefinitionRegistryPostProcessor

      1.找到实现了PriorityOrdered接口的后置处理器,排序,调用

      2.找到实现了Ordered接口的后置处理器,排序,调用

      3.找到没有实现上两个接口的后置处理器,调用

    ③.调用余下beafactoryPostProcessor(后置处理器)

  6).registerBeanPostProcessors注册bean的后置处理器

    ①.找到实现了PriorityOrdered接口的后置处理器,排序,注册

    ②.找到实现了Ordered接口的后置处理器,排序,注册

    ③.找到常规后置处理器排序,注册

    ④.注册一些系统内部的后置处理器 (实现了MergedBeanDefinitionPostProcessor接口)

    ⑤.重新注册一下事件侦测器,将未添加的事件加入到容器中

  7).initMessageSource(); 资源国际化

  8).initApplicationEventMulticaster()初始容器的多播器

    如果不存在就添加一个SimpleApplicationEventMulticaster

  9).onRefresh(); 子类实现该接口可以刷新容器

  10).registerListeners(); 检查事件并注册他们

  11).finishBeanFactoryInitialization(beanFactory);实例化所有的单实例bean

    主要来看beanFactory.preInstantiateSingletons();方法

    ①.获取系统中定义的bean

    ②.判断是否不是虚类,是单例,不是懒加载

    ③.判断是否是工厂bean

    ④.获取bean(getBean)--> doGetBean

      1.从缓存中获取bean,bean创建成功后,都会放到缓存中,也就是一个Map,singletonObjects

      2.主要讲一下单实例bean的创建 createBean(beanName, mbd, args)-->doCreateBean

        <1>.createBeanInstance 实例化这个bean,此时该bean只是刚刚创建出来,只是有个地址引用。

        <2>.populateBean(beanName, mbd, instanceWrapper); 给bean复制

        <3>.initializeBean(beanName, exposedObject, mbd) 实例化bean

         【1】.invokeAwareMethods 调用aware方法,

              BeanNameAware,

             BeanClassLoaderAware,

             BeanFactoryAware

        【2】.applyBeanPostProcessorsBeforeInitialization 调用bean的前置处理器

        【3】.invokeInitMethods 调用实例方法

        【4】.applyBeanPostProcessorsAfterInitialization 调用后置处理器

       <4>bean 创建完成之后需要添加到缓存中

    ⑤.如果bean是SmartInitializingSingleton类型,还需要执行afterSingletonsInstantiated方法

  12).finishRefresh();完成刷新方法

     ①.initLifecycleProcessor(); 初始化生命周期的处理器

       如果没有默认创建一个DefaultLifecycleProcessor

    ②.getLifecycleProcessor().onRefresh(); 执行生命周期处理器的onRefresh()方法

    ③.publishEvent(new ContextRefreshedEvent(this)); 发布容器刷新完成事件

    ④.LiveBeansView.registerApplicationContext(this); 添加MBean

四.总结

1.创建beanfactory

2.添加beanPostProcessor(后置处理器)

3.实例化bean

4.添加监听器

五.附言

1.版本说明

 spring  4.3.12.RELEASE

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值