【笔记】Spring是什么

news2025/2/1 16:43:15

什么是spring?

Spring的基础知识铺垫

IOC AOP<-Spring->容器->生态

先说你的认知,总-分结构
spring是一个基础的框架,同时提供了Bean的容器,用来方便装载具体的Bean对象,之前在使用对象的时候必须自己new,而现在只要告诉容器有哪些对象他会帮我们创建好,并且维护好整个的生命周期。我们在spring的基础上还有SpringBoot、SpringCloud都是在此基础上。
分:
1、什么是IOC?什么是AOP?
IOC表示控制反转,原来我们需要自己去创建对象,并且交由容器去管理控制对象,AOP表示面向切面编程,跟业务逻辑无关的代码能通过AOP来实现,比如说工作中的日志、事务管理都是通过AOP来实现的。也就是说具体的业务逻辑不变,扩展的时候通过AOP的声明通知、具体方法的前置后置Around等添加与业务无关的代码。
2、IOC、AOP如何实现?生命周期、循环依赖?

Spring加载注解和配置文件概述

1、Spring容器简介

Spring中有一个容器,容器中间有多个map对象
在这里插入图片描述

2、Spring加载注解和配置文件

spring源码的xml与注解转换成了BeanDefinition对象

在这里插入图片描述

3、在此中间考虑了扩展性,增加了接口 约束规范

BeanDefinitionReader,只要实现了这个接口就不限于xml、注解、还能增加properties等等去实现bean的定义信息
在这里插入图片描述
(题外话)抽象类与接口的区别
抽象是自下向上,接口是自上向下
在这里插入图片描述

4、spring的扩展接口-BeanFactoryPostProcessor

首先要从BeanDefiniton直接到创建Bean对象,首先想到的思路是反射。
反射
1、获取对象Class clazz=class.forName
2、获取构造器Constructor ctor=clazz.getDeclareConstructor()
3、创建对象
ctor.newInstance()
在这里插入图片描述
但是,理论上直接BeanDefiniton通过反射创建Bean对象,不就能解决问题了吗?别着急,上面图片中的xml文件的property属性中有若干占位符需要替换进去,需要解决这个问题,就不能直接用反射
当我们要创建BeanDefinition后,创建bean对象之前,需要替换jdbc.username这些参数,需要PostProcessor(增强器,提供某些额外的扩展功能)
在这里插入图片描述
上面说的针对的操作对象不同:
BeanFactory代表访问Spring Bean容器的根接口
Bean代表对象
在这里插入图片描述
postProcessor处理了占位符,比如刚刚说的jdbc.username,生成完整的BeanDefinition对象
由于BeanFactory是顶级接口,

5、Bean的生命周期

从对象的创建到销毁的过程,粗略来说就是Bean对象的创建、使用、销毁。
在这里插入图片描述

第一步,实例化在堆空间中申请空间,此时对象的属性值一般是默认值,反射创建对象的过程createBeanInstance
在这里插入图片描述
发现下面的三步,不就是反射的三步骤吗?获取class对象,获取构造器,newInstance。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二、三步,初始化(自定义属性赋值,populateBean)、容器对象属性赋值(Aware就是一个标志,实现接口,能在统一的方法进行处理,invokeAwareMethods)

Spring中的Bean对象按照使用者分为几类?
1.我们的自定义对象;

2.容器对象;(不是我们要用的,是容器在创建过程中要使用的对象),例如:BeanFactory、ApplicationContext、Environment;

在这里插入图片描述
理论上到此前三步搞定,对象的创建和属性的赋值都完成了,就做了new一个对象,然后set参数,对象能拿来使用了,但是注意spring要考虑扩展性。


第四步,postProcessor-做Bean对象的扩展实现
在这里插入图片描述

前置方法,什么都没有
在这里插入图片描述
后置方法,一路点下去
在这里插入图片描述

在这里插入图片描述

