热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spring容器初始化过程、aop、IOC过程

使用classpathXmlApplicationContext的方式加载配置文件第一步:拿到xml配置文件第二步:①创建beanFactory②xml解析,包含bean、impo

使用classpathXmlApplicationContext的方式加载配置文件

第一步:拿到xml配置文件

第二步:①创建beanFactory②xml解析,包含bean、import,自定义标签

自定义标签解析流程:
a、根据当前解析标签的头信息找到对应的namespaceUri
b、加载spring所以jar中的spring.handlers文件。并建立映射关系
c、根据namespaceUri从映射关系中找到对应的实现了NamespaceHandler接口的类
d、调用类的init方法,init方法是注册了各种自定义标签的解析类
e、根据namespaceUri找到对应的解析类,然后调用paser方法完成标签解析

第三步:把解析出来的xml标签封装成BeanDefinition(beanDefintion是在Spring在实例化过程中,根据beandedination对象里面的属性信息来进行实例化bean的操作)对象如果是通过注解解析获取的BeanDefinition对象里面会有一个metadataReader对象,这个metadataReader包含了一个类的所有的基本信息,然后通过metadataReader对BeanDefinition的属性进行设值,如果项目支持IOC、aop、Autowired、@bean等注解,则需创建相应的BeanDefinitionRegistryPostProcessor(后置处理器)的beanDefintion

第四步:上面创建了sprint实例化工厂的所有的beanDefintion,这部开始就是实例化bean了,


  1. 首先实例化所有实现了BeanDefinitionRegistryPostProcessor接口的beanDefintion
  2. 把实现了BeanPostProcessor接口的类实例化

第五部:finishBeanFactoryInitialization()


  • 1、bean实例化过程
    • 1、factoryMethod方式
    • 2、有参构造方法方式(在实例化bean的过程中,会在class中找有没有Autowired注解,如果有,再次判断注解的属性是否为class类型,如果是,就触发这个对象的getBean操作)
    • 3、无参构造方法方式
    • 此步骤完成后,已经在堆空间分配内存,还不完整,不可用,没有进行依赖注入
  • 2、收集信息
    • CommonAnnotationBeanPostProcessor 支持了@PostConstruct,@PreDestroy,@Resource注解
    • 1、扫描类里面的属性或者方法
      * 2、判断属性或者方法上面是否有@PostConstruct @PreDestroy @Resource注解
      * 3、如果有注解的属性或者方法,包装成一个类InjectionMetadata

    • AutowiredAnnotationBeanPostProcessor 支持 @Autowired,@Value注解,包装成一个类InjectionMetadata
    • BeanPostProcessor接口的典型运用,这里要理解这个接口 //对类中注解的装配过程,对类进行依赖注入进行装配收集
  • 3、ioc 注解支持
    • a、依赖注入:对上个步骤收的InjectionMetadata信息进行操作,
      • 如果InjectionMetadata为属性,判断属性是否为class对象,如果是触发该对象的getBean操作,拿到实例化的value,反射赋值
      • 如果InjectionMetadata为方法,判断方法的属性是否为class对象,如果是触发该对象的getBean操作,拿到实例化的value,反射赋值
    • b、循环依赖:A、B两个对象互相有依赖注入,在A的实例化过程中,先进行构造方法初始化bean放进三级缓存后,进行IOC、di(populateBean()),发现有B的依赖注入,就触发了B的getBean操作,在B的实例化过程中,先进行构造方法初始化bean放进三级缓存后,进行IOC、di,发现有A的依赖注入,触发了A的getBean操作,这时从三级缓存中直接拿到了A的实例化对象,把A从三级缓存提升到二级缓存,返回,B的实例化完成,把B加入到一级缓存,并且从三级缓存中删除,这时回到了开始的A的实例化过程,拿到了B的实例化对象,A的实例化也完成。上述就是循环依赖的过程
  • wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

  • 4、BeanPostProcessor的执行
  • 5、实例化bean后对初始化方法的调用
  • 6、Aop的入口

 



推荐阅读
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 视频编码涉及多个关键参数,如比特率、帧率和采样率等。比特率(Bit Rate)是指单位时间内视频或音频文件的数据传输量,通常以千比特每秒(Kbps)为单位。这些参数对视频质量和文件大小有重要影响。帧率(Frame Rate)表示每秒钟显示的图像帧数,而采样率(Sample Rate)则指每秒从连续信号中提取并形成离散信号的次数。了解这些基础概念有助于更好地优化视频编码效果。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有