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:必须在没有事务的情况下执行,否则抛出异常。
  • 30
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一些 Spring AOP 常见问题: 1. 什么是 Spring AOP? Spring AOP 是 Spring 框架提供的一种基于代理的 AOP(面向切面编程)实现方式。它允许你通过配置来定义横切关注点,并在执行方法时自动将这些关注点织入到目标对象中。 2. Spring AOP 支持哪些 AOP 类型? Spring AOP 支持五种 AOP 类型:前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)、异常通知(After Throwing Advice)和最终通知(After Finally Advice)。 3. Spring AOP 和 AspectJ 有什么区别? Spring AOP 是基于代理的 AOP 实现方式,而 AspectJ 是基于编译时或运行时字节码操纵的 AOP 实现方式。Spring AOP 的功能相对比较简单,适用于大多数场景,而 AspectJ 更加强大,但也更加复杂。 4. Spring AOP 的代理是如何实现的? Spring AOP 采用了 JDK 动态代理和 CGLIB 代理两种方式实现代理。当目标对象实现了接口时,Spring AOP 会使用 JDK 动态代理,否则会使用 CGLIB 代理。 5. Spring AOP 的切入点(Pointcut)有哪些表达式? Spring AOP 的切入点表达式支持通配符和正则表达式,包括以下几种: - execution:匹配方法执行的连接点。 - within:匹配指定类型内的方法执行。 - this:匹配当前代理对象类型的执行方法。 - target:匹配当前目标对象类型的执行方法。 - args:匹配参数类型匹配的执行方法。 - @annotation:匹配特定注解标注的方法执行。 以上是一些 Spring AOP 常见问题,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值