spring 没完没了

start

     轻量级开源的j2ee框架,容器框架 装javabean aop ioc

     定义一个starter的jar包,写一个configuration配置类,将bean定义其中,在starter包的meta-inf/spring.factories中写入配置类,springboot会按约定加载该配置类

ioc:重中之重

配置文件配置包扫描路径 获取class文件 反射确定需要ioc管理的类 对需要注入的类依赖注入

   定义一些注解,控制层  业务层 数据持久层 依赖注入注解 获取配置文件  

   获取指定路径下的文件信息及文件夹信息,class文件添加到set集合

   遍历集合 获取指定注解的类 交给ioc,安全的map存储对象

   遍历ioc容器 获取类实例 判断是否依赖其他类实例 递归注入

ioc容器实际map,存各种对象,反射创建对象放入map中

    代码需要用到里面的对象,通过类型/🆔(对象名)注入;没有对象伤不起

控制反转:需要对象时IOC主动创建/使用 对象

依赖注入:IOC容器运行期间 ,动态将某种依赖关系注入到对象中

加载

    spring框框干活,一干一个不吱声

ioc容器:读取配置信息 实例化 管理对象

bean定义:描述 配置要管理的对象,对象类名 属性 依赖关系

bean工厂:实例化 配置管理对象,读取bean定义 据定义创建 初始化bean对象 放入ioc容器

生命周期:尊重生命 热爱生活

上图 虽然一张图胜过千言万语 但是我画的也不是图 死板的流程图罢了

启动流程

作用域

单例singleton:每个容器一个bean实例,beanFactory维护 

prototype原型:每次请求都注入新的实例

request:http请求创建一个单例对象

session:每个session中有个bean实例

application:servletContext生命周期中复用单例对象

websocket:定义在websocket生命周期的

global全局

设计模式:低耦合两个字yyds

工厂beanFactory/factoryBean

适配器advisorAdapter

访问者propertyAccessor

装饰器beanWrapper

代理aop

观察者事件监听

策略instantiationStrategy

模板jdbcTemplate

委派beanDefinitionParseDefenate

责任链beanPostProcessor

aop:这块嘎嘎🦆厉害

CGLIB通过创建目标类的子类来代理原始对象,并在子类中添加增强处理

    代理类class文件加载 修改字节码生成子类 

jdk基于接口 proxy类 被代理对象注入到中间对象

中间对象实现invocationHandler接口(拦截器 反射 代理接口匿名类)

newProxyInstance利用中间对象来生产代理对象

事务:

数据库事务和aop机制

@Transactional注解bean创建代理对象作为bean

调用代理对象方法先判断方法上是否加了Transactional注解

   如果咱就说如果加了  利用事务管理器 创建数据库连接 autocommit=false

spring事务传播机制是spring自己实现的,基于数据库连接做的

    一个数据库连接一个事务,这句话挺重要的!新开一个事务 先建连接再执行sql

   事务创建/提交/回滚通过transactionInterceptor切面完成,据事务管理器和属性自动管理

platformTransactionManager实现

    dataSourceTransactionManager:jdbc和mybatis的

    jtaTransctionManager:分布式事务 xa接口 多资源事务管理

   spring事务核心 transactionDefinition定义属性(隔离级别/传播行为/超时/只读)和transactionStatus(是否新事物/是否标记为回滚)

失效

私有方法 / 未被spring管理 /方法用final修饰/方法内部调用/未开启事务

传播属性

propagation_required 当前则没有新建,有则加入,默认

propagationrequiresnew 当前存在挂起 新建事务(和挂起的无关) 内抛异常外层捕获可不处理

propagation_supports支持当前事务,无事务 非事务方式执行

propagation_mandatory支持当前事务 没有抛异常

propagationnotsupported以非事务方式操作 当前存在则挂起

propagation_never非事务方式执行,存在事务抛异常

propagation_nested活动事务存在 运行一个嵌套事务中,无required执行使用单独事务,使用独立事务,拥有多个回滚的保存点,内部事务的回滚不会对外部事务造成影响,只对datasourceTransactionManager事务管理器有效

循环依赖

三级缓存

lazy解决构造方法造成的循环依赖问题

一级缓存 初始化的单例对象 singletonObjects

二级earlySingletonObjects缓存保存new出来的不完整对象,当单例池中找不到依赖的属性时,先从二级缓存中获取不完整对象,完成对象创建,后续依赖注入中 单例池中对象引用关系调整完成

三级缓存singletonFactories,引用对象配置了aop,单例池中最终会需要注入动态代理对象(对象初始化之后才开始),非原对象,保存所有对象的动态代理配置信息,发现有循环依赖时 获取代理对象 提前aop

后置处理器

       beanFactory后置处理器BeanFactoryPostProcessor,spring启动先创建beanFactory实例 实例化所有bean后 依赖注入前,后置处理器加工beanFactory,spring扫描基于beanFactory实现

       bean后置处理器BeanPostProcessor,先实例对象,bean后置处理器对该对象加工,依赖注入给autowired自动赋值,aop基于原实例对象进行动态代理,生成代理对象

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

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

相关文章

用户留存【摘录】

留存,是一个产品或者说企业,能够持续存活和不断发展的立身之本。 例如企业级SaaS产品,通常采用按年为单位进行付费的订阅模式。如果产品没有留住用户的能力,用户便会在第二年取消订阅,这将使得企业之前的投入付之东流…

Ubuntu软件开发环境搭建

Ubuntu软件开发环境搭建 安装VMware Tools网络桥接更新软件源常用功能配置时间同步共享文件夹双向复制粘贴终端初始大小和字体设置安装必要的工具 常用指令 安装VMware Tools 点击虚拟机->安装VMware Tools… 打开终端,cd到/media/用户名/VMware Tools/下&#…

