Spring常见问题

如何理解spring属于低侵入式设计?

  • 在代码中不需要写明具体依赖对象,在运行时进行自动注入,降低了组件的耦合
  • 依赖的是接口,而接口的实现类具有拓展性

Spring IOC 实现了什么功能,谈谈你对IOC的理解。

负责创建对象,管理对象(通过依赖注入(DI)装配对象、配置对象)并且管理这些对象的整个生命周期。

功能:
依赖注入(DI): 生命周期管理:Spring
控制反转:将对象的创建权交由外部容器,将Bean加入IOC容器 Spring IOC
IOC容器还负责管理Bean的生命周期。它会根据配置来创建Bean,初始化Bean,以及在不再需要时销毁Bean。
配置集中管理:Spring IOC容器允许将应用的配置集中到一个或多个地方,使得配置的管理更加方便。

Spring提供了哪些实现DI的方式?

Spring提供了以下几种实现依赖注入(DI)的方式:

  1. Setter注入:这是最常用的注入方式。Spring IOC容器通过调用Bean的setter方法,将依赖注入到Bean中。

  2. 构造器注入:Spring IOC容器通过调用Bean的构造器,并传入所需的依赖,来完成依赖注入。

  3. 注解注入:Spring还支持基于注解的依赖注入。例如,可以使用@Autowired注解来自动注入依赖。

  4. 自动装配注入:Spring IOC容器可以自动装配Bean的依赖。例如,如果一个Bean需要另一个Bean,Spring IOC容器可以自动找到并注入所需的Bean。

  5. 静态工厂注入:通过静态工厂方法返回的实例进行依赖注入。

  6. 实例工厂注入:通过实例工厂方法返回的实例进行依赖注入。

DI注入如何实现单例变多例,这个过程中产生的现象都是谁在管理?

[在Spring中,Bean默认是单例模式,也就是说,Spring IOC容器在初始化时会创建Bean的一个实例,并在整个应用中复用这个实例。但是,我们可以通过配置将单例模式变为多例模式]

实现单例变多例的方式主要有以下几种:

  1. XML配置:在Bean的XML配置中,可以通过设置scope="prototype"来实现多例模式

    例如:

    <bean id="xxx" class="全类名" scope="prototype"></bean>
    
  2. 注解:可以使用@Scope("prototype")注解来使对象成为多例模式

    例如:

    @Component
    @Scope("prototype")
    public class SomeClass {// ...
    }
    

