Spring框架学习

Spring:

(1)Bean线程安全问题

(2)AOP,事务原理,事务失败

(3)Bean的生命周期

(4)循环依赖

SpringMVC:

(1)执行流程

SpringBoot:

(1)自动装配原理

Mybatis:

(1)执行流程

(2)延迟加载

(3)一二级缓存

Spring框架概述

什么是Spring

Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供继承的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。Spring的核心是IOC(控制反转)和AOP(面向切面)。Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。

轻量级:对比EJB,以来资源少,销毁的资源少

一站式:每一个层都提供的解决方案

Spring优点

1.方便解耦,简化开发(高内聚低耦合),使用Spring的IOC容器,将对象之间的依赖关系交给Spring来管理,让我们能够更加专注于应用逻辑

2.Spring就是一个大工厂(容器),可以将所有对象创建和维护依赖关系,交给Spring管理

3.对主流的框架提供了很好的集成支持,如Hibernate,Struts,JPA等

4.Spring提供面向切面编程,可以方便的实现对程序进行权限拦截,运行监控等功能

5.Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部

Spring体系结构

Spring框架是一个分层架构,Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基:

核心容器(IOC/DI)

(IOC)原由:以前编写java代码的时候,代码耦合度偏高,导致项目维护起来非常麻烦。

解决方案:

使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象,这种思想就是(IOC)控制反转:使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想成为控制反转(解耦)。

Spring技术对IOC思想的实现:

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

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

(DI)依赖注入:在容器中建立bean和bean之间的依赖关系的整个过程,称为依赖注入。在IOC容器内将有依赖关系的bean进行关系绑定(DI)。最终使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系

Bean的作用范围:

可用scope选择范围:(singleton:单例,prototype:非单例)

Bean第一种实例化方式,使用无参构造方法

Bean第二种实例化方式,使用静态工厂实例化bean

Bean第三种实例化方式,使用实例工厂实例化bean

Bean生命周期:

bean从创建到销毁的整个过程

初始化容器:

(1)创建对象(分配内存)

(2)执行构造方法

(3)执行属性注入(set操作)

(4)执行bean初始化方法

使用bean

(1)实行业务操作

关闭/销毁容器

(1)执行bean消费方法

面向切面编程AOP

AOP:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等

AOP使用场景

拿我前面做过的一个项目举个例子吧,做的是一个公司的订餐系统,这个系统需要用到Shiro鉴权。
项目里面很多的接口,但是有的接口不需要鉴权就可以访问了,是开放的。
但是还有一些接口,需要特定权限的用户才能访问,比如说公司的领导的权限跟员工的权限不一样,还有系统管理员。

如果要用 OOP 处理的话,必须在对应的接口代码里面,一个一个写上鉴权的代码。

但是如果使用了AOP之后,写一个接口,在需要鉴权的接口上面添加一个注解即可解决了。这样的做法,对原有代码毫无入侵性,这就是AOP的好处了,把和主业务无关的事情,放到代码外面去做。

AOP优点

AOP同时还可以让我们层次话功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护

AOP让我们在进行系统架构和模块设计的时候多了新的选择和新的思路

AOP核心概念

连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法,抛出异常,设置变量等。在SpringAOp中理解为方法的执行

切入点(PointCut):匹配连接点的式子,在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法。(1)一个具体方法:dao包下的dao接口中的无形参无返回值的save方法(2)匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法

通知:(Advice):在切入点处执行的操作,也就是共性功能。在SpringAOP中,功能最终以方法的形式呈现

前置通知:@Before 在目标业务方法执行之前执行
后置通知:@After 在目标业务方法执行之后执行
返回通知:@AfterReturning 在目标业务方法返回结果之后执行
异常通知:@AfterThrowing 在目标业务方法抛出异常之后
环绕通知:@Around 功能强大,可代替以上四种通知,还可以控制目标业务方法是否执行以及何时执行

