SSM遗留问题

SSM遗留问题

一、Bean对象的循环依赖问题是什么,怎么解决?

  1. 构造器循环依赖:这种循环依赖发生在Bean之间的构造器相互引用。
    例如,Bean A的构造器需要Bean B作为参数,而Bean B的构造器又需要Bean A作为参数。
    由于构造器是在Bean实例化时调用的,所以Spring容器无法先创建其中一个Bean,因为这样会导致另一个Bean无法实例化,从而形成死循环。
    使用@Lazy注解
    重新设计代码结构,确保Bean之间的依赖关系是单向的,并尽量减少Bean之间的直接依赖
    引入接口、使用依赖注入框架的特定功能(如@Autowired注解的按类型自动装配)、或者利用设计模式(如工厂模式、代理模式等)来实现
  2. setter循环依赖:这种循环依赖发生在Bean的setter注入方法中。
    与构造器循环依赖不同,setter注入是在Bean实例化之后进行的。
    因此,即使存在循环依赖,Spring容器也可以先实例化每个Bean,然后再通过setter方法注入依赖。然而,如果循环依赖关系复杂或配置不当,也可能导致Spring容器无法正确初始化Bean。
    三级缓存机制
    使用@Lazy注解重新设计代码结构,确保Bean之间的依赖关系是单向的,并尽量减少Bean之间的直接依赖
    引入接口、使用依赖注入框架的特定功能(如@Autowired注解的按类型自动装配)、或者利用设计模式(如工厂模式、代理模式等)来实现

二、IOC和AOP理解

1、IOC

IOC(Inversion Of Controll,控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。Spring 中的 IOC 的实现原理就是工厂模式加反射机制。

2、AOP

AOP(Aspect-Oriented Programming,面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性。Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP就会使用JDK动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。

2.1 AOP包含的几个概念

Jointpoint(连接点):具体的切面点点抽象概念,可以是在字段、方法上,Spring中具体表现形式是PointCut(切入点),仅作用在方法上。Advice(通知): 在连接点进行的具体操作,如何进行增强处理的,分为前置、后置、异常、最终、环绕五种情况。目标对象:被AOP框架进行增强处理的对象,也被称为被增强的对象。AOP代理:AOP框架创建的对象,简单的说,代理就是对目标对象的加强。Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB代理。Weaving(织入):将增强处理添加到目标对象中,创建一个被增强的对象的过程总结为一句话就是:在目标对象(target object)的某些方法(jointpoint)添加不同种类的操作(通知、增强操处理),最后通过某些方法(weaving、织入操作)实现一个新的代理目标对象。

2.2 有哪些AOP Advice通知的类型?

特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint “周围”维护一系列的拦截器。

前置通知(Before advice) : 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置。

后置通知(After advice) :这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用 @After 注解标记进行配置。

返回后通知(After return advice) :这些类型的 Advice 在连接点方法正常执行后执行,并使用@AfterReturning 注解标记进行配置。

环绕通知(Around advice) :这些类型的 Advice 在连接点之前和之后执行,并使用 @Around 注解标记进行配置。

抛出异常后通知(After throwing advice) :仅在 joinpoint 方法通过抛出异常退出并使用 @AfterThrowing 注解标记配置时执行。

2.3 AOP 有哪些实现方式?

实现 AOP 的技术,主要分为两大类:
静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强; 编译时编织(特殊编译器实现)类加载时编织(特殊的类加载器实现)。

动态代理 - 在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。 JDK 动态代理 JDK Proxy 是 Java 语言自带的功能,无需通过加载第三方类实现;Java 对 JDK Proxy 提供了稳定的支持,并且会持续的升级和更新,Java 8 版本中的 JDK Proxy 性能相比于之前版本提升了很多;

JDK Proxy 是通过拦截器加反射的方式实现的;JDK Proxy 只能代理实现接口的类;JDK Proxy 实现和调用起来比较简单;CGLIB CGLib 是第三方提供的工具,基于 ASM 实现的,性能比较高;CGLib 无需通过接口来实现,它是针对类实现代理,主要是对指定的类生成一个子类,它是通过实现子类的方式来完成调用的。

三、Spring中的bean的作用域有哪些?

singleton:唯一bean实例,Spring中的bean默认都是单例的。

prototype:每次请求都会创建一个新的bean实例。

request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。

session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。

global-session:全局session作用域,仅仅在基于Portlet的Web应用中才有意义,Spring5中已经没有了。Portlet是能够生成语义代码(例如HTML)片段的小型Java Web插件。它们基于Portlet容器,可以像Servlet一样处理HTTP请求。但是与Servlet不同,每个Portlet都有不同的会话。

四、Spring事务中有哪几种事务传播行为?

在TransactionDefinition接口中定义了7个表示事务传播行为的常量。

支持当前事务的情况:
PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。

不支持当前事务的情况:
PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

其他情况:PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值