2024-Spring IOC 和 AOP源码分析(上篇)

**前言:**笔者最近面了几次大厂。。。开局Spring源码暴击 之前看过忘了写篇总结。。。

1、介绍一下Spring
在这里插入图片描述
核心组件:在这里插入图片描述

常用模块:
在这里插入图片描述

常用注解:
在这里插入图片描述
2、说一下SpringIOC原理

概念:Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化Bean 并建立 Bean 之间的依赖关系。Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。

IOC实现:Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的 Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系,为上层应用提供准备就绪的运行环境。其中 Bean 缓存池为 HashMap 实现。
在这里插入图片描述

I. BeanFactory-框架基础设施
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
在这里插入图片描述
步骤如下:
BeanDefinitionRegistry 注册表: Spring 配置文件中每一个节点元素在 Spring 容器里都通过一个 BeanDefinition 对象表示,它描述了 Bean 的配置信息。而 BeanDefinitionRegistry 接口提供了向容器手工注册BeanDefinition 对象的方法。

BeanFactory 顶层接口: 位于类结构树的顶端 ,它最主要的方法就是 getBean(String beanName),该方法从容器中返回特定名称的 Bean,BeanFactory 的功能通过其他的接口得到不断扩展。

ListableBeanFactory: 该接口定义了访问容器中 Bean 基本信息的若干方法,如查看 Bean 的个数、获取某一类型Bean 的配置名、查看容器中是否包括某一 Bean 等方法。

HierarchicalBeanFactory 父子级联:父子级联 IoC 容器的接口,子容器可以通过接口方法访问父容器; 通过HierarchicalBeanFactory 接口, Spring 的 IoC 容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的 Bean,但父容器不能访问子容器的 Bean。Spring 使用父子容器实现了很多功能,比如在 Spring MVC 中,展现层 Bean 位于一个子容器中,而业务层和持久层的 Bean 位于父容器中。这样,展现层 Bean 就可以引用业务层和持久层的 Bean,而业务层和持久层的 Bean 则看不到展现层的 Bean。

ConfigurableBeanFactory:是一个重要的接口,增强了 IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法。

AutowireCapableBeanFactory 自动装配:定义了将容器中的 Bean 按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法。

**SingletonBeanRegistry 运行期间注册单例 Bean:**定义了允许在运行期间向容器注册单实例 Bean 的方法;对于单实例( singleton)的 Bean
来说,BeanFactory 会缓存 Bean 实例,所以第二次使用 getBean() 获取 Bean 时将直接从IoC 容器的缓存中获取 Bean 实例。Spring 在DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用 HashMap 实现的缓存器,单实例的 Bean 以BeanName 为键保存在这个 HashMap 中。

依赖日志框架: 在初始化 BeanFactory 时,必须为其提供一种日志框架,比如使用 Log4J, 即在类路径下提供 Log4J 配置文件,这样启动 Spring 容器才不会报错。

II.ApplicationContext 面向开发应用
ApplicationContext 由 BeanFactory 派 生 而 来 , 提 供 了 更 多 面 向 实 际 应 用 的 功 能 。ApplicationContext 继承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,在此基础上,还通过多个其他的接口扩展了 BeanFactory 的功能:
在这里插入图片描述

  1. ClassPathXmlApplicationContext:默认从类路径加载配置文件

  2. FileSystemXmlApplicationContext:默认从文件系统中装载配置文件

  3. ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等。

  4. MessageSource:为应用提供国际化消息访问的功能;

  5. ResourcePatternResolver : 所 有 ApplicationContext 实现类都实现了类似于PathMatchingResourcePatternResolver 的功能,可以通过带前缀的 Ant 风格的资源文件路径装载 Spring 的配置文件。

  6. LifeCycle:该接口是 Spring 2.0 加入的,该接口提供了 start()和 stop()两个方法,主要用于控制异步处理过程。在具体使用时,该接口同时被 ApplicationContext 实现及具体Bean 实现,ApplicationContext 会将 start/stop 的信息传递给容器中所有实现了该接口的 Bean,以达到管理和控制 JMX、任务调度等目的。

  7. ConfigurableApplicationContext 扩展于 ApplicationContext,它新增加了两个主要的方法: refresh()和 close(),让 ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用 refresh()即可启动应用上下文,在已经启动的状态下,调用 refresh()则清除缓存并重新装载配置信息,而调用 close()则可关闭应用上下文。

III.WebApplication 体系架构
WebApplicationContext 是专门为 Web 应用准备的,它允许从相对于 Web 根目录的路 径中 装载配 置文件 完成 初始 化工作 。从 WebApplicationContext 中可 以获得ServletContext 的引用,整个 Web 应用上下文对象将作为属性放置到 ServletContext 中,以便 Web 应用环境可以访问 Spring 应用上下文。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux--Shell脚本安装 httpd 和 修改IP

shell脚本 关闭防火墙、安装httpd、启动httpd [rootnode11 ~]# mkdir shell[rootnode11 ~]# vim abc.sh #!/bin/bash#安装httpd服务#1、挂载 准备yum源 mount /dev/sr0 /mnt &> /dev/nulldf$(df -h | grep /dev/sr0 | awk {print $6})if [ "$df" "/mn…

