首页 > 其他分享 >spring注解解析与configurationClassPostProcessor(1)

spring注解解析与configurationClassPostProcessor(1)

时间:2024-10-17 23:21:54浏览次数:9  
标签:spring ConfigurationClassPostProcessor configurationClassPostProcessor 注解 解析 方法 

上个章节讲解了spring启动时解析spring.xml的流程,本章主要解析对注解的解析;目前我们常用的是AnnotationConfigApplicationContext,其中MyApp就是启动类

ApplicationContext ctx = new AnnotationConfigApplicationContext(MyApp.class);

this()方法中可以看到reader为AnnotatedBeanDefinitionReader

点开AnnotatedBeanDefinitionReader中可以看到向beanFactory中注入了一些beanDefinition,如ConfigurationClassPostProcessor,AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,这些processor在后面都会有很大的作用。

然后再看下AnnotatedBeanDefinitionReader的属性BeanDefinitionRegistry,以及他的核心方法doRegisterBean方法,主要是根据传进来的beanClass解析为BeanDefinition,然后将beanDefinition注册到beanDefinitonRegistry中

然后再看ApplicationContext中的另外一个属性scanner为ClassPathBeanDefinitionScanner,这个对象主要是用来对包进行扫描,通过传进来的basePackages,也就是包的路径,能够将这个包下面的类解析为beanDefinition注入到beanDefinitionRegistry中,但是扫描的时候肯定是有一定的规则,而不是将所有的都扫描进来,点进去registerDefaultFilters,可以看到熟悉的componet注解,那么ClassPathBeanDefinitionScanner就是通过includeFilters中的filter进行类的过滤的,如果java类上面有componet就会扫描进来,当然includeFilters中可以自定义一些自己的注解。

看完了AnnotationConfigApplicationContext中这两个重要的属性,就会对它有了一定的了解,继续向下看,context通过自身的reader方法将MyApp.class注入到了beanDefinitionRegistry中,这个方法我们前面已经说明。可想而知接下来,就会对MyApp上的注解进行解析。在MyApp上故意加了很多注解,方便后续对每个注解的解析进行详解

最终会进入到spring的主流程refresh()方法,那么这一步invokeBeanFactoryPostProcessor就是执行所有的beanDefinitionRegistryPostprocessor,那么ConfigurationClassPostProcessor也是在这一步发挥了巨大作用。

在进入到这个方法之前,我们先梳理清楚BeanDefinitionRegistryPostProcessor(也就是BeanFactoryPostProcessor的子类)与beanPostProcessor的区别,其实看名字就知道前者是对BeanDefinition的处理,即将java类转换为BeanDefinition的时候起作用,而beanPostProcessor是在从BeanDefinition到bean,即实例化到初始化过程中起作用,不要搞混了。先看下本次要讲解的beanDefinitionRegistryPostProcessor接口定义,核心方法就是postProcessBeanDefinitionRegistry

写个demo,这个接口的关键是能够拿到BeanDefinitonRegistry,这个想必大家都不陌生,所有要加入到spring的对象,都会先解析为BeanDefinition注册到这个容器中,那么拿到这个对象就能获取到所有的BeanDefiniton,我们能在这个方法里面对BeanDefinition中做增删改查,甚至增强BeanDefinition;

那么下面还有个方法postProcessBeanFactory,在这个方法里面能够获取到beanFactory,那么也就是说我们能获取到容器所有的bean,不过这个方法用的比较少,但是后面对带有@Configuration的类中的@Bean方法中有特殊的作用,后面详细会讲解。

看到上面想必大家已经对BeanDefinitionRegistryPostProcessor已经有了大致的了解。

于是就进入到invokeBeanFactoryPostProcessors(beanFactory),这里是根据循环遍历beanDefiniton中去获取这个类型的类,然后再去执行postProcessBeanDefinitionRegistry方法。由于前面在初始化AnnotatedBeanDefinitionReader的时候将ConfigurationClassPostProcessor,AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor的beanDefinition注册到了容器中,而ConfigurationClassPostProcessor集成了BeanFactoryPostprocessor,另外两个继承了BeanPostProcessor,所以这里就查到了ConfigurationClassPostProcessor。