[在这个过程中,所有的现象都是由Spring IOC容器来管理的。当我们将一个Bean配置为多例模式后,每次从Spring IOC容器中获取该Bean时,都会创建一个新的实例。

需要注意的是,多例模式在进行注入时,不能使用@Autowired,否则注入的还是单例模式。实现多例模式需要使用工厂模式例如,可以通过实现BeanFactoryAware接口来获得factory

此外,如果你想在一个请求的生命周期内保持Bean的实例是唯一的,你可以使用@Scope("request")@Scope("session")。这两种模式分别表示在一次HTTP请求中和在一个会话中,被注解的Bean都是同一个Bean

OOP 和 AOP 的区别是什么?

OOP面向对象编程,纵向结构关系,关注类之间的关系.OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。它导致了大量代码的重复,而不利于各个模块的重用。
AOP可以说是OOP(Object Oriented
Programming,面向对象编程)的补充和完善。AOP面向切面编程,横向结构关系,关注类的内容.
剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块.使用AOP,可以在不修改原来代码的基础上添加新功能。

Spring 通过AOP实现了什么功能?这项技术你是如何使用的?

【实现功能】
使用AOP,可以在不修改原来代码的基础上添加新功能。 模块化横切关注点:Spring
AOP将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用
动态代理:Spring AOP使用动态代理技术,在目标对象方法执行时将切面的逻辑织入到目标对象的方法中

【使用】
定义普通业务组件:这是我们的主业务逻辑,它包含了我们的核心功能。[切面类]
定义切入点:切入点定义了哪些连接点上应该应用通知。切点通过表达式进行定义,如匹配所有 public
方法或匹配某个包下的所有方法等。[编写切入表达式]
定义增强处理:增强处理就是在AOP框架为普通业务组件织入的处理动作。这包括前置增强(Before Advice)、后置增强(After
Advice)、环绕增强(Around Advice)、异常增强(After Throwing Advice)等。[书写通知]

AOP的实现用到了哪种设计模式,它有哪些实现方式?

Spring AOP(面向切面编程)的实现主要用到了以下设计模式:

  1. 代理模式:Spring AOP是围绕着代理模式设计的。这里的代理模式,其实就是指使用一个代理对象来控制对原对象的访问,这个代理对象在原对象的基础上增加了一些额外的功能。
  2. 工厂模式:在Spring AOP中,工厂模式主要用于创建代理对象和目标对象。

Spring AOP的实现方式主要有以下几种:

  1. JDK动态代理:JDK动态代理主要针对目标对象的接口进行代理,动态生成接口的实现类25。这种方式需要目标对象实现一个或多个接口,否则不能使用JDK动态代理)。
  2. CGLIB代理:CGLIB代理可以针对类进行代理,生成目标类的子类25。这种方式不需要目标对象实现接口,也可以进行代理。
  3. Spring API实现AOP:通过实现Spring提供的AOP接口,如MethodBeforeAdviceAfterReturningAdviceMethodInterceptor等,来实现AOP。
  4. 自定义类实现AOP:通过自定义切入类和配置,来实现AOP。通过使用Spring的@Aspect@Pointcut@Before@After等注解,来实现AOP

理解什么是连接点、切面、切点、通知、目标对象、织入、引入。

  • 连接点 JoinPoint:要增强的哪些方法(目标方法)

  • 通知 Advice:进行增强的重复逻辑,也就是共性的功能。(增强方法) 通知是切面在连接点处执行的代码,例如在方法调用前、方法调用后、方法抛出异常时执行的代码。通知可以分为
    Before、After、AfterReturning、AfterThrowing 和 Around 五种类型

  • 切入点 PointCut:匹配连接点的条件,通知仅会在切入点方法执行时被应用(为共性的功能标记目标方法)

  • 切面 Aspect:,描述通知与切入点的对应关系(通知+切入点)【切面所在的类,我们一般称为切面类(被@Aspect注解标识的类)】

  • 目标对象:Target,通知所应用的对象(要增强目标方法所在对象)

  • 织入 weave:指把通知应用到目标上,生成代理对象的过程。

  • 引入(Introduction):引入允许我们向现有类添加新方法或属性

Spring是如何实现事务的?它和以往的实现有什么区别?

实现:

Spring实现事务的方式主要是通过AOP(面向切面编程)和事务管理器

事务管理器(PlatformTransactionManager):Spring的事务管理器是事务管理的顶层接口,它规定了事务的基本操作:创建事务,提交事务和回滚事务。
事务拦截器(TransactionInterceptor):Spring的事务拦截器负责拦截带有@Transactional注解的方法。当这些方法被调用时,拦截器会在方法执行前后应用事务逻辑。
代理对象:Spring会为带有@Transactional注解的类生成一个代理对象,并将这个代理对象作为bean。【aop操作】 当这个代理对象的方法被调用时,如果该方法上存在@Transactional注解,那么代理逻辑会先把事务的自动提交设置为false,然后再去执行原本的业务逻辑方法。如果执行过程中没有出现异常,那么代理逻辑就会将事务提交,如果出现了异常,那么就会将事务进行回滚

区别:

  • 具体事务的实现由第三方框架实现,避免我们直接进行事务操作!
  • 声明式事务管理:Spring支持声明式事务管理,通过@Transactional注解或XML配置来声明开启事务,让Spring来接管事务的实现逻辑。这使得开发者只需要关注业务逻辑,而无需手动管理事务的生命周期。
  • 事务传播行为和隔离级别:Spring提供了丰富的事务传播行为和隔离级别设置,可以更精细地控制事务的行为

