Spring Framework系统架构

核心容器的学习

IOC/DI

IOC容器

IOC

        使用对象时,由主动new产生的对象转换为由外部提供对象,此过程中对象的创建的控制权交由外部,此思想称为控制反转,   (实现了自己new的解耦)  对象创建的控制权

Spring提供一个容器,称为IOC容器 用来充当IOC思想的外部

Bean

IOC容器负责对象创建,初始化,等一系列的操作,被创建或被管理的对象在IOC容器中统称为Bean

DI

在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

核心概念  :

充分解耦   使用IOC管理bean  使用DI依赖注入进行绑定

最终效果  :使用对象时不仅可以从IOC中直接获取,并且获取到的Bean已经绑定了所有的依赖关系

 IOC入门

管理什么---------------service与dao

如何将被管理的对象告知IOC容器  -------------配置

被管理的对象交由IOC容器,如何获取到IOC容器-----------接口

如何从容器中获取bean-----------接口方法

使用Spring获取到----------pom.xml

DI入门

 如何将Dao对象进入到Service中 (提供set方法)

Servic与Dao的关系如何描述  (配置)

bean配置

单例模式,(默认)  多例

为什么用单例?  scope  si    

不适合的给容器管理的bean封装实体的域对象

name可以配置多个名字

bean的实例化

实例化的三中的方式

1使用构造方法

调用的是无参的构造方法 构造方法的不管是公共的还是私有的都能调用,反射

技巧:   Spring的报错观察最下面

2-----静态工厂的实例化   

工厂的创建对象的方法是静态的  直接写到里面

配置上class = factory 然后后面添加工厂的方法的

为什么不直接new对象         原因可以在工厂中对 对象的功能的增强

3实例工厂初始化bean 

工厂的创建bean的方法是非静态的 所以先要创建工厂对象,然后通过工厂对象创建bean

  为什么创建一个无用的工厂bean累赘

改良---------  使用FactoryBean实例化         <实用>

Bean的声明周期

从创建到销毁的整个过程

初始化容器,

创建对象

执行构造方法

执行属性注入set操作

执行bean的初始化方法

使用bean

执行业务操作

关闭销毁容器

执行bean的销毁

依赖注入的方式-----DI

 注入的类型  ------------基本类型,引用类型

自动装配

       IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程叫做自动装配

自动装配的方式

1 按照类型

2 按照名称

3 构造方法注入

4 不启动自动装配

在service要想自动装配dao要使用setter方法,然以配置中使用bytype

按照类型匹配必须要求类型唯一

按照名称装配   id和set方法后面的一致   要求名称必须一致   变量名与配置耦合,不推荐

自动装配用于引用类型的操作,不用于简单类型的进行操作,

自动装配的优先级低于setter方法和构造方法注入,同时出现会失效

数据源对象管理   第三方bean的管理

对象交由我们管理,将对应的属性提供过去,(set方法注入)


容器

1 ,加载类路径下的配置文件 -------------获取容器

2, 获取bean  

BeanFactory接口最顶层的接口  最早期的容器接口

beanFactory的操作

两者的区别

beanfactory加载是延迟加载     application初始化的bean是立即加载的

注解

 bean的作用范围  bean生命周期

单例加@scope    prototype      Singleton

bean的声明周期

初始化方法:-----(在构造方法之后运行) 在方法上加@PostConstruct

bean销毁之前------@PreDestroy

bean销毁之前的操作记得  关闭容器和关闭钩子才能运行

 依赖注入----------自动装配       

引用类型

 @Autowired         

原理按照类型装配  

若是有多个相同类型的bean使用@Qualifier指定名称   (需要依赖@Aut  一起用)

 注意:自动装配基于反射设计创建对象并暴力反射对应的私有属性初始化的数据,因此无需提供setter方法

自动装配记得提供无参的构造方法,(不提供造不出对象)

简单类型

@Value

加载外部的prop文件  配置的文件加载到bean中使用

1 写配置文件

2 配置文件上加注解   propertySource(文件地址)  ----------不支持通配符*

3 使用

第三方bean的管理 

@Bean 添加这个表示方法的返回值是bean

 返回值就是所需要的bean

不建议直接 写入Springconfig中

新创建一个Config类然后导入SpringConfig配置中

 如果配置类中缺少东西  如简单类型   引用类型

简单类型

Springconfig 配置文件上写   propertySource加载这个简单类型的数据文件地址 然后在用的地方直接@value