所以结论:AOP其实就是IoC整体流程(Bean生命周期)里的一个扩展点
第五步,InitializingBean——执行初始化方法
在这里插入图片描述
至此图上的7个步骤都处理结束,接着就能使用Bean对象


使用对象
context.getBean()

销毁Bean对象(不用)
在这里插入图片描述
我们开发用不到销毁容器的代码,所以不用管

默写图例

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录第三十八天(一刷C语言)|零钱兑换II组合总数和 IV

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、零钱兑换II 思路&#xff1a;参考carl文档 1、确定dp数组以及下标的含义&#xff1a;凑成总金额j的货币组合数为dp[j]。 2、确定递推公式&#xff1a;dp[j] 就是所有的dp[j - coins[i…

中国ESG的新故事:主动、常态与变革

ESG的终局不仅仅是与业务的结合&#xff0c;而是需要将ESG 融入企业价值内核&#xff0c;实现社会价值与商业价值的深度融合&#xff0c;即有意义地盈利。 作者|斗斗 编辑|皮爷 出品|产业家 “到这里来吧&#xff0c;我将帮你们获得这个世界。我的文明已无力解决自己的…

微服务之配置中心与服务跟踪

zookeeper 配置中心 实现的架构图如下所示&#xff0c;采取数据加载到内存方式解决高效获取的问题&#xff0c;借助 zookeeper 的节点监听机制来实现实时感知。 配置中心数据分类 事件调度&#xff08;kafka&#xff09; 消息服务和事件的统一调度&#xff0c;常用用 kafka …

pytorch张量的创建

张量的创建 张量&#xff08;Tensors&#xff09;类似于NumPy的ndarrays &#xff0c;但张量可以在GPU上进行计算。从本质上来说&#xff0c;PyTorch是一个处理张量的库。一个张量是一个数字、向量、矩阵或任何n维数组。 import torch import numpy torch.manual_seed(7) # 固…

linux系统和网络(二):进程和系统时间

本文主要探讨linux系统进程和系统相关知识&#xff0c;本博客其他博文对该文章的部分内容有详细介绍 main函数 int main(int argc,char *argv[],char *envp[]); 操作系统下main执行前先执行引导代码,编译连接引导代码和程序连接在一起构成可执行程序,加载器将程序加载到内存中…

react 2

1.快速搭建开发环境 2.react渲染流程 3.1 jsx基础 概念 3.2 jsx基础 本质 3.3 jsx基础 jsx表达式 3.4 jsx基础 实现列表渲染 3.5 jsx基础 实现条件渲染 3.5 jsx基础 实现复杂的条件渲染 4. react中事件绑定 5.react组建基础使用 6.1 useState 6.2 useState修改状态的规则 7.基础…

渗透测试和漏洞扫描有什么区别

渗透测试和漏洞扫描是网络安全领域中非常重要的两种技术手段&#xff0c;它们都可以帮助组织或企业发现和修复系统中的漏洞和弱点。然而&#xff0c;这两种技术手段在目的、深度、方法和时间和成本等方面存在显著的区别。 首先我们来了解下渗透测试和漏洞扫描分别是什么&#x…

测试开发体系介绍——测试体系介绍-L1

目录&#xff1a; 软件测试基础概念 软件测试:软件测试作用:软件缺陷:软件测试原则:软件测试对象:测试用例软件开发流程 软件:软件生命周期:软件开发流程:瀑布模型:瀑布模型优缺点敏捷开发模型: XP - 极限编程:SCRUM:DevOps&#xff1a;DevOps 生命周期&#xff1a;DevOps 对发…

C语言中关于操作符的理解

本篇文章只会列出大家在生活中经常使用的操作符 算术操作符 在算数操作符中常用的有&#xff0c;&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;% &#xff0c;我们重点讲一讲 / (除) 和 % (模) " / "运算 #include <stdio.h>int main() {int a5/2;fl…

【Amazon 实验③】使用Amazon WAF做基础 Web Service 防护之速率策略