事务的传播机制都有哪些?

  1. Propagation.REQUIRED:如果当前存在事务,则加入当前事务,否则创建一个新事务。【默认】
  2. Propagation.REQUIRES_NEW:创建一个新事务,并在新事务中执行。如果当前存在事务,则挂起当前事务,即使新事务抛出异常,也不会影响当前事务
  3. Propagation.NESTED:如果当前存在事务,则在该事务中嵌套一个新事务,如果没有事务,则与Propagation.REQUIRED一样。
  4. Propagation.SUPPORTS:如果当前存在事务,则加入该事务,否则以非事务方式执行。
  5. Propagation.NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,挂起该事务。
  6. Propagation.MANDATORY:必须在一个已有的事务中执行,否则抛出异常。
  7. Propagation.NEVER:必须在没有事务的情况下执行,否则抛出异常。

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

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

相关文章

【云原生】K8s管理工具--Kubectl详解(一)

一、陈述式管理 1.1、陈述式资源管理方法 kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口kubectl 是官方的 CLI 命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为apiserver 能识…

Elasticsearch集群和Logstash、Kibana部署

1、 Elasticsearch集群部署 服务器 安装软件主机名IP地址系统版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.56centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 软件版本&#xff1a;elasticsearch-7.13.2.tar.gz 示…

ubuntu18 安装python3.8

在Ubuntu 18.04上安装Python 3.8可以通过以下步骤完成&#xff1a; 1.更新包列表和已安装的包&#xff1a; sudo apt update sudo apt upgrade 2.安装依赖项&#xff1a; sudo apt install -y software-properties-common 3.添加Python 3.8的PPA&#xff08;个人包归档&am…

【Docker系列】 Docker容器具体信息查询

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解

系列文章目录 Python数据类型&#xff1a;编程新手的必修课深入探索Python字符串&#xff1a;技巧、方法与实战Python 函数基础详解Python正则表达式详解&#xff1a;掌握文本匹配的魔法Python文件操作宝典&#xff1a;一步步教你玩转文件读写Python面向对象基础与魔法方法详解…

databricks~Unity Catalog

Unity Catalog hierarchy 包含了用户授权管理信息和元数据信息 workspace with unity catalog hierarchy unity metastore Ref: https://www.youtube.com/playlist?listPLY-V_O-O7h4fwcHcXgkR_zTLvddvE_GfC

[力扣题解] 494. 目标和

题目&#xff1a;494. 目标和 思路 01背包 转换为01背包问题 难点在于看出可以用背包问题解决本题&#xff1b; 题目字面意思是划分出一堆再减去另一堆&#xff0c;得到的结果想要等于target&#xff0c;设定一堆为正&#xff0c;记为left&#xff0c;另一堆为负&#xff0…

ChatGPT类大模型应用入门了解与使用

一 前言 ChatGPT大众热情逐渐褪去&#xff0c;但在后台技术人的探索还处于热火朝天状态。如果我们生活的世界是一杯清水&#xff0c; 那类似ChatGPT的语言大模型技术的横空出世就如滴入水杯的一滴墨汁&#xff0c;第一滴很显眼&#xff0c;但实际上是后续墨汁慢慢扩散渗透才是…

Windows11下使用Qt5.14.2编译QtXlsx驱动详细步骤

原有&#xff1a;由于系统需要将QTableWidget表格中的数据导出、在Windows下最开始使用Excel.Application组件实现了导出功能&#xff0c;后面将代码转换到Ubuntu20.04下进行编译&#xff0c;发现项目.pro文件中的QT axcontainer和代码.h文件中的#include <QAxObject>跟…

基于图鸟UI的资讯名片模版开发与应用

一、引言 在前端技术日新月异的今天&#xff0c;快速、高效、美观的UI组件库和模板成为了开发者们关注的焦点。图鸟UI作为一款集成了基础布局元素、配色体系、图标icon和精选组件的UI框架&#xff0c;为前端开发者提供了极大的便利。本文将以图鸟UI为基础&#xff0c;探讨基于…