Day61:WEB攻防-PHP反序列化原生类TIPSCVE绕过漏洞属性类型特征

知识点: 1、PHP-反序列化-属性类型&显示特征 2、PHP-反序列化-CVE绕过&字符串逃逸 3、PHP-反序列化-原生类生成&利用&配合 补充:如果在 PHP 类中没有实现某个魔术方法,那么该魔术方法在相应的情况下不会被自动触发。PHP 的魔…

Nacos学习笔记

Nacos官网 https://github.com/alibaba/nacos/releases https://www.bilibili.com/video/BV1q3411Z79z 1. Nacos介绍 Nacos是Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 在这个…

进销存管理完整方案:那些让人头疼的进销存难题及解决方法!

什么是进销存管理?为何进销存管理在企业管理中如此重要?进销存管理的核心模块包括哪些?为何企业在进销存管理中常常遭遇前后方协作不畅、数据不同步等痛点?又该如何针对进销存管理痛点进行优化?本文将从进销存管理的基…

python线性插值

假设有一个一维数组,但是此数组中只有部分位置上有值,其它位置数据缺失,现在想用线性插值的方法将其填充。 示例代码: import numpy as np# 假设你有一个长度为171的数组,名为full_data,其中有13个数据点…

matlab软件基础

第1讲 MATLAB初步 MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。MATLAB和Mathematica、Maple并称为三…

面试算法-51-翻转二叉树

题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {dfs(root);re…

电子科技大学链时代工作室招新题C语言部分---题号G

1. 题目 问题的第一段也是非常逆天,说实话,你编不出问题背景可以不编。 这道题的大概意思就是, Pia要去坐飞机,那么行李就有限重。这时Pia想到自己带了个硬盘,众所周知,硬盘上存储的数据就是0和1的二进制序…

elasticsearch安装部署

elasticsearch部署 安装elasticsearch1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1.部署2.2.DevTools 3.安装IK分词器3.1.在线安装ik插件(较慢)3.2.离线安装ik插件(推荐)3.3 扩展词词典3.4 停用词词典 4.部署es…

列表的常用操作

列表的常用操作(方法) 列表除了可以: 定义使用下标索引获取值 此外列表也提供一些列功能:插入元素删除元素清空元素修改元素统计元素个数 等等功能,这些功能我们都称之为:列表的方法 列表的查询功能&…

七:分布式

一、Nginx nginx安装 【1】安装pcre依赖 1.下载压缩包:wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz 2.解压压缩包:tar -xvf pcre-8.37.tar.gz 3.安装gcc:yum install gcc 4.安装gcc:yum ins…

Java的图书管理系统,确实有两把斧子 ! ! !

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

HCIE考证心得 | 在云校的学习收获颇多

我是来自深圳信息职业技术学院22级现代移动通信3-3班的冯同学,我在2023年12月12日通过了华为认证Cloud Service HCIE。在此,我将分享考证中的心得体会给大家。 备考的六点建议 一是要细心严谨,做实验时要全神贯注,明确实验要求…

基于python考试分析系统的设计和实现-flask-django-nodejs-php

随着电子技术的普及和快速发展,线上管理系统被广泛的使用,有很多商业机构都在实现电子信息化管理,图书推荐也不例外,由比较传统的人工管理转向了电子化、信息化、系统化的管理。   本文的重点是对考试分析系统展开了详细的描述&a…

填坑记5:安装imdb库失败 ERROR: No matching distribution found for imdb

收录于《填坑记》 一、问题 pip install imdb在网上查找原因,有以下几种可能: 库名拼写错误:首先确认你要安装的库名是否正确拼写。如果是想使用IMDb的数据,你可能在寻找的是 IMDbPY 这个库,而不是 imdb。库不存在&a…

软件开发项目管理/研发项目管理软件:国产EDA工具厂商行芯科技上线奥博思PowerProject项目管理软件平台

国内领先的EDA工具链提供商杭州行芯科技有限公司(以下简称:行芯科技)与北京奥博思软件技术有限公司达成战略合作,奥博思软件将基于PowerProject项目管理系统助力行芯科技实现研发项目的全生命周期管理,提升管理效能&am…

B010-springcloud alibaba 分布式事务 Seata

目录 分布式事务基础事务本地事务分布式事务分布式事务的场景 分布式事务解决方案全局事务/两阶段提交可靠消息服务最大努力通知TCC事务 Seata介绍Seata实现分布式事务控制案例基本代码修改order微服务OrderSeataControllerOrderServiceImpl5注释容错相关代码ProductClient 修改…

Avalon总线学习

Avalon总线学习 avalon总线可以分为: Avalon clock interface Avalon reset interface Avalon Memory mapped interface Avalon iterrupt interface Avalon streaming interface Avalon tri-state conduit interface Avalon conduit interface 1、Avalon c…

管道(acwing,蓝桥杯,二分)

题目描述: 有一根长度为 len 的横向的管道,该管道按照单位长度分为 len 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。 一开始管道是空的,位于 Li的阀门会在 Si 时刻打开,并不断让水流入管道。 对于位…