引用类型

假定需要使用dao     给个类型,Spring直接给你

原理自动装配   在容器中给你找这个bean给你自动装配进去  (按照类型装配)

注解和xml配置比较

注意  :  bean定义完在再文件中,注解Component需要我们识别出来,扫描bean的包

Spring整合Mybatis

运行类

配置类

 核心对象SqlSessionFactory  

mybatis管理的就是sqsessionFactory对象

第三方bean的管理   

记得Springconfig 导入该配置

 创建sqlsessionFacoryBean

 AOP

面向切面编程

不惊动原始设计的基础上为其进行功能的增强

无侵入式/无入侵式    编程

红色的是业务代码

将蓝色的代码抽取出来,  

连接点 原始方法

切入点 实际追加功能的方法

通知  共性的功能

切面  通知这个共性的功能与切入点之间的关系     (在哪个切入点上执行那些通知)

连接点是所有方法,切入点是匹配某些方法,有了切入点有了通知将他们一绑定叫做切面

切面描述的就是共性功能与执行位置之间的关系

入门案例

 

 

 AOP的工作流程

        如果切入点和要造bean的那个类匹配上对应的方法,那么就造代理对象否则就是原始对象

        工作本质:代理模式

 Aop切入点表达式

描述切入点方法的表达式

execution执行到指定的切入点 

 


 通知类型

前置通知      @Before

        设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行

后置通知        @After

        设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法后运行

环绕通知

        设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前后运行

         通过proceedingjoinpoint来调用原始方法,如果没有调用原始方法,就会对原始方法进行一个隔离的操作   比如说权限验证的操作,如果 没有权限,就不会调用原始方法,

返回后通知  @AfterReturning

        设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法正常执行完毕后运行      (方法没有抛出异常才能通知)

抛出异常后通知   @AfterThrowing

注意,这个仅仅是方法出异常之后才能执行,不出异常不执行.

案例:测量业务层接口万次执行效率

 这样就可以得到每个方法的执行时间,进行改良

主要是通过proceedingjoinpoint获取到该方法的签名信息,然后获取到该方法的接口名,和方法名

就可以描述出来当前测得是谁

注意只是一个理论值

AOP通知获取数据

获取参数

获取返回值

获取异常信息

        分析:是不是所有的通知都能拿到这三个,但是返回值和异常信息不一定

获取参数   

        可以解决的问题,比如说前端传过来一个对象,但是我要的是字符串,那么aop获取到参数,检测到不是字符串,那么就传递一个默认的参数,这样就保证了程序的健壮性.

返回值的获取

             afertreturning  和 around

        案例百度网盘密码数据兼容处理

        通过proceedingjoinpoint的getAregs获取到业务层代码的参数,然后获取到,密码的String,然后通过trim去掉密码的空格,然后返回到给业务层,然后继续实现业务层代码.         

如果有许多大量的重复的功能在项目中加载,那么aop是不二选择,简化共性开发

 Aop的总结

    ​​​​​​

 

其中环绕通知可以模拟出其他所有的通知

只在调用方法前做事情-------前置通知

用trycatch在finally里面写的东西就是------后置通知

用trycach在try大括号结束之前原始方法调用之后的通知就是-------返回后通知

catch模拟--------抛出异常后通知

Spring的事务

  解释:可以在业务层开启的事务

事务作用:在数据层保障一系列的数据库操作同成功同失败

Spring事务的作用:   在业务层开启事务可以保证多个调用数据层的操作同成功或者失败

如何保证 :平台事务管理器接口   两个方法  回滚,提交

实现类使用jdbc的事务 

 

  案例转账:    转账整个事务中没有原子性,要么这个转账的事务全做要么全不做

         第一步在要加事物的接口上加上@Transaction  第二步设定平台事务管理器然后在配置中加上事务管理器,config中加上事务管理器的bean  创建事务的datasourceTransactionMananger事务管理器, 第三步  在Spring的配置文件中加上EnableTransactionManageMenagement告诉Spring你加上了Transaction这个事务管理器

当加上了事务的注解的业务层代码,出现了异常,要么都提交要么都不提交.

第一步

第二步 

第三部

 Spring事务角色

 

 将两个事务都加到Spring事务中

事务管理员    事务发起方,在Spring中通常指的是业务层开启事物的方法

事务协调员   加入事务方  在Spring中指的是数据层的方法,也可以是业务层方法

