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{
 
 @Autowired
 private 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的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的

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

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

相关文章

技术小知识:面向对象和过程的区别 ⑤

一、思想区别 面相对象:始终把所有事情思考归类、抽离封装成对象来调用完成。 面向过程:直接平铺展开按顺序执行完成任务。 面向对象多了很多对象的创建、使用,销毁的过程资源消耗。是一种模块化编程思想。 https://www.cnblogs.com/kuangmen…

为何要使用流媒体服务器

安防系统中,我们偶尔会遇到“流媒体服务器”这个词,那么为什么需要这个服务呢? 视频监控 我们知道,监控摄像机的工作原理就是将自然界的光影,通过摄像机镜头对焦到“靶芯”(CMOS),实…

mysql8修改密码

mysql8.0修改密码 windows下忘了MySQL8.0的密码,可以通过以下方式修改。 1、管理员方式打开cmd命令窗口 输入: net stop mysql接着输入: mysqld --console --skip-grant-tables --shared-memory2、管理员方式打开另外一个cmd窗口 输入&…

nvm安装和使用保姆级教程(详细)

一、 nvm是什么 : nvm全英文也叫node.js version management,是一个nodejs的版本管理工具。nvm和npm都是node.js版本管理工具,为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。 二、卸载之前安装的node: …

c++之通讯录管理系统

1,系统需求 通讯录是一个记录亲人,好友信息的工具 系统中需要实现的功能如下: 1,添加联系人:向通讯录中添加新人,信息包括(姓名,性别,年龄,联系电话&#…

基于SpringBoot的企业头条管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

Libevent的使用及reactor模型

Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读…

深入理解抽象工厂模式:原理、应用与优缺点分析

文章目录 **一、模式原理****二、使用场景****三、为何使用抽象工厂模式**四、代码示例**五、优点与缺点****总结** 一、模式原理 ​ 抽象工厂模式是一种创建型设计模式,其核心思想在于通过抽象工厂接口提供一个创建一系列相关或相互依赖对象的接口,而不…

Rust结构体讲解学习,以及impl结构体方法和结构体关联函数

Rust 中的结构体(Struct)与元组(Tuple)都可以将若干个类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它成员的时候就不用记住下标了。元组常用于非定义的多值传…

十六、异常和File

异常和File 一、异常1.1异常的分类1.2 异常的作用1.3 异常的处理方式1.3.1 JVM默认的处理方式1.3.2 自己处理(捕获异常)1.3.3 自己处理(灵魂四问) 1.4 异常中的常见方法1.5 抛出异常综合练习(键盘录入数据)…

nginx-图片模块

./configure --with-http_image_filter_module location / {root html;index index.html index.htm;if ($arg_w "") {set $arg_w -;}if ($arg_h "") {set $arg_h -;}image_filter resize $arg_w $arg_h;image_filter_jpeg_quality 95; } 访问: 1234…

xxl-job--02--可视化界面各功能详细介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 可视化界面1 新增执行器2.新增任务**执行器**:**任务描述**:**路由策略**:**Cron**:cron表达式**运行模式**JobHandl…

Python把excel内容保存为图片(非统计图而是纯原表格数据)

一、引入 excel2img 库,没有的话使用 pip install excel2img进行安装 二、采用如下方法进行图片生成 excel文件名为:111.xlsx excel表格里面的sheet名称列表为 [Sheet1, Sheet2] 最终保存为以sheet名称.png的图片 支持跨表格合并项 import excel2i…

一文扫盲:室内导航系统的应用场景和技术实现(入门级)

hello,我是贝格前端工场,之间搞过一些室内导航项目,有2D也有3D的,算是有些经验,这里给大家分享一下室内导航的基本尝试,欢迎老铁们点赞、关注,如有需求可以私信我们。 一、室内导航是什么 室内…

理解这几个安全漏洞,你也能做安全测试

01 短信炸弹 1、漏洞描述 短信轰炸攻击是常见的一种攻击,攻击者通过网站页面中所提供的发送短信验证码的功能处,通过对其发送数据包的获取后,进行重放,如果服务器短信平台未做校验的情况时,系统会一直去发送短信&…

高斯消元法的应用

如果有这么一个线性规划系统的例子: 添加图片注释,不超过 140 字(可选) 将如上的线性规划系统转换为: 添加图片注释,不超过 140 字(可选) 这里要注意的是转换后的约束条件全部都变…

模版进阶C++

非类型模版 之前我们写的模版都是在不知道模版(类)中有的变量的类型是什么的时候,我们先用模版参数定义,当类实例化的时候在传参确认 非类型模版:模版参数定义的时候也可以定义整型类型(c20之后才支持其…

【剑指offer--C/C++】JZ3 数组中重复的数字

一、题目 二、本人思路及代码 这道题目它要求的时间空间利用率都是n,那么可以考虑创建一个长度为n的数组repeat初始化为0,下标代码出现的数字,下标对应的数组内容代表该下标数字出现的次数。然后遍历提供的数组,每出现一个数字&a…

java011 - Java字符串

1、API 1.1 概念 API(application programming interface)应用编程接口。 1.2 API帮助文档 1.3 API练习 注意:使用快捷键 ctrlalt v 可以直接生存左边的 数据类型 变量 。 完整代码: 2、String 2.1 概述 String类在 java.long 包下,所以使用的时…

LeetCode 刷题 [C++] 第347题.前 K 个高频元素

题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 题目分析 据题意可知,我们需要先遍历整个数组,并统计每个数字出现的次数,保存在哈希表中;对元素…