当前位置: 首页 > news >正文

实现自己的IOC容器——Winter(三)Spring原生ApplicationContext机制梳理

在继续实现WinterApplicaitonContext之前梳理一下Spring原生容器的机制。主要是注解驱动容器AnnotationConfigApplicationContext。一、整体流程AC是完全体的容器注解驱动的AC完全体是AnnotationConfigApplicationContext。这个ACAC有4种构造方法可以传入多个配置类、scan的包名或者什么都不传。无论是哪种方式它们都需要先创建一个BeanFactory这是Bean管理的核心。它用的就是BF的完全体DefaultListableBeanFactory。之后它还需要两个工具AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner。Reader可以解析配置类Scanner可以扫描目录将目录中的配置类转成BeanDefinition。当传入的是目录时Scanner可以扫描目录中配置类转成BeanDefinition并注册进容器。当创建AC传入的是配置类时Reader可以解析配置类转成BeanDefinition并注册进容器。这里传的配置类是必须要有ComponentScan注解的这样它就包含了Scanner的功能。包括后面Springboot启动的时候也是用的这种方式。注什么是配置类就是可以用容器管理的Bean就是Component、Service、Controller、Repository 等注解的类。1. 构造函数首先会调用父类的构造方法创建一个DefaultListableBeanFactory。其次前面说AC在构造的时候会设置两个工具Reader和Scanner这两个工具在构造的时候也会做一些准备工作。首先是Reader它会注册7个组件将它们的BeanDefinition放入容器值得关注的前3个一个BeanFactoryPostProcessor和两个BeanPostProcessor。ConfigurationClassPostProcessorBFPP。注解驱动核心用来解析 Configuration、ComponentScan、Import 等注解的核心引擎AutowiredAnnotationBeanPostProcessorBPP用于处理 Autowired、Value 注入CommonAnnotationBeanPostProcessorBPP用来处理 Resource、PostConstruct 等 JSR-250 注解EventListenerMethodProcessor处理 EventListener 事件监听。DefaultEventListenerFactory支持事件监听器的工厂。AnnotationAwareOrderComparator注解感知的排序器用于处理 Order。ContextAnnotationAutowireCandidateResolver增强 Qualifier 和注解依赖解析其次是Scanner它在构造方法中会设置includeFilters这个属性用于指定哪些注解标记的类会被扫描为Bean。一般是Component注解。Service、Controller、Resource、Configuration这些属于Componet的派生注解也会生效。ComponentScan这个是单独的注解2. 对配置类的解析register解析用的Reader的register方法。这个方法做了什么首先新建一个BeanDefinition然后将配置的class设置进去。再利用反射获取类上的所有注解类中的Bean这样的注解不会解析并放到BD的AnnotationMetadata中解析配置类上的Lazy、Primary、DependsOn、Role 和 Description如果有就将BD中的属性设置为true将这个配置类注册进容器解析之后就是将配置类的BD放进了容器接下来就要来填充ApplicaitonContext了也就是通过refresh方法。3. 刷新容器refreshrefresh方法的功能彻底开启AC容器的开关是Spring的一个核心方法它做了哪些事情具体流程就是下面的12个方法其中有一些不太重要的方法就不会分析了。prepareRefresh准备工作设置容器的启动时间、状态、事件集合obtainFreshBeanFactory如果是xml驱动这里会创建BeanFactory和解析加载Bean。注解驱动这里是空实现。注解驱动的准备工作在构造方法时就已经做了。prepareBeanFactory配置BeanFactory因为前面创建的BF是完全空的为了让它能够工作这里要设置一下。它做的事情比较杂。比如给BF配置一些工具比如类加载器、SpEL解析器、属性编辑器注册器添加一下BPP如ApplicationContextAwareProcessor、ApplicationListenerDetector事件相关等等。它还会把BeanFactory和ApplicaitonContext也注册进容器postProcessBeanFactoryBeanFactory的后处理默认空实现。拓展用的可以自己对配置好的BF再处理一下。invokeBeanFactoryPostProcessors在工厂创建好了之后用BFPP处理BeanDefinition处理之前会取出所有BFPP然后进行排序等等。最重要的就是ConfigurationClassPostProcessor也是注解驱动唯一一个BFPP。registerBeanPostProcessors这里会获取到前面注册过的BPP进行排序。其中重要的是AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor。initMessageSource国际化支持不关注initApplicationEventMulticaster初始化事件广播器不关注onRefresh初始化特殊的BeanSpring是空实现。Springboot会在这里创建Tomcat服务器并启动registerListeners注册事件监听不关注finishBeanFactoryInitialization完成BeanFactory初始化。会冻结所有的 BeanDefinition并创建所有需要管理的非懒加载的Bean。finishRefresh完成刷新。因为Bean已经完全创建好了会清理所有缓存发布事件表示容器创建成功等等。二、核心类BFPP和BPPBFPP其实就只有一个ConfigurationClassPostProcessor在前面的文章已经梳理过了。BPP主要是AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor。它们的功能类似只是处理的是不同的注解。前者用来处理Spring 自家的自动装配注解如Autowired、Value后者专门负责 Java 官方标准JSR-250定义的通用注解如Resource、PostConstruct、PreDestroy。后续继续分析。
http://www.zskr.cn/news/1383787.html

