Spring——IOC容器部分核心接口
创始人
2024-02-05 23:51:16
0

Spring——IOC容器部分核心接口

  • 一、简介
  • 二、IOC容器核心接口
    • 1.BeanDefinition
    • 2.BeanDefinitionReader
    • 3.BeanDefinitionRegistry
    • 4.BeanFactory
    • 5.ApplicationContext
    • 6.BeanPostProcessor
    • 7.BeanFactoryPostProcessor
    • 8.BeanDefinitionRegistryPostProcessor
    • 9.总结

一、简介

以下接口都是在Spring生成Bean对象的过程中扮演着非常重要的角色,为什么要挑出来说?
因为Spring的IOC容器涉及到的东西非常多,而在这些东西里面我们最关注就是Bean的生成过程,Bean是怎么被扫描的? 扫描后放在哪里?在生成过程中会发生什么?所以我们需要全局的先了解一下一些核心的角色,形成一个大概的结构化思维,这对之后理解Bean生成过程的帮助会非常的大,同时Spring中类的命名是非常规范的,所以在阅读源码的时候看一下后缀,可能就知道大概是做什么的了

二、IOC容器核心接口

1.BeanDefinition

BeanDefinition 描述了一个Bean的实例,它记录了Bean的相关信息,并且可以设置以及获取Bean的内容,例如:Bean类名,Bean的作用域,Bean是否懒加载,,初始化方法名称,销毁方法名称,是否单例,是否原型,Bean属性值等等,直至根据BeanDefinition 生成Bean,可以说在Bean的管理中起到至关重要的作用

在这里插入图片描述

2.BeanDefinitionReader

看名称顾名思义是用来读取Bean的信息生成BeanDefinition 的信息并注册:

  • XmlBeanDefinitionReader: 用来解析Xml读取信息生成BeanDefinition并注册
  • AnnotatedBeanDefinitionReader: 读取注解生成BeanDefinition并注册
  • ClassPathBeanDefinitionScanner: 扫描类路径生成BeanDefinition并注册

这里的注册要分清楚不是注册Bean,可以理解为保存BeanDefination提供给后续的Bean生成使用

在这里插入图片描述

3.BeanDefinitionRegistry

看名称是BeanDefinition注册的接口,主要是对BeanDefinition做一个管理操作,例如注册、移除、获取等,实现了AliasRegistry,即还可以对Bean的别名进行管理

在这里插入图片描述

DefaultListableBeanFactory即是一个Bean的工厂同时也可以完成BeanDefination注册,这个是一个很重要的角色

4.BeanFactory

Bean工厂的根接口,提供了对Bean的基本操作,其实现类根据其特点基本实现了对Bean的各种操作;

以DefaultListableBeanFactory来看,基本上DefaultListableBeanFactory实现了工厂以及注册两大块类容,可以看出DefaultListableBeanFactory是多么重要的角色

在这里插入图片描述

从BeanFactory来看:

  • HierarchicalBeanFactory: 层次结构的BeanFactory提供两个方法getParentBeanFactory获取当前BeanFactory的父工厂,containsLocalBean当前BeanFactory是否包含指定名称的bean
  • ListableBeanFactory: 可罗列的BeanFactory,这里的可罗列意味着此BeanFactory提供类似于 Map getBeansOfType(@Nullable Class type)这种获取满足条件的一系列bean的功能
  • AutowireCapableBeanFactory: 具备自动装备功能的BeanFactory,提供了createBean实例化,属性填充,回调生命周期的创建bean,autowire自动装配bean,initializeBean 回调相关初始化方法,等方法
  • ConfigurableBeanFactory : 可配置的BeanFactory,提供了setParentBeanFactory ,setBeanClassLoader,addBeanPostProcessor等配置bean工厂的方法
  • ConfigurableListableBeanFactory: 实现了ListableBeanFactory ,AutowireCapableBeanFactory ,ConfigurableBeanFactory,具备其他三者的功能的同时,还提供了ignoreDependencyType 忽略给定依赖类型的自动装配,registerResolvableDependency 注册指定类型的依赖使用指定的对象进行注入等功能

5.ApplicationContext

在这里插入图片描述

这个可以说是Spring容器的启动入口了,总体来说也是一个BeanFactory,但其包含了更多的其他功能,实现了更多的扩展:

  • EnvironmentCapable: 提供获取Environment的能力
  • ResourceLoader: 用于加载资源(例如类路径或文件系统资源)的策略接口,根据路径获取资源包装成Resource
  • ResourcePatternResolver: ResourceLoader的子接口,提供根据路径匹配获取资源的能力
  • ApplicationEventPublisher : 事件发送接口
  • MessageSource: 用于解析消息的策略接口,用于实现国际化

两个重要的实现类:

  • AnnotationConfigApplicationContext: 基于注解包路径扫描的容器上下文,通过注解扫描来完成BeanDefinition的注册
  • ClassPathXmlApplicationContext: 基于类路径下xml文件的Spring应用程序上下文,通过解析类路径下的xml来完成BeanDefinition的注册

6.BeanPostProcessor

Bean后置处理器(重中之重!!!),内部有两个方法:

  • postProcessBeforeInitialization: Bean初始化前调用
  • postProcessAfterInitialization: Bean初始化后调用

源代码如下:

public interface BeanPostProcessor {@Nullabledefault Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}@Nullabledefault Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean;}
}

另一个实现了它的拓展接口InstantiationAwareBeanPostProcessor内部新增了4个方法:

  • postProcessBeforeInstantiation:Bean实例化前调用
  • postProcessAfterInstantiation:Bean实例化后调用
  • postProcessPropertiesBean属性注入的时候调用
  • postProcessPropertyValuesBean属性注入的时候调用

