Java框架-Spring

news2024/11/23 5:12:11

文章目录

      • 1、你了解Spring IOC吗?
      • 2、SpringIOC的应用?
      • 3、SpringIOC的getBean方法的解析?
      • 4、面试题
      • 5、你了解Spring AOP吗?
      • 6、事务ACID特性
      • 7、事务传播


1、你了解Spring IOC吗?

IoC(Inversion of control):控制反转

  • Spring Core最核心的部分
  • 需要先了解依赖注入(Dependency Inversion)

请添加图片描述

IOC:是一个思想。

DI举例:

请添加图片描述

如果,轮子改变的话,整体的都是需要改变的。

正确的注入的方式:

请添加图片描述

控制反转(IOC):控制反转,由自己的控制,转为容器进行控制管理。

依赖注入,是上层的类,注入底层的类。也就是只有4个类的内存空间。上面的是每次都new对象,开辟了双份的内存空间。

请添加图片描述

依赖注入的方式:

  • Setter:
  • Interface
  • Constructor:构造器
  • Annotation:注释,注解。

依赖倒置原则、IOC、DI、IOC容器的关系:

依赖倒置原则:高层模块不能依赖底层模块,应该依赖其抽象。

请添加图片描述

IOC容器的优势:

  • 避免在各处使用new来创建类,并且可以做到统一维护。
  • 创建实例的时候不需要了解其中的细节。

2、SpringIOC的应用?

Spring提供一个配置文件,描述Bean以及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean,并建立Bean之间的依赖关系。

  1. 读取Bean配置信息,并在Spring容器中生成一份Bean配置注册表。
  2. 根据Bean注册表实例化Bean。
  3. 将Bean实例放到Spring容器中。
  4. 使用Bean。

请添加图片描述

Spring 功能

Spring IOC支持的功能

  • 依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 指定初始化方法和销毁方法
  • 支持回调方法

Spring IOC容器的核心接口

  • BeanFactory
  • ApplicationContext

BeanDefinition()

主要用来描述Bean的定义

将XML和注解里Bean,解析为Spring内部的BeanDefinition

Bean Definition Registry

提供向IOC容器注册 BeanDefinition对象的方法

以Bean为Key,BeanDefinition为value,存在BeanDefinitionMap中。并将名称存在beanDfinitionNames中,以便后续Bean的实例化。

BeanFactory体系结构

请添加图片描述

BeanFactory和ApplicationContext的比较?

  • Bean Factory是 Spring框架的基础设施,面向 Spring
  • ApplicationContext面向使用 Spring框架的开发者

请添加图片描述

请添加图片描述

ApplicationContext的功能(继承多个接口)

  • Bean Factory:能够管理、装配Bean。
  • ResourcePatternResolver:能够加载资源文件。
  • MessageSource:能够实现国际化等功能。
  • ApplicationEventPublisher:能够注册监听器,实现监听机制。

3、SpringIOC的getBean方法的解析?

geBean的实现AbstractBeanFactory方法。

getBean方法的代码逻辑

  • 转换 beanName
  • 从缓存中加载实例
  • 实例化Bean
  • 检测 parentBeanFactory
  • 初始化依赖的Bean
  • 创建Bean

4、面试题

Spring Bean的5个作用域?

创建和销毁Bean很消耗资源

请添加图片描述

在Spring框架中,可以通过配置和注解来定义和管理对象的生命周期和作用域。Spring Bean的作用域定义了对象实例的创建和销毁方式以及对象在应用程序中的可见性。下面是Spring Bean的五个作用域:

  • Singleton(默认作用域)(唯一):

单例作用域表示在整个应用程序中只创建一个对象实例。当使用singleton作用域时,Spring容器只会创建一个共享的Bean实例,并在需要时返回该实例。每次请求该Bean时都会返回同一个实例。

  • Prototype(原型作用域)(每次请求):

原型作用域表示每次请求时都会创建一个新的对象实例。每次从容器中获取Bean时,都会返回一个新的独立实例。原型作用域适用于需要每次使用时都获得一个全新实例的场景。

  • Request(每个Http):

请求作用域表示每个HTTP请求都会创建一个新的对象实例。在Web应用程序中,每个HTTP请求都会创建一个独立的Bean实例,并且该实例在整个请求范围内是共享的。适用于每个HTTP请求需要使用不同实例的场景。

  • Session(每个会话):

会话作用域表示每个用户会话都会创建一个新的对象实例。在Web应用程序中,每个用户会话都会创建一个独立的Bean实例,并且该实例在整个会话期间是共享的。适用于需要跨多个请求共享状态的场景。

  • Global Session(全):

全局会话作用域是在基于Portlet的Web应用程序中使用的作用域,它表示整个应用程序的生命周期。在非Portlet环境中,全局会话作用域与标准会话作用域相同。

以上是Spring框架中常用的五个Bean作用域。通过选择适当的作用域,可以控制对象的生命周期和共享方式,以满足应用程序的需求。

Spring Bean的声明周期

创建过程:

请添加图片描述