相关文章:

  • 微生物组学数据分析终极指南:用microeco快速完成专业分析
  • 基于SMD与贝壳的微型音频装置:从电路设计到嵌入式开发的完整实践
  • 基于状态变量滤波器的有源分频器设计:低成本高保真音频系统核心
  • ATtiny13A驱动LED沙漏计时器:从电路设计到软件实现的完整指南
  • 中国股票市场限价单成交概率与微观结构高频分析【附模型】
  • 钻机车机电液一体化系统性能优化关键技术【附程序】
  • 别再猜了!彻底搞懂Unity中Texture的sRGB选项:勾与不勾,对Alpha混合结果影响有多大?
  • 什么情况下会核销贷款
  • Ofd2Pdf:彻底解决OFD文档格式兼容性难题的专业工具
  • 当AI学会告白:骁龙在520,把科技写成人的温柔
  • 简单学习 --> SSE
  • CANN生产环境最佳实践——从实验室到量产的避坑指南(完整版)
  • 深入Linux内核:软件如何“冒充”硬件?揭秘fixed-link背后的虚拟MDIO总线设计
  • 告别书签混乱:3个步骤让你的浏览器收藏夹重获新生
  • Ubuntu 22.04 LTS下,腾达U9 USB网卡驱动安装保姆级教程(解决内核6.5+编译问题)
  • Java NIO.2 异步调度中枢:AsynchronousChannelGroup 源码深度剖析与线程池契约
  • Unity Timeline信号(Signal)系统实战:告别硬编码,实现灵活的事件驱动交互
  • 别再刷高并发概念了,这 5 个“复杂级”全栈垂直平台带你死磕底层业务
  • 如何快速突破原神60帧限制:面向PC玩家的完整帧率解锁指南
  • VideoDownloadHelper终极指南:三步掌握全网视频下载的完整教程
  • 网盘限速终结者:LinkSwift直链下载助手终极指南
  • 2026年杭州电商公司实力大比拼:哪家更值得信赖?
  • 告别旧版PlayerInput!UE5.1.1 EnhancedInput保姆级配置流程(从Action创建到C++绑定)
  • 律所案件管理系统选型:主流工具的功能、价格与适用场景对比
  • Unity Timeline信号(Signal)轨道实战:告别硬编码,实现灵活的事件驱动交互
  • 【华为OD机试真题 新系统】993、小学英语老师批改作文 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)
  • PentestGPT:Kali本地部署的AI渗透测试协作者
  • Adobe-GenP 3.0:轻松激活Adobe全家桶的完整指南
  • InVideo插件深度解析:如何在Unreal Engine中实现高效视频流播放与录制
  • Amphenol ICC DRPC21A005540线束解析