源代码如下:

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {@Nullabledefault Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException {return null;}default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {return true;}@Nullabledefault PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {return null;}/** @deprecated */@Deprecated@Nullabledefault PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {return pvs;}
}

列举两个与我们平时息息相关的BeanPostProcessor:

  • AutowiredAnnotationBeanPostProcessor: 对@Autowired注解标识的做属性注入(此注解原理),还有其他注解例如: @Value,@Lookup,@Inject
  • CommonAnnoatationBeanProcessor: 与上面那个一样,但主要处理@Resource注解

这两个接口全是Bean的扩展点,在Bean的生命周期中发挥着至关重要的作用,所以这两个接口中的6个方法请记住,非常重要

7.BeanFactoryPostProcessor

源代码如下:

@FunctionalInterface
public interface BeanFactoryPostProcessor {void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
}

名称跟上面那位大哥很像,这个也是后置处理器,但是是BeanFactory的后置处理器,对BeanFactory相关信息可以做一些修改

使用目的:在BeanFactory标准初始化之后调用,用来定制和修改BeanFactory内的内容;

8.BeanDefinitionRegistryPostProcessor

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry var1) throws BeansException;
}

继承了上面那位大哥,同样会在BeanFactory之后调用,但是内部多了个对BeanDefination处理的方法,该方法可以对BeanFactory中的BeanDefination做一次后置的统一处理,该方法执行顺序在postProcessBeanFactory之前

比如@Configuration注解的原理就是通过实现BeanDefinitionRegistryPostProcessor接口,然后扫描并生成BeanDefination并注册的,具体的实现类是ConfigurationClassPostProcessor

9.总结

上面的一些核心接口是不是都看懵逼了,不需要记得特别清楚,只需要知道个大概就行了:

解析Xml配置或者扫描注解生成BeanDefination加入到BeanFactory,BeanDefinitionRegistryPostProcessor对加入到BeanFactory的BeanDefination可以做增删改查操作,BeanFactoryPostProcessor可以对BeanFactory后置修改操作,然后会把BeanPostProcessor注册到BeanFactory中,最后根据BeanDefination生成Bean,在生成过程中BeanPostProcessor会起到作用

重点:分清楚BeanDefination和Bean的区别,理解几个后置处理器的生效位置

上面几个核心大概的执行顺序如下:

在这里插入图片描述

上一篇: 立秋时节的谚语

下一篇:React - Jsx 概述

相关内容

热门资讯

春季开学小学班主任的简短寄语   2017年春季期又快开始了,下面是应届毕业生小编为大家分享有关春季开学小学班主任的寄语,希望可以...
蜡笔小新的经典语录盘点 蜡笔小新的经典语录盘点  1、老师:“小新,你怎么偷同学的橡皮擦?你做这种事,难道不为父母想一想吗?...
情人节感言 情人节感言集合15篇  在日常学习、工作和生活中,我们有时会因某件事或某个人而产生新的想法,这时往往...
经典新春寄语 经典新春寄语15篇  在平平淡淡的学习、工作、生活中,要用到寄语的地方还是很多的,通过寄语人们可以心...
话毕业寄语 一句话毕业寄语  毕业,是一坛陈酿多年的美酒, 将所有历历在目的往事, 化为扑鼻的醇香,一句话毕业寄...
祭英烈寄语   缅怀先烈,立德立志,复兴中华,奉献青春。以下是CN人才网小编整理的2017年祭英烈寄语,欢迎阅读...
高一班主任评语 高一班主任评语高一班主任评语赵倩同学:撒下一路笑声,好象从未体验过忧愁,你的快乐感染了与你一起生活的...
幼儿园新生寄语 幼儿园新生寄语亲爱的家长朋友、可爱的小朋友们:  你们好!  首先祝贺你成为×&time...
大学生请假条 大学生请假条范本(精选5篇)  无论是身处学校还是步入社会,我们使用到请假条的地方非常多,请假条的语...
经典的高中教师一句话寄语   放飞你的心灵,播撒你的希望  走过高考,前面是一片新天地  自信是你成功的基石,沉着是你飞翔的翅...
激励性寄语 激励性寄语  1、告别三闲,静专思学,立大志,成大业!!  2、我与时间比速度,我与对手比高度!  ...
立冬寄语 立冬寄语30句精选  立冬节气到了,我用手机编织一件毛衣送给你,袖子是我的问候,衣襟是我的祝福,领子...
初中语文复习计划 初中语文复习计划  初中语文复习计划(一)  一、梳理课本,使本学期所学习的语文知识系统化。  二、...
七夕广告语 七夕广告语  七夕广告语  1、我们为您准备浪漫,您准备好了吗?  2、她那甜甜的笑,来自你一束鲜花...
余秀华经典语录大全   余秀华,1976年生于湖北省钟祥市石牌镇横店村,诗人。下面是小编为大家整理收集的关于余秀华的经典...
带手机的检讨书 带手机的检讨书范文800字(通用12篇)  在学习、工作或生活中出现了失误后,为了防止此类事情再度出...
哲理人生句子 哲理人生句子推荐  爱父母,因为他们给了你生命,同时也是爱你爱的最无私的人。  爱家人,爱朋友,爱伴...
幼儿园的开学寄语 关于幼儿园的开学寄语  无论在学习、工作或是生活中,大家或多或少都会用到过寄语吧,借助寄语人们可以寄...
领导对员工评语 领导对员工评语(精选50句)  员工的表现,领导都看在眼里。所以评语是不可少的一环。下面是小编收集的...
毕业班教师寄语 毕业班教师寄语  班主任就是这个向导.班主任工作是一门科学也是一门艺术.一位优秀的教育工作者必须有较...