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"来实现多例模式

    例如:

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

    例如:

    java 复制代码
    @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:必须在没有事务的情况下执行,否则抛出异常。
相关推荐
小灰灰__6 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭10 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
小远yyds12 分钟前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
程序媛小果30 分钟前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林36 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el
阿伟来咯~1 小时前
记录学习react的一些内容
javascript·学习·react.js
吕彬-前端1 小时前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱1 小时前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai1 小时前
uniapp
前端·javascript·vue.js·uni-app