Spring知识容器启动

一级目录

二级目录

三级目录

基础:ioc与di,统一观念的不同角度描述

aop面向切面编程,就是在实现核心功能的时候,把重复的代码(周边功能)与核心功能交织在一起,实现整体功能

1.Spring的启动流程

什么是bean?
在这里插入图片描述

其实是ApplicationContext的构造函数

先调用this(),在this()中通过调用父类构造器初始化了BeanFactory,以及向容器中注册了7个后置处理器。然后调用register(),将构造方法的参数放入到BeanDefinitionMap中。最后执行refresh()方法,这是整个Spring容器启动的核心。

public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
    // 会初始化一个BeanFactory,为默认的DefaultListableBeanFactory
    // 会初始化一个beanDefinition的读取器,同时向容器中注册了7个spring的后置处理器(包括BeanPostProcessor和BeanFactoryPostProcessor)
    // 会初始化一个扫描器,后面似乎并没有用到这个扫描器,在refresh()中使用的是重新new的一个扫描器。
    this();
    // 将配置类注册进BeanDefinitionMap中
    register(annotatedClasses);
    refresh();
}
  1. BeanDefinition中会描述类的信息,例如:这个类是否是单例的,Bean的类型,是否是懒加载,依赖哪些类,自动装配的模型。Spring创建对象时,就是根据BeanDefinition中的信息来创建Bean
  2. BeanDefinitionMap(存放bean所对应的BeanDefinition)在 Spring容器(bean工厂的实现类DefaultListableBeanFactory)中的属性,其他属性包括:beanDefinitionNames是一个List集合,用来存放所有beannamesingletonObjects是一个Map,用来存放所有创建好的单例Bean
  3. Spring中有很多后置处理器,但最终可以分为两种,一种是BeanFactoryPostProcessor,一种是BeanPostProcessor。前者的用途是用来干预BeanFactory的创建过程,后者是用来干预Bean的创建过程。后置处理器的作用十分重要,bean的创建以及AOP`的实现全部依赖后置处理器。

https://zhuanlan.zhihu.com/p/82136894

this()

在这里插入图片描述

this方法先调用父类,新建一个DefaultListableBeanFactory,就是默认的工厂实现类。

走自己的方法了,

实例化了一个Bean读取器,并向BeanDefinitionMap中添加了7个元素。

有三个是重要的:

1.注册ConfigurationClassPostProcessor,这个类超级重要,它完成了对加了Configuration注解类的解析,@ComponentScan、@Import的解析。

2.注册AutowiredAnnotationBeanPostProcessor,这个bean的后置处理器用来处理@Autowired的注入

注册CommonAnnotationBeanPostProcessor,用来处理如@Resource,@PostConstruct等符合JSR-250规范的注解

通过new ClassPathBeanDefinitionScanner(this)实例化了一个扫描器(该扫描器在后面并没有用到)。

register(annotatedClasses)

将传入的配置类annotatedClasses解析成BeanDefinition(实际类型为AnnotatedGenericBeanDefinition),然后放入到BeanDefinitionMap中,这样后面在ConfigurationClassPostProcessor中能解析annotatedClasses,例如demo中的AppConfig类,只有解析了AppConfig类,才能知道Spring要扫描哪些包(因为在AppConfig类中添加了@ComponentScan注解),只有知道要扫描哪些包了,才能扫描出需要交给Spring管理的bean有哪些,这样才能利用Spring来创建bean

refresh()

核心,进行bean的实例化、初始化、自动装配、AOP等功能。

调用 invokeBeanFactoryPostProcessors()

该方法的作用是执行所有的BeanFactoryPostProcessor,由于Spring会内置一个BeanFactoryPostProcessor,即ConfigurationClassPostProcessor(如果开发人员不自定义,默认情况下只有这一个BeanFactoryPostProcessor),

后置处理器在处理时,会解析出所有交由Spring容器管理的Bean,将它们解析成BeanDefinition,然后放入到BeanFactoryBeanDefinitionMap中。

调用registerBeanPostProcessors(beanFactory);

该方法的作用是找到所有的BeanPostProcessor,然后将这些BeanPostProcessor实例化(会调用getBean()方法,getBean()方法的主要逻辑是,如果bean存在于BeanFactory中,则返回bean;如果不存在,则会去创建。在后面会仔细分析getBean()的执行逻辑)。将这些PostProcessor实例化后,最后放入到BeanFactorybeanPostProcessors属性中。

根据上一步得到的关于BeanFactoryPostProcessor的map,找到BeanPostProcessor实例化

通过ConfigurationClassPostProcessor类扫描出了所有交给Spring管理的类,并将class文件解析成对应的BeanDefinition

finishBeanFactoryInitialization()

完成了非懒加载的单例Bean的实例化和初始化操作,主要流程为getBean() ——>doGetBean()——>createBean()——>doCreateBean()。在bean的创建过程中,一共出现了8BeanPostProcessor的执行,在这些后置处理器的执行过程中,完成了AOP的实现、bean的自动装配、属性赋值等操作。

Bean生命周期

  • 从上面Spring的源码分析中,可以看出,启动过程中,bean的创建过程最为复杂,在创建过程中,前后一共出现了8次调用BeanPostPorcessor(实际上在bean的整个生命周期中,一共会出现9次调用后置处理器,第九次出现在bean的销毁阶段。)

  • 结合Spring的源码,单例bean的生命周期可以总结为如下一张图

在这里插入图片描述

总结

  • 本文介绍了Spring的启动流程,通过AnnotationConfigApplicationContext的有参构造方法入手,重点分析了this()方法和refresh()方法。在this()中初始化了一个BeanFactory,即DefaultListableBeanFactory;然后向容器中添加了7个内置的bean,其中就包括ConfigurationClassPostProcessor
  • refresh()方法中,又重点分析了invokeBeanFactoryPostProcessor()方法和finishBeanFactoryInitialization()方法。
  • invokeBeanFactoryPostProcessor()方法中,通过ConfigurationClassPostProcessor类扫描出了所有交给Spring管理的类,并将class文件解析成对应的BeanDefinition
  • finishBeanFactoryInitialization()方法中,完成了非懒加载的单例Bean的实例化和初始化操作,主要流程为getBean() ——>doGetBean()——>createBean()——>doCreateBean()。在bean的创建过程中,一共出现了8BeanPostProcessor的执行,在这些后置处理器的执行过程中,完成了AOP的实现、bean的自动装配、属性赋值等操作。
  • 最后通过一张流程图,总结了Spring中单例Bean的生命周期。

首先是applicationcontext的构造方法,走构造方法会先实例化一个默认的工厂,然后就会new扫描器和读取器,并且添加一些后置处理器,这些后置处理器有的的干预bean工厂的实力化,有的是干预bean的实例化。

接着会扫描配置文件,

再有这些的基础上就会调用refresh,他是比较复杂的

首先是invokebeanfactory——》配置文件中有说明的bean解析为beanDefinition,放入到一个beanDefinitionmap,这是一个存储bean和他的类加载信息的map

然后是finishBeanFactoryInitialization,实例化bean

补充:

如果是web端,就是有mvc架构参与的情况,Spring的执行流程,还有就是读取web.xml文件

调用一个监听器对象,创建一个ApplicationContext对象,这也就是ioc容器的全部,然后会创建一个默认的工厂。。。,

初始化完毕,放到了servletcontext中,也就是上下文环境中,以便获取

https://blog.csdn.net/moshenglv/article/details/53517343

Web 容器停止时候会执行 ContextLoaderLoaderListener 的 ContextDesroyed 方法销毁 Context 容器

​ 2.Spring Bean的注入方式

bean是什么?

Bean是存放于Spring IOC容器中的对象

spring框架有这ioc的核心功能,就是通过它容器里面的bean实现的

bean的初始化流程大致如下:

注册表==BeanDefinitionMap

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值