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

手写简易 Spring(二)

文章目录

  • 手写简易 Spring(二)
  • 1. 扩展 BeanFactory 接口
  • 2. 实现资源加载器,从 Spring.xml 解析和注册 Bean 对象
    • 1. 核心实现类 XmlBeanDefinitionReader
  • 3. 实现应用上下文,自动识别、资源加载、扩展机制
    • 1. 应用上下文
    • 2. 核心实现类 ClassPathXmlApplicationContext
    • 3. Bean 实例化前后修改与扩展
  • 4. 我的代码结构
    • 1. 整体设计结构
    • 2. 我的调用类图(模拟 Spring 源码)
    • 3. 我的代码结构(模拟 Spring 源码)

手写简易 Spring(二)

1. 扩展 BeanFactory 接口

  • 接口 ConfigurableListableBeanFactory:提供分析和修改 Bean 对象以及预先实例化的操作接口

    • 接口 ListableBeanFactory:扩展 BeanFactory 的接口,提供了所有的 Bean 对象基本信息的方法
    • 接口 ConfigurableBeanFactory:注册与获取 BeanPostProcessor、BeanClassLoader 等的一个配置化接口
      • 接口 HierarchicalBeanFactory:扩展了 BeanFactory,提供了父容器访问功能的方法
    • 接口 AutowireCapableBeanFactory:扩展了 BeanFactory,提供了自动装配、前、后处理器等接口,可以使用这个接口集成其它框架
  • 我的代码类图

在这里插入图片描述

2. 实现资源加载器,从 Spring.xml 解析和注册 Bean 对象

1. 核心实现类 XmlBeanDefinitionReader

  • 核心实现类 XmlBeanDefinitionReader:解析 XML 文件、获取 Bean 配置以及配置中的 id、name、class、value、ref,设置属性与注册 BeanDefinition

    • 接口 BeanDefinitionReader:BeanDefinition 读取接口,定义:getRegistry()、getResourceLoader(),与三个加载 BeanDefinition 的方法
  • 实现类 DefaultResourceLoader:资源加载器实现类,通过策略模式:外部传入地址即可获取对应 Resource,而不用管具体那种流文件

    • 接口 ResourceLoader:资源加载器接口
  • 接口 Resource:处理资源加载流,提供获取 InputStream 流的方法,也可看做 classPath、FileSystem、URL 三种方式获取流的适配器

    • 实现类 FileSystemResource:FileSystem 流文件获取数据
    • 实现类 ClassPathResource:ClassPath 流文件获取数据
    • 实现类 UrlResource:Url 流文件获取数据
  • 我的代码类图

在这里插入图片描述

3. 实现应用上下文,自动识别、资源加载、扩展机制

1. 应用上下文

  • 应用上下文的一系列的流程
    • 加载 XML
    • 注册 BeanDefinition
    • 修改定义(BeanFactoryPostProcessor)
    • 实例化
    • 属性填充
    • 初始化与扩展初始化(BeanPostProcessor)

2. 核心实现类 ClassPathXmlApplicationContext

  • 接口 ApplicationContext:继承了 ListableBeanFactory 接口,即扩展了 BeanFactory 的功能,是一个核心接口
  • 接口 ConfigurableApplicationContext:继承了 ApplicationContext 接口,定义了核心方法 refresh 方法、用于刷新容器
  • 抽象类 AbstractApplicationContext:实现了 refresh、invokeBeanFactoryPostProcessors、registerBeanPostProcessors 方法,定义了 refreshBeanFactory、getBeanFactory 方法
    • 继承了 DefaultResourceLoader 类:子类可用于加载 XML 文件
    • 实现了 ConfigurableApplicationContext 接口:实现 refresh 方法
      • 创建 BeanFactory,加载 BeanDefinition
      • 获取 BeanFactory
      • 执行 BeanFactoryPostProcessor,此时为 Bean 初始化之前
      • 注册 BeanPostProcessor,此时为 Bean 初始化之前
      • 提前实例化单例 Bean 对象
  • 抽象类 AbstractRefreshableApplicationContext:继承了 AbstractApplicationContext 类,创建与获取 DefaultListableBeanFactory、实现 refreshBeanFactory 方法,定义 loadBeanDefinitions 方法
  • 抽象类 AbstractXMLApplicationContext:继承了 AbstractRefreshableApplicationContext 类,实现了 loadBeanDefinitions 方法,定义了 getConfigLocations 方法
  • 核心实现类 ClassPathXmlApplicationContext:继承了 AbstractXMLApplicationContext 类,实现了 getConfigLocations 方法
    • 具体对外提供应用上下文的核心类
  • 核心抽象类 AbstractAutowireCapableBeanFactory:增加实现 AutowireCapableBeanFactory 接口,实现了 initializeBean 接口
    • initializeBean 接口:执行 BeanPostProcessor 前置处理器方法、执行 invokeInitMethods 方法,执行 BeanPostProcessor 后置处理器方法、返回覆盖 Bean 对象
  • 核心实现类 DefaultListableBeanFactory:增加实现了 ConfigurableListableBeanFactory 接口,实现了 getBeansOfType、preInstantiateSingletons 方法
    • 核心实现类 AbstractBeanFactory:增加实现了 ConfigurableBeanFactory 接口,实现了 addBeanPostProcessor 方法