通知类:定义通知的类

切面(Aspect):描述通知与切入点的对应关系

AOP实现原理

我们来看下代码的具体实现:

1. 首先我定义了一个自定义注解作为切点

@Target(AnnotationTarget.FUNCTION)  //注解作用的范围,这里声明为函数
@Order(Ordered.HIGHEST_PRECEDENCE)  //声明注解的优先级为最高,假设有多个注解,先执行这个
annotation class Hanler(val handler: HandlerType)  //自定义注解类,
// HandlerType是一个枚举类型,里面定义的就是学生和老师的增删改操作,在这里就不展示具体内容了


2. 接下来就是要定义切面类了

@Aspect   //该注解声明这个类为一个切面类
@Component
class HandlerAspect{@Autowiredprivate lateinit var handlerService: HandlerService@AfterReturning("@annotation(handler)")   //当有函数注释了注解,将会在函数正常返回后在执行我们定义的方法
fun hanler(hanler: Hanler) {handlerService.add(handler.operate.value)   //这里是真正执行记录的方法
}
}


3. 最后就是我们本来的业务方法了

/**
* 删除学生方法
*/
@Handler(operate= Handler.STUDENT_DELETE)   //当执行到删除学生方法时,切面类就会起作用了,当学生正常删除后就会执行记录方法,我们就可以看到记录方法生成的数据
fun delete(id:String) {studentService.delete(id)
}

AOP实现逻辑:

1.导入坐标(pom.xml)

2.制作连接点方法(原始操作,Dao接口与实现类)

3.制作共性功能(通知类与通知)

4.定义切入点

AOP实现原理

我们现在了解了代码中如何实现,那么AOP实现的原理是什么呢?之前看了一个博客说到,提到AOP大家都知道他的实现原理是动态代理,显然我之前就是不知道的,哈哈,但是相信阅读文章的你们一定是知道的。

讲到动态代理就不得不说代理模式了, 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式包含如下角色:subject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口; RealSubject:真实主题角色,是实现抽象主题接口的类; Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的

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

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

相关文章

5201B数据网络测试仪

|5201B数据网络测试仪| | 产品综述 | 电科思仪5201B便携式数据网络测试仪,集成高性能IP基础测试硬件平台,提供L2-L3流量测试及协议仿真解决方案,支持以太网报文线速生成与分析、统计、报文捕获,以及路由、接入、组播、数据中心等协…