将多个事务打成一个事务

        mybatis中的sqlSessionFactory中的Datasource和我们的jdbc中的事务管理器中的sqlsessionFactory的datasource是同一个,所以Spring的事务管理才能生效进行统一进行管理

进行相同的数据源进行管理.

事务的相关配置(可以在注解上进行配置)

案例

 

日志事务和两个转账事务都继承一个事务,但是我们想要的是日志的事务不要加入这个事务的集中,自己开启一个全新事务 

事务的传播行为   事务协调员对事务管理员的所携带事务的处理态度    (右边对左边)

让事务的协调员有不同的事务特征

SpringMVC

简介;      是一种基于Java实现的mvc模型的轻量级的web框架

Springmvc进行表现层功能开发

 入门案例 

导入jar包

定义成bean 

 初始化配置类

 告诉tomcat容器加载配置

 流程分析

 

 

 Springboot

 

 

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

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

相关文章

ESP32:2.搭建UDP服务器

硬件&#xff1a;ESP32-Devkit-V4 MODEL:ESP32-32U 库&#xff1a;ESP-IDF v5.4.1 系统&#xff1a;windows中的虚拟机 ubuntu 22.04 实现STA&#xff0c;主动连接AP后&#xff0c;打印IP地址&#xff0c;获取IP后&#xff0c;创建socket&#xff0c;搭建UDP 服务器&#xff0…

【Linux】动静态库制作

&#x1f43c;故事背景假设今天你有一位舍友。你需要帮助他完成老师的作业。而他写的代码依赖两个文件&#xff08;mymath.h,mystdio.h&#xff09;。但是这两个文件的功能他不会写&#xff0c;他只会调用。他的调用代码:#include"mystdio.h" #include"mymath.h…

使用Database Navigator插件进行连接sqlite报错invalid or incomplete database

解决方案 &#xff0c;将这个db.sqlite3文件拷贝到盘的文件中 &#xff0c;修改文件夹名字&#xff0c;重新使用绝对路径访问 db.sqlite3&#xff0c;将路径名字的中文去掉 &#xff0c;不能有中文

【Linux】重生之从零开始学习运维之主从MGR高可用