3. Bean 实例化前后修改与扩展

  • BeanFactoryPostProcessor 接口:BeanDefinition 注册后、初始化之前的操作,可以修改 BeanDefinition 的信息
  • BeanPostProcessor 接口:每个 Bean 初始化前后均可操作,可以扩展 Bean 功能甚至替换 Bean 对象,与 AOP 有紧密联系

4. 我的代码结构

1. 整体设计结构

在这里插入图片描述

2. 我的调用类图(模拟 Spring 源码)

在这里插入图片描述

3. 我的代码结构(模拟 Spring 源码)

.
├── beans
│   ├── BeansException.java
│   ├── PropertyValue.java
│   ├── PropertyValues.java
│   └── factory
│       ├── BeanFactory.java
│       ├── HierarchicalBeanFactory.java
│       ├── ListableBeanFactory.java
│       ├── config
│       │   ├── AutowireCapableBeanFactory.java
│       │   ├── BeanDefinition.java
│       │   ├── BeanFactoryPostProcessor.java
│       │   ├── BeanPostProcessor.java
│       │   ├── BeanReference.java
│       │   ├── ConfigurableBeanFactory.java
│       │   ├── ConfigurableListableBeanFactory.java
│       │   └── SingletonBeanRegistry.java
│       ├── support
│       │   ├── AbstractAutowireCapableBeanFactory.java
│       │   ├── AbstractBeanDefinitionReader.java
│       │   ├── AbstractBeanFactory.java
│       │   ├── BeanDefinitionReader.java
│       │   ├── BeanDefinitionRegistry.java
│       │   ├── CglibSubclassingInstantiationStrategy.java
│       │   ├── DefaultListableBeanFactory.java
│       │   ├── DefaultSingletonBeanRegistry.java
│       │   ├── InstantiationStrategy.java
│       │   └── SimpleInstantiationStrategy.java
│       └── xml
│           └── XmlBeanDefinitionReader.java
├── context
│   ├── ApplicationContext.java
│   ├── ConfigurableApplicationContext.java
│   └── support
│       ├── AbstractApplicationContext.java
│       ├── AbstractRefreshableApplicationContext.java
│       ├── AbstractXMLApplicationContext.java
│       └── ClassPathXmlApplicationContext.java
├── core
│   └── io
│       ├── ClassPathResource.java
│       ├── DefaultResourceLoader.java
│       ├── FileSystemResource.java
│       ├── Resource.java
│       ├── ResourceLoader.java
│       └── UrlResource.java
└── utils├── ClassUtils.java└── StringUtils.java
.
├── ApiTest.java
├── bean
│   ├── UserController.java
│   ├── UserDao.java
│   └── UserService.java
└── common├── MyBean1FactoryPostProcessor.java├── MyBean1PostProcessor.java├── MyBean2FactoryPostProcessor.java└── MyBean2PostProcessor.java

相关文章:

手写简易 Spring(二)

文章目录手写简易 Spring(二)1. 扩展 BeanFactory 接口2. 实现资源加载器,从 Spring.xml 解析和注册 Bean 对象1. 核心实现类 XmlBeanDefinitionReader3. 实现应用上下文,自动识别、资源加载、扩展机制1. 应用上下文2. 核心实现类…...

排列问题DFS入门

1、题目描述(全排列) 输入一个正整数n,输出1~n的全排列。 输入格式 一个正整数n。 输出格式 所有1~n的全排列,每个排列占一行。 样例输入 3 样例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 算法思路 题目要求输出n的全…...

【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举

统计只差一个字符的子串数目【LC1638】 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换 一个不同字符 以后,是 t 串的子串。换言之,请你找到 s 和 t 串中 恰好 只有一个字符不同的子字符串对的数目。 比…...

【07 Metadata and VendorTag】

1. Metadata结构及分类 一个 metadata 通过tag,value及 type 来描述。不同的 metadata 分成三类 controls,dynamic 及 static 2. MTK Metadata IMetadata Mtk metadata containerIMetadataConverter Provide mutual conversion for Android camera_metadata and MTK Imetada…...

Golang中Model的使用

导语我们都知道在Golang中我们一般都是设置GOPATH目录,这个目录主要存放我们的第三方包,这个方式一直不是很方便,今天给大家介绍Go 1.11版本中推出的GoModul使用方法,学过java的同学,可能对maven包有所了解&#xff0c…...