基于深度学习的烟雾检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8 yolov8主要包含以下几种创新:         1. 添加注意力机制(SE、CBAM等)         2. 修改可变形卷积(DySnake-主干c…

(学习日记)2024.03.04:UCOSIII第六节:main函数+前六节总结

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

符号函数Sign(博途PLC SCL代码)

符号函数在ADRC自抗扰算法里会有涉及,同时在滑膜控制里也会用到,这篇博客我们介绍符号函数在博途PLC里的实现。 1、ADRC自抗扰算法: https://rxxw-control.blog.csdn.net/article/details/126547180https://rxxw-control.blog.csdn.net/article/details/1265471802、模拟量…

视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet

视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet 真没想到,举例视频生成上一轮的集中爆发才过去三个月,没想OpenAI一出手,该领域又直接变天了自打2.16日OpenAI发布sora以来,不但把同时…

软考58-上午题-【数据库】-分布式数据库

一、四个透明 二、四种性质 三、真题 真题1: 真题2: 真题3: 真题4: 真题5:

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分,面临着转型升级的紧迫需求。随着5G技术的快速发展,智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…

力扣76. 最小覆盖子串(滑动窗口)

Problem: 76. 最小覆盖子串 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义两个map集合need和window(以字符作为键,对应字符出现的个数作为值),将子串t存入need中; 2.定义左右指针left、right均指向0&#xff…

【AI视野·今日Sound 声学论文速览 第五十期】Fri, 1 Mar 2024

AI视野今日CS.Sound 声学论文速览 Fri, 1 Mar 2024 Totally 9 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers Probing the Information Encoded in Neural-based Acoustic Models of Automatic Speech Recognition Systems Authors Quentin Raymondau…

Git分布式管理-头歌实验本地版本库

一、本地版本库创建 任务描述 本地Git操作三部曲是“修改-添加-提交”,即先要在本地仓库进行添加、删除或编辑等修改,然后将本地所做的修改添加至暂存区。添加至暂存区的这些本地修改,并未提交到本地仓库,需要执行提交命令才能将暂…

CAN通信篇 - CanTrcv模块配置(二)

文章目录 CanTrcvConfigSetCanTrcvChannelCanTrcvDioChannelAccess 总结 CanTrcv模块配置也比较简单,主要是配置CanTrcv的行为。有一些工程甚至没有包含CanTrcv配置模块(CanTrcv配置代码已通过手写代码方式嵌入工程)。下图所示为CanTrcv模块配置容器。 CanTrcvConfi…

实名制交友-智能匹配-仿二狗交友系统-TP6+uni-APP小程序H5公众号-源码交付-支持二开!

一、代码风格 通常不同的开发者具备不同的代码风格,但为了保证语音交友系统开发质量,在编码前需要进行代码风格的统一,通过制定一定的规则,约束开发者的行为。具有统一风格的代码才能更清晰、更完整、更容易理解、更方便后期维护…

09 Qt扩展LineEdit组件:Input输入框

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起:自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起:自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件:令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

Mysql80服务无法启动请输入Net helpMsg3534以获得更多的帮助

起因&情景: 朋友正在操作数据库,然后电脑突然死机,再重启电脑后启动数据库服务报: 然后朋友尝试各种操作都没有办法正常启动, 一、网上解决方案:(先别操作) 1 删掉&#xff1a…

爬取博客的图片并且将它存储到响应的目录

目录 前言 思想 注意 不多说解释了,贴代码吧 config.json Get_blog_img.py 把之前的写的代码也贴上 Get_blog_id.py 主函数 main.py 运行结果 前言 在上一篇博客中我们介绍了如何爬取博客链接 利用python爬取本站的所有博客链接-CSDN博客文章浏览阅读74…

MatteFormer:Transformer-based image matting via prior-tokens

【CVPR2022】MatteFormer: Transformer-Based Image Matting via Prior-Tokens-CSDN博客文章浏览阅读1.2k次。【CVPR2022】 MatteFormer: Transformer-Based Image Matting via Prior-Tokens_matteformerhttps://blog.csdn.net/Thinkobj/article/details/128209388本文核心2点&…

Vmware Fusion 13 安装CentOS、Ubuntu、Windows11虚拟机

Vmware Fusion 13 安装CentOS、Ubuntu、Windows11虚拟机 背景:每次安装都要到处找资源,现在一篇文章足以 文章目录 Vmware Fusion 13 安装CentOS、Ubuntu、Windows11虚拟机一、Mac中安装CentOS虚拟机1️⃣:准备镜像2️⃣:创建虚拟…

GitHub热榜第二的sora同款工具——DUSt3R

目录 Sora - 探索AI视频模型的无限可能 传送门: Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展,AI视频模型已成为科技领域的新热点。而在这个浪潮中,OpenAI推出的首个AI视频模型Sora,以其卓越的性能和前瞻性的技…

《低代码平台开发实践:基于React》读书心得与实战体验

低代码平台开发实践标题 🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 一、引…

现代信号处理学习笔记(三)信号检测

通过观测数据判断信号是否存在,这一问题称为信号检测。 目录 前言 一、统计假设检验 1、信号检测的基本概念 2、信号检测理论测度 比率测度 概率测度 3、决策理论空间 二、概率密度函数与误差函数 1、概率密度函数 2、误差函数与补余误差函数 三、检测概…