MGR集群部署12、15、18主机环境准备ssh免密码登录\rm -rf .ssh/* ssh-keygen ssh-copy-id 127.1 scp -r .ssh 10.0.0.12:/root/ ssh root10.0.0.12还原基础环境systemctl stop mysqld \rm -rf /var/lib/mysql/* id mysqlvim /etc/my.cnf.d/mysql-server.cnf [mysqld] datadir/v…

如何在虚拟机(Linux)安装Qt5.15.2

1.进入到阿里的网站下载在线安装包 qt-official_releases-online_installers安装包下载_开源镜像站-阿里云 https://mirrors.aliyun.com/qt/official_releases/online_installers/?spma2c6h.13651104.d-5201.2.60ad4773ZZNPNm 2.下载完毕后&#xff0c;进入到下载地址&…

【运维进阶】DHCP服务配置和DNS域名解析

DHCP服务配置和DNS域名解析 DHCP 服务介绍 在大型网络中&#xff0c;系统静态分配IP地址面临问题&#xff1a; 确保不要同时在多个系统上使用同一个地址。部署新系统通常需要手动分配其IP地址。在云环境中&#xff0c;实例的网络是自动化配置的。 动态主机配置协议&#xff08;…

VisionPro MR环境下虚拟物体与现实的透明度混合

display.rgb (virtualcontent.rgb*1)(passthrough.rgb*(1 - vistualcontent.a) viirtualcontent预乘过a值了&#xff0c;跟透明度混合公式一致 人头检测挖孔不清晰问题&#xff0c;这个a值变成设备层动态检测人头的a值&#xff0c;当面前的渲染压力过大时&#xff0c;会导致…

css怪异模式(Quirks Mode)和标准模式(Standards Mode)最明显的区别

文章目录css怪异模式&#xff08;Quirks Mode&#xff09;和标准模式&#xff08;Standards Mode&#xff09;最明显的区别详细对比示例对比&#xff08;盒模型&#xff09;标准模式&#xff08;Standards Mode&#xff09;怪异模式&#xff08;Quirks Mode&#xff09;如何触发…

一种简单的3dnr去噪算法介绍

一段未经过插补的视频图像可以分解为若干帧&#xff0c;为了能正确地找到并去除图像帧中的噪声污染&#xff0c;由于视频图像各帧的连续性&#xff0c;在去噪的过程中就必须考虑帧图像的空间性和时间性&#xff0c;一个简单的例子&#xff0c;在去噪算法中就必须考虑&#xff0…

【数据结构初阶】--排序(四):归并排序

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

GaussDB 并行创建索引

1 背景当业务数据在单表存储达到一定的数量级时&#xff0c;此时对表创建索引是要花费时间的。GaussDB为了解决这个问题采用并行创建索引技术&#xff0c;以提高创建索引的效率。2 示例步骤1&#xff1a;根据实际情况调整maintenance_work_mem参数该大小。[Rubydtest1 ~]$ gsq…

LOOP Finance:一场 Web3 共和国中的金融制度实验

LOOP Finance 是建构于币安智能链&#xff08;BNB Chain&#xff09;上的定投型DEFI理财协议。 它以凯因斯经济学为启发&#xff0c;设计出一套长期、安全、稳定收益的全新DEFI玩法&#xff0c;兼顾稳健利息回报与DEFI高速成长的潜力。 通过生态机制&#xff0c;LOOP要求每位参…

【golang面试题】Golang递归函数完全指南:从入门到性能优化

引言&#xff1a;递归的本质与挑战 在Golang中&#xff0c;递归函数是一把锋利的双刃剑。它通过函数自身调用实现问题分解&#xff0c;让代码变得简洁优雅&#xff0c;但也容易因无限递归、栈溢出或性能问题让开发者陷入困境。本文将从基础到高级&#xff0c;全面解析Golang递归…

功能安全和网络安全的综合保障流程

摘要网络物理系统是控制机械部件的计算机化系统。这些系统必须既功能安全又网络安全。因此&#xff0c;已建立的功能安全与网络安全标准需求创建网络安全档案&#xff08;ACs&#xff09;&#xff0c;以论证系统是功能安全与网络安全的&#xff0c;即所有功能安全与网络安全目标…

数据科学首战:用机器学习预测世界杯冠军

数据科学首战&#xff1a;用机器学习预测世界杯冠军Scikit-learn实战&#xff1a;从数据清洗到冠军预测的完整指南一、足球预测&#xff1a;数据科学的终极挑战​​世界杯数据价值​​&#xff1a;历史比赛数据&#xff1a;44,000场球队特征指标&#xff1a;200球员数据点&…

一个php 连sqlserver 目标计算机积极拒绝,无法连接问题的解决

一个接口查询数据耗时15秒&#xff0c;还没数据&#xff0c;经查报错日志&#xff1a;SQLSTATE[08001]: [Microsoft][ODBC Driver 17 for SQL Server]TCP 提供程序: 由于目标计算机积极拒绝&#xff0c;无法连接。 命令行执行&#xff1a;netstat -ano | findstr :1433发现结…

生成网站sitemap.xml地图教程

要生成 sitemap.xml 文件&#xff0c;需要通过爬虫程序抓取网站的所有有效链接。以下是完整的解决方案&#xff1a; 步骤 1&#xff1a;安装必要的 Python 库 ounter(line pip install requests beautifulsoup4 lxml 步骤 2&#xff1a;创建 Python 爬虫脚本 (sitemap_genera…

idea拉取新项目第一次启动报内存溢出(java.lang.OutOfMemoryError: Java heap space)

背景&#xff1a; 新拉取一个项目后&#xff0c;第一次启动的时候报错内存溢出&#xff1a; Java 堆内存溢出 (java.lang.OutOfMemoryError: Java heap space) 这个错误表示你的 Java 应用程序需要的内存超过了 JVM 堆内存的分配上限。 解决方案 1.增加堆内存大小 启动应用时添…

安卓雷电模拟器安装frida调试

1.在模拟器中设置调试root和adb 2.在vscode中安装autox.js 3.在github上下载auto.js组件 新地址链接看来大佬的项目也经历了波折https://blog.csdn.net/weixin_41961749/article/details/145669531 github地址https://github.com/aiselp/AutoX/releases 将下载的apk放入雷电…

Godot ------ 初级人物血条制作02

Godot ------ 初级人物血条制作02引言正文血条动态显示引言 在 Godot ------ 初级人物血条制作01 一文中我们介绍了如何构建一个初级血条&#xff0c;但是我们并没有涉及如何动态显示血条。本文我们将介绍如何动态显示血条。 正文 血条动态显示 首先&#xff0c;我们为当前…