Spring面试题系列-6

简介: Spring面试题系列-6


Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

Spring中的单例Beans是线程安全的吗?

Spring框架中的单例Beans在创建时是线程安全的,但在使用时是否线程安全取决于具体的设计和实现

首先,Spring 容器在初始化 Beans 时会保证单例 Bean 的线程安全。这是因为 Spring 容器在启动时会一次性创建所有的单例 Beans,并且每个 Bean 只会被实例化一次。这个过程是线程安全的,因为 Spring 容器会确保在多线程环境下,每个 Bean 的实例化过程不会被打断或并发执行。

其次,当涉及到 Bean 的使用,即在多个线程中共享同一个单例 Bean 实例时,是否线程安全则取决于 Bean 本身的状态和实现。如果一个单例 Bean 是无状态的,也就是说它不保持任何可以由多个线程修改的状态,那么它是线程安全的。例如,Spring MVC 的 Controller、Service、Dao 等通常设计为无状态的,它们主要处理请求并返回响应,不涉及共享状态的修改。

最后,如果单例 Bean 持有可变状态,比如成员变量可以被多个线程修改,那么就需要考虑线程安全问题。在这种情况下,可以通过多种方式来确保线程安全,例如使用同步机制(如synchronized关键字)、线程局部变量(ThreadLocal)或者将 Bean 的作用域改为原型(prototype),后者会为每个请求创建一个新的 Bean 实例。

综上所述,Spring 中的单例 Beans 在创建时是线程安全的,但在实际使用中是否线程安全则需要根据 Bean 的设计和使用情况来判断。开发者应当注意识别和管理那些可能影响线程安全的状态,以确保应用程序的正确性和稳定性。

Spring中事务传播行为

Spring框架定义了七种事务传播行为,它们分别是:

  1. REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认的传播行为。
  2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  3. MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  4. REQUIRES_NEW:重新创建一个新的事务,并且暂停传播过来的事务。
  5. NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则暂停当前的事务。
  6. NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。
  7. NESTED:如果没有事务,就新建一个事务;如果有,就在当前事务中嵌套其他事务。

这些传播行为可以解决业务层方法之间的事务调用问题,确保多个方法之间的事务处理更加灵活和可控。例如,当一个业务方法中调用另一个业务方法时,可以通过指定传播行为来决定是否在现有事务中运行,或者开启新的事务等。这样可以避免因为一条处理失败而导致之前所有的处理都回滚的情况,从而提供更精细的事务控制策略。

Spring事务中的隔离级别有哪几种?

Spring事务中定义了五种隔离级别,分别是:

  • DEFAULT:这是默认的隔离级别,它使用数据库默认的事务隔离级别。如果数据库没有设置默认的隔离级别,那么将使用与JDBC相同的隔离级别。
  • READ_UNCOMMITTED:这是最低的隔离级别,它允许一个事务读取另一个尚未提交的事务的数据。这种隔离级别可能会导致脏读、不可重复读和幻读。
  • READ_COMMITTED:这个隔离级别确保一个事务修改的数据在提交后才能被另一个事务读取,从而避免了脏读。然而,它可能会导致不可重复读和幻读。
  • REPEATABLE_READ:这个隔离级别确保在一个事务的整个过程中,读取的每一行数据都可以多次读取且不会发生改变,避免了不可重复读,但可能会出现幻读。
  • SERIALIZABLE:这是最严格的隔离级别,它通过强制事务串行执行来避免脏读、不可重复读和幻读。

总的来说,选择合适的事务隔离级别是在保证数据一致性和系统性能之间做出平衡的重要决策。

Spring中用到了哪些设计模式?

Spring框架中用到了很多设计模式,主要包括以下几种

  • 依赖注入模式(DI):这是Spring框架的核心设计模式之一,用于管理对象之间的依赖关系。通过DI,Spring容器可以自动地将依赖项注入到组件中,从而减少了组件之间的耦合。
  • 单例模式:在Spring中,Bean默认是以单例的方式创建的,即在整个应用中只有一个实例。这可以通过Spring容器的配置文件来设置。
  • 原型模式:与单例模式相对,原型模式允许每次请求都创建一个新的Bean实例。这适用于需要每个请求有独立状态的场景。
  • 工厂模式:Spring使用工厂模式通过BeanFactoryApplicationContext来创建和管理Bean对象。这使得对象的创建过程更加灵活和可配置。
  • 代理模式:Spring AOP(面向切面编程)功能通过代理模式实现,可以在不修改源代码的情况下为对象添加额外的行为,例如事务管理和安全检查。

除了上述提到的设计模式,Spring框架在其内部还使用了其他一些设计模式,如模板方法模式、策略模式等,这些设计模式共同工作,使得Spring框架能够提供灵活、可扩展的解决方案来满足企业级应用的需求。

相关文章
|
7天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
25 2
|
4月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
119 0
|
1月前
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
|
5月前
|
消息中间件 缓存 Java
Spring Boot最经典的20道面试题,你都会了吗?
Spring Boot最经典的20道面试题,你都会了吗?
181 0
|
1月前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
121 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
6月前
|
Java 数据库连接 数据库
spring--为web(1),富士康java面试题整理
spring--为web(1),富士康java面试题整理
|
2月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
123 3
|
3月前
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
3月前
|
前端开发 Java 开发者
Spring常见面试总结(上)
Spring框架是为Java应用提供全面支持的平台,帮助开发者处理基础任务,专注于业务逻辑。它具备IOC(控制反转)和AOP(面向切面编程)等功能,支持MVC架构、事务管理和JDBC异常处理。Spring的IOC容器负责对象的创建、配置及生命周期管理。依赖注入包括构造函数、setter和接口注入等方式。`@Component`、`@Controller`、`@Repository`和`@Service`等注解用于组件识别和装配。`@Autowired`用于精确控制依赖注入。
28 0
下一篇
无影云桌面