交友项目【基础环境搭建】

目录 1:交友项目架构介绍 1.1:前后端分离的概述 1.2:YAPI介绍(虚拟机中已经配好) 基本信息 使用 安装跨域拓展(浏览器上安装跨域处理插件) 2:虚拟机工具项目搭建 2.1&#xff1…...

入职时,公司要求自己带电脑,每月给100元补贴,如果不接受就不能入职!

为了节约成本,公司能做出什么事?一位网友遇到了这样的事:入职时,公司要求自己带电脑,每个月给100元补贴,如果不接受就得放弃入职,这样的公司有没有坑?有人问:连基本的公司…...

20道经典Redis面试题

20道经典Redis面试题 前言 整理了20道经典Redis面试题,希望对大家有帮助。 1. 什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用A…...

十分钟带你看懂接口测试,2023最全超大型接口测试攻略

一、什么是接口测试? 所谓接口,是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试,则是通过接口的不同情况下的输入,去对比输出,看看是否满足接口规范所规定的功能、…...

【设计模式】创建型-单例模式

文章目录一、单例模式二、单例模式的八种实现方式2.1、饿汉式(静态常量)2.2、饿汉式(静态代码块)2.3、懒汉式(线程不安全)2.4、懒汉式(线程安全,同步方法)2.5、双重检查2…...

Python 练习 六

1、(最大数的出现)编写程序读取整数,找出它们中的最大值,然后计算它的出现次数。假设输入以数字0结束。假设你输入的是“352555 0";程序找出的最大数是5,而5的出现次数是4。(提示:维护两个变量max和 count。变量max存储的是当前最大数,而…...

「SQL面试题库」 No_22 员工奖金

🍅 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试&#xff0…...

瞒不住了,Prefetch 就是一个大谎言

本文正在参加「金石计划」 Prefetch 是一个谎言 我们知道,现在的应用程序已经发展到可以拆分为多个 JavaScript包了,为了获得更好的用户体验,这些 bundle 包通常需要预获取,即 prefetch! 但是现在的prefetch 效果有多糟糕我想你…...

这个时候了,你还不会不知道JavaMail API吧

一、概述 1.1 简述 JavaMail API 顾名思义,提供给开发者处理电子邮件相关的编程接口,它是Sun发布的用来处理email的API,其提供独立于平台且与协议无关的框架来构建邮件和消息传递应用。JavaMail API 提供了一组抽象类,用于定义组…...

JavaScript var let区别

文章目录JavaScript var & let区别变量作用域变量提升变量重复声明全局对象属性for循环中的作用域JavaScript var & let区别 var和let都是用来声明变量的关键字。 变量作用域 var声明的变量作用域是函数作用域或全局作用域,而let声明的变量作用域是块级作…...

Thinkphp 6.0容器和依赖注入

本节课我们来学习一下依赖注入的用法,以及容器的用法。 一.依赖注入 1. 手册对依赖注入比较严谨的说明,具体如下: 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作 方法中一旦对参…...

Type javax.servlet.http.HttpServletRequest not present

运行环境 Swagger 3.0.0、springboot 3.0.0 产生原因&#xff1a; Swagger 3.0.0不支持spring3.0.0 两个解决方案&#xff1a; 1.降低springboot版本为2.x 2.放弃Swagger&#xff0c;使用 springdoc-openapi-starter-webmvc-ui 第二种解决方案&#xff1a; <dependen…...

一键配置Ubuntu的OpenHarmony基础编译环境

一键配置Ubuntu的OpenHarmony基础编译环境 一、配置前说明 该更新源仅适用于Ubuntu以下系列 Ubuntu18.04 Ubuntu20.04 Ubuntu22.04 强烈推荐Ubuntu20.04&#xff0c;本人使用的一直都是Ubuntu20.04 wsl的配置参见 如果使用的window wsl安装&#xff0c;则关于wsl配置可参考&a…...

ASP网络求职招聘系统的设计与实现

本文主要介绍了ASP&#xff0c;数据库等相关知识&#xff0c;同时较为详尽的阐述了网络求职招聘系统的实现。本系统是使用基于HTML语言&#xff0c;嵌套JavaScript源代码的ASP编程技术来开发&#xff0c;并以IIS为服务平台实现网络求职招聘系统的构建。后台数据库选用的是ACCES…...

面试—C++《智能指针》常考点

目录 1.为什么需要智能指针 2. 内存泄漏 2.1 什么是内存泄漏&#xff0c;内存泄漏的危害 2.2 内存泄漏分类 2.3 如何检测内存泄漏 2.4如何避免内存泄漏 3.智能指针的使用及原理 3.3 std::auto_ptr 3.4 std::unique_ptr 3.5 std::shared_ptr 1.为什么需要智能指针 下…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...