于是就来到了ConfigurationClassPostProcessor的核心处理逻辑,这个方法发挥了巨大的作用,支持了 @Configuration@ComponentScan@Import@ImportResource@PropertySource@Order 等注解,同时也对大家理解springboot的帮助很大,真正的可以做到0 xml 配置。

下一个章节将详细解说ConfigurationClassPostProcessor对类的处理流程。

标签:spring,ConfigurationClassPostProcessor,configurationClassPostProcessor,注解,解析,方法,
From: https://blog.csdn.net/qq_40228720/article/details/143029225

相关文章

  • Spring基础
    一、什么是Spring框架?Spring是一款开源的轻量级Java开发框架,旨在提高开发人员的开发效率以及系统的可维护性。我们一般说Spring框架指的都是SpringFramework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说Spring支持IoC(InversionofContr......
  • springboot+vue基于工程教育认证的计算机课程管理平台【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着工程教育认证在全球范围内的推广与实施,高等教育机构面临着提升教育质量、确保学生能力培养与行业需求紧密对接的挑战。计算机课程作为工程教育的重要组成部分,其教学质量和效果直接影响到学生未来的职业发展。然而,传统的教学管理模......
  • springboot+vue基于Java的高校学生请假系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在信息化高速发展的今天,高校教育管理方式正逐步向智能化、便捷化转变。传统的学生请假流程,往往需要学生填写纸质申请表,经过辅导员、院系多级审批,过程繁琐且效率低下。此外,纸质记录也不利于信息的长期保存与查询,易导致信息丢失或管理混......
  • springboot+vue机械零件仓储管理系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着制造业的快速发展,机械零件的种类和数量日益增多,对机械零件的仓储管理提出了更高要求。传统的仓储管理方式存在诸多不足,如人工记录易出错、库存信息更新不及时、查找零件效率低下等问题,这些问题不仅增加了企业的运营成本,还影响了生......
  • springboot+vue基于VUE电脑城摊位出租系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和电子商务的普及,传统电脑城的管理方式正面临着前所未有的挑战与机遇。传统的摊位出租流程繁琐、效率低下,且信息透明度不足,导致出租方与承租方之间的信息不对称,影响了市场的公平性和效率。为了应对这些挑战,开发......
  • springmv的过滤器和拦截器的区别是什么
    一个请求进来的时候,先交给web服务器提供的过滤器,例如springboot项目,提供的服务器也就是内置的tomcat,过滤器处理完成以后,然后会来到servlet,有一个dispatcherServlet会调用拦截器,再由dispatcherServlet分发给对应的Controller,处理完请求后,会原路返回,再回到拦截器,再回到过滤器,最终响......
  • 基于SpringBoot+Vue的协力服装厂服装生产管理系统设计与实现毕设(文档+源码)
    目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的协力服装厂服装生产管理系统,项目源码请点击文章末尾联系我哦~目前有各类成品毕设J......
  • 基于SpringBoot+Vue的高校教师电子名片管理系统设计与实现毕设(文档+源码)
            目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的高校教师电子名片管理系统,项目源码请点击文章末尾联系我哦~目前......
  • SpringBoot健康检查机制讲解与实现
    目录前言什么是SpringBoot健康检查如何实现SpringBoot健康检查通过官方模块SpringBootActuator什么是SpringBootActuator快速入门SpringBootActuator引入依赖添加.yml文件配置运行项目访问健康检查地址重要端点解析/health端点注意/loggers端点/info......
  • [Spring]——IOC,DI,Bean的生命周期
    目录一.反转(转移)控制(IOC)二.DI依赖注入三.bean的生命周期1.对象的生命周期2.为什么要学习生命周期3.生命周期的三个阶段(1)创建(2)初始化方法两种实现方法细节问题(3)销毁(资源释放的操作)两种实现方法(和初始化的差不多)细节分析4.对象生命周期的总结完整代码5.后置处......