接口测试工具有哪些,哪些比较火

接口测试工具可以帮助开发人员和测试人员更高效地进行接口测试&#xff0c;以下是一些常用的接口测试工具&#xff1a; 1. **Postman** Postman 是一款广受欢迎的接口测试工具&#xff0c;它提供了丰富的功能和直观的用户界面&#xff0c;帮助开发人员和测试人员轻松进行 API…

如何让外网访问内网服务?

随着互联网的快速发展&#xff0c;越来越多的企业和个人需要将内网服务暴露给外网用户访问。由于安全和隐私等因素的考虑&#xff0c;直接将内网服务暴露在外网是非常不安全的做法。如何让外网用户安全访问内网服务成为了一个重要的问题。 在这个问题上&#xff0c;天联公司提供…

golang rune类型解析,与byte,string对比,以及应用

Golang中的rune类型是一个32位的整数类型(int32)&#xff0c;它是用来表示Unicode码点的。rune类型的值可以是任何合法的Unicode码点&#xff0c;它通常用来处理字符串中的单个字符。 在Golang中&#xff0c;字符常量使用单引号来表示&#xff0c;例如 a。使用单引号表示的字符…

rust - 使用 cargo-nextest 替代 cargo test

cargo-nextest 是新一代的rust测试程序&#xff0c;能够极大提升测试性能&#xff0c;可以完全替代 cargo test 命令。 1. 安装 cargo install cargo-nextest2. 执行测试 project ├── Cargo.toml ├── LICENSE ├── README.md ├── build.rs ├── core_utils │ …

K-means聚类模型

目录 1.定义 2.K-means聚类模型的优点 3.K-means聚类模型的缺点 4.K-means聚类模型的应用场景 5.对K-means聚类模型未来的展望 6.小结 1.定义 什么是 K-means 聚类模型&#xff1f;K-means 聚类模型是一种无监督学习算法&#xff0c;用于将数据划分为不同的组或簇&#…

Lumines推出RGBL彩色混合LED

Luminus Devices倾心打造了一款崭新的4合1 RGBL&#xff08;红绿蓝绿石灰&#xff09;LED系列&#xff0c;专为舞台与建筑照明领域量身打造&#xff0c;满足对高显色指数&#xff08;CRI&#xff09;与高输出颜色混合的苛刻需求。这一创新之举&#xff0c;无疑是照明技术的一次…

使用HiBurn烧录鸿蒙.bin文件到Hi3861开发板

鸿蒙官方文档的“Hi3861开发板第一个示例程序”中描述了——如何使用DevEco Device Tool工具烧录二进制文件到Hi3861开发板&#xff1b; 本文将介绍如何使用HiBurn工具烧录鸿蒙的.bin文件到Hi3861开发板。 获取HiBurn工具 通过鸿蒙官方文档我们知道DevEco Device Tool是一个V…

SAP--ABAP踩坑日志---日期函数的踩坑-----FIMA_DATE_CREATE

当你需要动态生成日期列的时候,出现了奇怪的BUG怎么办? 用函数循环循环产生获取下一个日期,结果出现了5.30 直接到6.1了 …我的5.31呢??? 解决方案:用这个,不要瞎用函数啊! day_col day_col 1.

Mybatis 与 MybatisPlus 打印sql日志配置

Mybatis 与 MybatisPlus 打印sql日志配置 方法一&#xff1a; Mybatis 配置&#xff1a; mybatis:configuration: ### 开启打印sql配置log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ### 开启驼峰配置 map-underscore-to-camel-case&#xff1a;trueMyb…

docker所在磁盘空间不足 迁移数据

1.查看原始目录docker info | grep "Docker Root Dir" 一般在/var/lib/docker 2.停止docker service docekr stop 3.移动数据 注意 移动前不要创建docker目录&#xff01; mv /var/lib/docker /home/docker 4.进入目录查看是否与原始目录相同&#xff0c;确认一…