文章目录 1. 速率策略1.1 介绍 2. 实验步骤2.1 添加规则2.2 测试2.3 结果 通过上一篇文章大家了解到如何使用Amazon WAF做关于自定义规则设置的 Web Service 防护【Amazon 实验②】使用Amazon WAF做基础 Web Service 防护之自定义规则&#xff0c;本篇文章将继续讲解一下关于速…

WebGL开发三维解剖学应用

开发基于 WebGL 的三维解剖学应用通常涉及以下步骤。这些步骤包括创建三维模型、整合交互性、优化性能等&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.三维模型创建&#xff1a; 首先&#xff0…

SpringBoot 使用Quartz执行定时任务对象时无法注入Bean问题

文章目录 问题描述解决方案结束语 大家好&#xff01;今天是2023年12月21日 | 农历十一月初九(距离2024年还有一周左右的时间)&#xff0c;最近还是比较忙的&#xff0c;忙着搞钱&#xff0c;毕竟马上过年啦&#xff01; 问题描述 感谢大家对我一直以来的支持与帮助&#xff0c…

7.串口通信uart编写思路及自定义协议

前言&#xff1a; 串口是很重要的&#xff0c;有许多模块通信接口就是串口&#xff0c;例如gps模块&#xff0c;蓝牙模块&#xff0c;wifi模块还有一些精度比较高的陀螺仪模块等等&#xff0c;所以学会了串口之后&#xff0c;这些听起来很牛批的模块都能够用起来了。此外&#…

Qt/QML编程学习之心得:在QML工程中添加库(十四)

实现库并且使用库&#xff0c;类似于vc中的静态库library、动态库dll、COM组件等方法一样&#xff0c;在Qt中也经常会使用库&#xff0c;或者将部分功能打包成库。 右击Qt项目&#xff0c;点击add library... 在linux中将.a文件导入&#xff0c;工程会自动在.pro温江中增加相应…

centos安装Jenkins并拉取git远程仓库的代码进行自动化构建部署

安装Jenkins并拉取git远程仓库的代码进行自动化构建部署 1 前置条件2 先安装jdk113 安装git4 安装maven5 安装jenkins5.1下载jenkins5.2启动jenkins 6 使用jenkins拉取git仓库代码并部署6.1 安装插件6.2 在jenkins中配置maven6.3在jenkins上构建maven项目6.4 配置拉取的git仓库…

成功案例分享:物业管理小程序如何助力打造智慧社区

随着科技的进步和互联网的普及&#xff0c;数字化转型已经渗透到各个行业&#xff0c;包括物业管理。借助小程序这一轻量级应用&#xff0c;物业管理可以实现线上线下服务的无缝对接&#xff0c;提升服务质量&#xff0c;优化用户体验。本文将详细介绍如何通过乔拓云网设计小程…

【vtkWidgetRepresentation】第十六期 vtkContourRepresentation(三)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkContourLineInterpolator接口的源码剖析和实例应用,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 …

csrf自动化检测调研

https://github.com/pillarjs/understanding-csrf/blob/master/README_zh.md CSRF 攻击者在钓鱼站点&#xff0c;可以通过创建一个AJAX按钮或者表单来针对你的网站创建一个请求&#xff1a; <form action"https://my.site.com/me/something-destructive" metho…

【Java基础】 一个空的Object对象到底占多少内存

对象头包括&#xff08;Markword、类元指针、数组长度&#xff09; 压缩指针ON&#xff1a;占用12字节&#xff0c;Markword占8字节、类元指针占4字节.但是为了避免伪共享问题&#xff0c;JVM会按照8字节的倍数填充&#xff0c;所以会在对其区填充4字节&#xff0c;变成16字节。…

PhysX——源码编译

从git下载源码 git主页 https://github.com/NVIDIA-Omniverse/PhysXclone地址 https://github.com/NVIDIA-Omniverse/PhysX.git源码编译 运行PhysX需要两个编译器的支持&#xff0c;CMake 3.12 或以上版本以及Python 2.7.6 版本 进入工程的 physx 目录&#xff0c;运行generate…