Spring 生命周期及源码分析

spring 体系初识

spring初识

在 Spring 中核心是 IOC(控制反转)「Inverse of Control」和 AOP(面向切面编程)「Aspect Oriented Programming」

  • IOC:不再由自己控制这个对象的创建,而是交由给 Spring 去控制这个内置对象的创建
  • DI(依赖注入)「Dependency Injection」:自身对象是通过注入的方式进行创建,DI 是 IOC 功能的具体实现,依赖注入可以通过 setter 方法注入(设值注入)、构造函数注入、接口注入三种方式实现,Spring 支持 setter 注入和构造注入,通常使用构造器来注入必须的依赖关系;对于支持可选的依赖关系,推荐使用 setter 注入方式是更好的选择,setter 注入需要类提供无参构造器或者无参的静态工厂方法来创建对象
  • AOP:通过预编译方式和运行期动态代理方式实现代码增强的一种技术

Bean 生命周期剖析

通过以下这张图流程图来了解 spring 整个生命周期

Bean生命周期

创建了 BeanFactory 工厂对象,是整个容器的根接口,也是入口;我们实际上使用的是它的子类「DefaultListableBeanFactory」具体的容器对象都是使用反射机制来获取到类实例的.

BeanFactory 和 ApplicationContext 区别?

BeanFactory:spring 容器的根/顶层接口,主要是为我们管理获取 bean 实例和 bean 创建
ApplicationContext:属于 BeanFactory 子接口,在原有功能基础上,为我们扩展了一些新的功能->国际化语言支持、资源加载工作、发布事件

Bean 可以通过不同的方式进行定义:xml、properties、yaml、json,对应的需要一些解析器能够对它们进行解析且转换成我们所能识别的 bean 对象,通过 BeanDefinitionReader 来进行读取将其转换为 BeanDefinition 对象,再通过反射的机制获取到 Bean 实例,最后进行一系列填充和增强类的操作

BeanFactoryPostProcessor「BFPP」:调用所有实现 BFPP 接口的类方法,在这里会做注解的解析工作,如:@Component、@ComponentScan、@Import,对应的解析类是 ConfigurationClassPostProcessor、其次还会在这里还会所有占位符的变量进行赋值操作,方便后续在类填充属性阶段可以直接取到所配置的值,对应的解析类是 PropertySourcesPlaceholderConfigurer

作好实例化前的准备工作以后,会经历以下 Bean 生命周期的几个过程,形成一个完整的对象

  • 实例化「createBeanInstance」:创建 bean 实例对象,通过反射调用构造函数获取.
  • 填充属性「populate」:实例化后的对象里面属性都是赋予的默认值,在此阶段会为其赋予初始值
  • 初始化阶段分为以下几个过程:
    • invokeAwareMethods:执行 aware 方法,设置相关的信息,普通 bean 都会执行三个 aware 接口->BeanNameAware、ClassLoaderAware、BeanFactoryAware
    • BPP#before「Spring 提供的扩展点」:执行实现 BeanPostProcessor 接口子类的前置方法,除了以上三个 aware 接口之外,其他的如果有实现对应的 aware 都是会在 ApplicationContextAwareProcessor 类中进行调用执行的
    • invokeInitMethods:如果该 bean 有实现 InitializingBean 接口,则会调用其实现的 afterPropertiesSet 方法;再者如果该 bean 有自定义的 initMethod 方法,有的话则通过反射调用执行
    • BPP#after:执行实现 BeanPostProcessor 接口子类的后置方法
    • 完成以上步骤以后,该 bean 加载工作就算完成了,可以通过 context.getBean() 进行调用了
  • 当 bean 使用完成以后,就要进行销毁工作了,也分为几步进行
    • 如果当前 BPP 集合,存在接口 DestructionAwareBeanPostProcessor,会挨个遍历调用其 postProcessBeforeDestruction 方法
    • 如果当前 bean 有实现 DisposableBean 接口,则会调用其实现的 destroy 方法;再者如果该 bean 有自定义的 destroy 方法,有的话通过反射进行调用

实例化和初始化区别

实例化初始化区别

FactoryBean 和 BeanFactory 区别

相同点:都是用来创建对象的

不同点:

  • BeanFactory:使用它创建对象必须遵循完整的创建过程,这个生命周期是由 spring 来管理的
  • FactoryBean:在创建实际的对象之前,实现 FactoryBean 接口的子类优先被创建后再调用 getObject 方法创建具体的对象,整个对象的创建过程是由用户自己来控制的,更加灵活

常用接口

  • BeanFactory:Spring 工厂的根接口、容器的入口
  • Aware:感知,一系列 Aware 接口,通过实现它可以获取 Spring 容器内指定的对象,来满足当前的程序需要「在公司里,在某一个对象构建程序逻辑时,需要用到其他对象,会使用一个工具类来实现 ApplicationContextAware」
  • BeanDefinitionReader:定义资源文件读取并转换为 BeanDefinition 的各个功能
  • BeanFactoryPostProcessor:后置处理增强器,允许自定义修改应用程序上下文的 BeanDefinition 信息
  • BeanPostProcessor:Bean 后置处理器接口,在依赖注入的初始化方法前后进行调用,用于增强 bean
  • Environment:当前程序允许的环境信息,一般程序上使用到的都是它的子类,标准环境对象「StandardEnviroment:获取环境源信息」、System.getProperties「JVM 系统环境属性」、System.getEnv「系统环境属性」
  • FactoryBean:顶级接口,下层有 isSingleton(是否是单例)、getObject(获取具体对象实例)、getObjectType(获取对象的类型) 方法.
更多技术文章可以查看: vnjohn 个人博客

猜你喜欢

转载自blog.csdn.net/vnjohn/article/details/125980483