销毁过程:

  • 若实现了 DisposableBean 接口,则会调用 destroy方法。
  • 若配置了 destry-method 属性,则会调用其配置的销毁方法。

5、你了解Spring AOP吗?

关注点分离:不同的问题交给不同的部分去解决

  • 面向切面编程AOP正是此种技术的体现
  • 通用化功能代码的实现,对应的就是所谓的切面(Aspect)
  • 业务功能代码和切面代码分开后,架构将变得高内聚低耦合
  • 确保功能的完整性:切面最终需要被合并到业务中(Weave)

AOP的三种织入方式

  • 编译时织入:需要特殊的Java编译器,如 AspectJ。
  • 类加载时织入:需要特殊的Java编译器,如 AspectJ和 AspectWerkz。
  • 运行时织入:Spring采用的方式,通过动态代理的方式,实现简单。

AOP的主要名词概念:

  • Aspect:通用功能的代码实现
  • Target:被织入 Aspect的对象
  • Join point:可以作为切入点的机会,所有方法都可以作为切入点
  • Pointcut:Aspect实际被应用在的 Join point,支持正则
  • Weaving:Aop的实现过程

Advice的种类

  • 前置通知(Before)
  • 后置通知(AfterReturning)
  • 异常通知(AfterThrowing)
  • 最终通知(After)
  • 环绕通知(Around)

AOP的实现:JakProxy和 Cglib

  • 由 Aop Factory根据 AdvisedSupport对象的配置来决定
  • 默认策略如果目标类是接口,则用 JDKProxy(JDK动态代理)来实现,否则用后者
  • JDKProxyl的核心:Invocation Handler接口和 Proxy类
  • cglb:以继承的方式动态生成目标类的代理

JDKProxy:通过ava的内部反射机制实现

Cgib:借助ASM实现

反射机制在生成类的过程中比较高效

ASM在生成类之后的执行过程中比较高效

代理模式:

接口+真实实现类+代理类(生成一个代理类,代理真实的类,对外提供服务)

Spring里的代理模式的实现

  • 真实实现类的逻辑包含在了 getBean方法里
  • getBean方法返回的实际上是Proxy的实例
  • Proxy实例是 Spring采用 JDK Proxy或CGLB动态生成的
  • Spring事务的相关考点

6、事务ACID特性

数据库事务正确执行的4个基础要素是:原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durability)

原子性(Atomicity): 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency): 事务前后数据的完整性必须保持一致。

隔离性(Isolation): 事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

持久性(Durability): 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

并发访问问题:

脏读:一个事务读到了另一个事务未提交的数据.

不可重复读:个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一致。

虚读/幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。

隔离级别:解决问题

读未提交(read uncommitted):最低的隔离级别,含义是允许一个事务去读取另一个事务未提交的数据。

读已提交(read committed):是说一个事务只能读取另一个事务已经提交的数据。

可重复读(repeatable read):针对数据库中同一条记录而言,使得同一条数据库记录的读写按照一个序列化进行操作,不会产生交叉情况,这样就能保证同一条数据的一致性。

串行化(serializable):一种让SQL按照顺序读写的方式,能够消除数据库事务之间并发产生数据不一致的问题。

请添加图片描述

7、事务传播

@Transactional(propagation=Propagation.REQIRED)
public class FlowService{
}
  • requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
  • supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
  • mandatory:使用当前事务,如果没有当前事务,就抛出异常。
  • required_new:新建事务,如果当前存在事务,把当前事务挂起。
  • not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • never:以非事务方式执行操作,如果当前事务存在则抛出异常。
  • nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

请添加图片描述

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

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

相关文章

C++编程启蒙-2——你适合学习编程吗?

英语差,数学孬,照样可以学好编程。但,如果你逻辑思维差,动力能力弱,那么学习编程真的会难上加难。本课用来帮助读者实现对逻辑思维与动手能力的自我判断,并给出了实际测试方案。 英语差,数学孬&…

15个常见的AI绘画网站推荐

无论你是专业的艺术家还是对人工智能绘画感兴趣的普通人,AI绘画网站都可以为你提供新的创作灵感和艺术体验,给艺术界带来更多的创新和可能性。以下是15个常见的AI绘画网站的介绍。 即时 AI 灵感 「即时 AI 灵感」是通过文字描述等方式生成精致图像的AI…

QGIS实现shape、geojson数据的矢量切片教程

能够实现矢量切片的办法有很多,可以使用geoserver,可以使用qgis,当然也可以自己写代码实现。这篇文章我们来介绍一下如何使用qgis完成shape数据的矢量切片。 首先我们还是要准备一份矢量数据。矢量数据的格式是shape文件或者是geojson文件都…

IDEA下载安装与使用

IDEA下载、安装与概述、使用 IDEA全称InteliJ IDEA,是用于Java语言开发的集成环境,它是业界公认的目前用于Java程序开发最好的工具 集成环境:把代码编写、编译、执行、调试等多种功能综合到一起的开发工具 1 IDEA的下载 官网链接&#xf…

第一章 基础算法(二)——高精度,前缀和与差分