语音控制模块_雷龙发展

一 硬件原理 1,串口 uart串口控制模式,即异步传送收发器,通过其完成语音控制。 发送uart将来自cpu等控制设备的并行数据转换为串行形式,并将其串行发送到接收uart,接收uart然后将串行数据转换为接收数据接收设备的并行…

旅游系统-软件与环境

一. 软件 1.Navicat、phpstudy、Idea、Vsode 参考 网盘链接 二.配置文件 1.NodeJS、JDK、Mysql 参考 网盘链接 注意点: 1.Mysql 切记需要环境变量配置 2.数据库密码要好记点的,别乱设 3.环境变量配置的路径要能找到 三.安装运行 1.下载网盘内的软件&am…

Linux docker1--环境及docker安装

一、基础环境要求 Docker分为ce版本(免费,试用7个月)和ee版本(收费)。 最低配置要求:64位操作系统,centOS 7及以上,内核版本不低于3.10 二、部署docker 1、查看服务的基础环境是否满…

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

文章作者:ajun 随着文档处理需求的增加,格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性,将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件,提供了这样的转换功…

C语言数据结构与算法笔记(排序算法)

排序算法 基础排序 冒泡排序 核心为交换,通过不断进行交换,将大的元素一点一点往后移,每一轮最大的元素排到对应的位置上,形成有序。 设数组长度为N,过程为: 共进行N轮排序每一轮排序从数组的最左边开始&#xff0…

Django templates 存放html目录

模板 一概述 模板由两部分组成,一部分是HTML代码,一部分是逻辑控制代码(变量,标签,过滤器) 作用:可以通过一些逻辑控制代码减少一些重复的操作更快速的生成HTML代码,并且实现简单的…

基于Spring Boot的宿舍管理系统

摘 要 随着信息时代的来临,过去的传统管理方式缺点逐渐暴露,对过去的传统管理方式的缺点进行分析,采取计算机方式构建宿舍管理系统。本文通过课题背景、课题目的及意义相关技术,提出了一种楼宇信息、宿舍信息、宿舍安排、缺勤信息…

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式: 序列号:通过SYN传给接收端,当SYN为1,表示请求建立连接,且设置序列号初值,后面没法送一次数据,就累加数据大小,保证包有序。 确认应答号&#x…

Prometheus修改默认数据存储时间

Prometheus的默认数据存储时间可以通过修改启动脚本中的相关参数来调整。具体来说,可以通过修改--storage.tsdb.retention.time参数来改变数据保留的时长。该参数决定了何时删除旧数据,默认为15天。如果需要延长数据保留时间,可以将该参数的值…

【机器学习】函数

sigmoid函数 import matplotlib.pyplot as plt import numpy as npdef sigmoid(x):return 1/(1np.exp(-x))def plot_sigmoid():# param:起点,终点,间距x np.arange(-10, 10, 0.1) #起点,终点,间距y sigmoid(x)plt.plot(x, y)plt…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Rect)

矩形绘制组件。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Rect(value?: {width?: string | number,height?: string | number,radius?: string | number | Array<s…

Sentinel基础使用

1. 概念解释 限流&#xff1a;对并发访问进行限速。限流的一些行为&#xff1a; 1. 拒绝服务&#xff1a;将多余的请求直接拒绝掉2.服务降级&#xff1a;降级甚至关闭后台的某些服务3.特权请求&#xff1a;在多租户或者对用户进行分级时&#xff0c;考虑让特权用户进行访问4.延…

论文解析:V3D: Video Diffusion Models are Effective 3DGenerators

摘要&#xff1a; 自动三维生成最近引起了广泛关注。最近的方法大大加快了生成速度&#xff0c;但由于模型容量有限或三维数据&#xff0c;生成的物体通常不够精细。在视频扩散模型最新进展的推动下&#xff0c;我们引入了 V3D&#xff0c;利用预训练视频扩散模型的世界模拟能…

YOLOV5 部署:基于web网页的目标检测(本地、云端均可)

1、前言 YOLOV5推理的代码很复杂,大多数都是要通过命令行传入参数进行推理,不仅麻烦而且小白不便使用。 本章介绍的web推理,仅仅需要十几行代码就能实现本地推理,并且只需要更改单个参数就可以很方便的部署云端,外网也可以随时的使用 之前文章介绍了QT的可视化推理界面,…

Linux初识环境变量

&#x1f30e;环境变量【上】 文章目录&#xff1a; 环境变量 什么是环境变量 关于命令行参数 环境变量       简单了解       为什么需要环境变量       系统中其他环境变量 总结 前言&#xff1a; 环境变量是一种非常重要的概念&#xff0c;它们对于系统的…

TH-FBCQX2防爆气象站

TH-FBCQX2防爆气象站主要适用于易燃易爆、危险性高的场所。以下是其主要的适用领域&#xff1a; 石油与天然气行业&#xff1a;在石油和天然气的生产、储存和运输过程中&#xff0c;防爆气象站可以监测环境中的可燃气体浓度&#xff0c;并根据气象条件预测爆炸风险。同时&…

Machine Learning ---- Gradient Descent

目录 一、The concept of gradient&#xff1a; ① In a univariate function&#xff1a; ②In multivariate functions&#xff1a; 二、Introduction of gradient descent cases&#xff1a; 三、Gradient descent formula and its simple understanding: 四、Formula o…

【sql】深入理解 mysql的EXISTS 语法

相关文章&#xff1a; 【sql】深入理解 mysql的EXISTS 语法 【sql】初识 where EXISTS 1. 使用格式如下&#xff1a; select * from a where exists ( 任何子查询 ) 代码根据颜色分成两段&#xff0c;前面的是主查询&#xff0c;后面红色的是子查询&#xff0c;先主后子&…