文章目录 高精度运算高精度加法高精度减法高精度乘法高精度除法 前缀和二维前缀和 差分二维差分 高精度练习题791. 高精度加法792. 高精度减法793. 高精度乘法794. 高精度除法 前缀和练习题795. 前缀和796. 子矩阵的和 差分练习题797. 差分798. 差分矩阵 高精度运算 两个大数做…

Day37

思维导图 练习 1> 编写一个名为myfirstshell.sh的脚本,它包括以下内容。 a、包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的 b、和当前用户说“hello 用户名” c、显示您的机器名 hostname d、显示上一级目录中的所有文件的列表 e、显示…

Git 多账号多仓库配置 SSH

前言 在我们使用 Git 中,有时候会遇到多账号多仓库的情况,比如公司的 GitLab 和 GitHub,以及自己的 GitHub,这时候我们就需要配置多个 SSH 密钥来区分不同的账号和仓库 生成 SSH 密钥 根据你注册仓库的邮箱生成 SSH 密钥&#…

Kubeadm方式搭建K8s集群 1.27.0版本

目录 一、集群规划 二、系统初始化准备(所有节点同步操作) 三、安装并配置cri-docker插件 四、安装kubeadm(所有节点同步操作) 五、初始化集群 六、Node节点添加到集群 七、安装网络组件Calico 八、测试codedns解析可用性 一、集群规划 环境规划…

Qt 定时器

定时器事件---timerEvent 定时器启动 startTimer(); 注意:定时器参数要是全局或者静态变量。 定时器结束 没有结束函数 定时器标志---timerId int timerIdstartTimer(); startTimer()返回定时器标志 需设置为类的成员--类内使用 定时器使用 通过定时器事件…

设计模式介绍

设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式…

JVM体系结构模块

1、类装载器ClassLoader (1)负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 (2)加…

麻了。。。

同样的初始条件,一个每隔0.05s保存一步数据,一个每隔1.13s保存一步数据。 上面横轴代表时间,纵轴代表Nu。 可以看出其实是不太一样的,一个取平均是24.72,一个是25.34,差距其实有的。 我目前跑算例发现长时间…

【C++】类和对象超全超详细总结(万字详解)

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C 🛹Linux 📕 学习格言:博观而约取&#xff0…

C#视觉检测-模板匹配

前几天一个学员在学习C#与视觉交互时,也不知道视觉可以用来做什么 。下面我们就详细讲讲C# 和视觉交互的相关知识。 C#和Halcon的视觉交互在工业生产和智能制造领域中得到了广泛应用。其中,模板匹配是一种简单但有效的图像处理技术,可以用于检测和定位物…

性能测试压测工具都有哪些?怎么选你知道吗?

目录 普遍存在的问题 工具选型和推荐 软件测试而非测试工具 总结: 普遍存在的问题 聊压测工具之前,先聊一下我面试候选人时问的问题以及在技术交流群经常遇到的一个情况。 面试候选人特别是性能测试岗位,我一般很少问测试工具的问题&…

53 最佳实践-安全最佳实践-虚拟机可信启动

文章目录 53 最佳实践-安全最佳实践-虚拟机可信启动53.1 概述53.2 配置vTPM设备,使能度量启动53.2.1 安装swtpm和libtpms软件53.2.2 虚拟机配置vTPM设备53.2.3 确认度量启动使能成功 53 最佳实践-安全最佳实践-虚拟机可信启动 53.1 概述 可信启动包含度量启动和远…

深入篇【Linux】学习必备:谈gcc/g++使用及原理 + 动静态库介绍 + debug与release模式

深入篇【Linux】学习必备:谈gcc/g是如何完成程序的翻译过程&&动静态库介绍&&debug与release模式 Ⅰ.gcc/g是如何完成程序的翻译过程的?①.预处理(宏替换)②.编译(生成汇编)③.汇编(生成机器可识别代码)④.链接(生成可执行文件) Ⅱ.动态库…

安装Nginx网站服务

目录 前言 一、Nginx简介 二、Nginx应用场景 三、Nginx与Apache优缺点 1)Nginx 相对于 Apache 的优点 2)Apache 相对于 Nginx 的优点 3)Nginx和Apache的差异 四、阻塞与非阻塞、同步与异步 五、安装Nginx软件 1、在线安装 ①使用y…

半导体测试系统 芯片自动化测试软件 可定制测试方案ATECLOUD-IC

*测试产品:芯片半导体器件。纳米软件ATECLOUD-IC芯片自动化测试系统适用于二极管、三极管、绝缘栅型场效应管、结型场效应管、单向和双向可控硅、普通和高速光耦、整流桥、共阴共阳二极管及多阵列器件等各类半导体分立器件综合性能自动化测试。 *被测项目&#xff…

vue3 script setup

解决在使用vue 3 composition API(组合式API)时繁琐的问题,比如定义一个方法,模板需要使用该方法,就必须将方法返回,当组件中存在大量方法和属性时就很麻烦。 一、什么是script setup 二、script setup什么作用 1.自动注册子组件 …