Spring 基础知识

1. Spring框架通过多种方式来保障线程安全。
  1. 使用线程安全的数据结构:Spring框架中使用的数据结构,如ConcurrentHashMap等,都是线程安全的,可以保证在多线程环境下数据的正确性。

  2. 对象锁定:Spring框架使用锁定机制来保障对象的安全性。例如,在执行数据库操作时,Spring可以对数据库连接对象进行锁定,以保证在多线程环境下数据的正确性。

  3. 使用线程池:Spring框架可以使用线程池来管理线程,避免因线程数量过多导致的性能问题。

  4. 使用事务管理:Spring框架的事务管理功能可以保证在多线程环境下数据的一致性。例如,在执行数据库操作时,如果出现异常,Spring可以回滚事务,以保证数据的完整性。

  5. 使用单例模式:Spring框架中的许多组件都使用单例模式,以保证在多线程环境下数据的正确性。

2. Spring 中有哪些设计模式?

简单工厂:Beanfactory

工厂方法:FactoryBean的getObject方法

单例模式:Spring仅实现了类的实例的全局访问点

适配器模式:controller

装饰器模式:类名包含wrapper、Decorator的类

策略模式:实现的Resource接口,访问不同的资源

动态代理:Aop

观察者模式:spring的listener就是用的观察者模式

单例模式: Spring 的 Bean 默认是单例模式,即一个 Bean 对象只会被创建一次并在整个应用中共享。这种方式可以提高性能和资源利用率。

工厂模式: Spring 使用工厂模式来创建和管理 Bean 对象,即通过 BeanFactory 或 ApplicationContext 等容器来创建和管理 Bean 对象。这种方式可以将对象的创建和管理解耦,并且可以灵活地配置和管理对象。

代理模式:Spring 使用代理模式来实现 AOP(面向切面编程),即通过代理对象来增强原始对象的功能。这种方式可以实现横切关注点的复用,并且可以在不修改原始对象的情况下实现功能增强。

观察者模式:Spring 使用观察者模式来实现事件驱动编程,即通过事件监听机制来处理事件。这种方式可以实现松耦合,使得对象之间的交互更加灵活。

模板方法模式:Spring 使用模板方法模式来实现 JdbcTemplate、HibernateTemplate 等模板类,即将相同的操作封装在模板方法中,而将不同的操作交给子类来实现。这种方式可以减少重复代码,提高代码的复用性。

适配器模式:Spring 使用适配器模式来实现不同接口之间的适配,如 Spring MVC 中的 HandlerAdapter 接口,可以将不同类型的 Controller 适配为统一的处理器。

3.Spring 中的注解有哪些?它们的具体作用是什么?

Spring 中的注解有很多,以下是一些常用的注解和它们的作用:

1、@Autowired

@Autowired 注解用于自动装配,将匹配类型的 bean 自动连接到指定的字段、方法或构造函数上,从而简化了依赖注入的过程。

@Autowired和@Resource都是Spring中用于依赖注入的注解,它们的作用都是将一个bean注入到另一个bean中,

但两者有以下区别:

1.1、注入方式不同:

@Autowired是按照类型来自动装配的,它通过byType的方式实现自动装配,如果容器中有多个类型匹配的bean,那么会抛出异常。

@Resource默认按照名称来装配,它通过byName的方式实现自动装配,如果指定了name属性,那么会按照名称装配,如果没有指定name属性,那么会按照类型装配。

1.2、来源不同:

@Autowired是Spring提供的注解,而@Resource是JSR-250规范中定义的注解,因此@Autowired是Spring特有的注解,而@Resource是JavaEE的注解,它们的使用范围不同。

1.3、注入方式不同:

@Autowired只能注入其他bean类型的属性。

@Resource既可以注入其他bean类型的属性,也可以注入普通类型的属性。

1.4、属性不同:

@Autowired没有额外的属性。

@Resource有两个重要的属性,分别是name和type,其中name属性用于指定bean的名称,type属性用于指定bean的类型。

总的来说,@Autowired和@Resource都是用于实现依赖注入的注解,但使用方式和实现方式略有不同,开发者可以根据需要选择使用哪个注解。

4.Spring 中的 MVC 模式是什么?它的作用是什么?它的执行原理是什么?

Spring MVC是一种基于MVC(Model-View-Controller)模式的Web框架,它通过将web应用程序分为模型、视图和控制器三个部分,来实现业务逻辑、用户交互和请求处理的分离。

Spring MVC的主要作用是提供一种灵活、高效、可扩展的Web应用程序开发框架,使开发人员可以更加方便地开发出高质量的Web应用程序。

Spring MVC的执行原理如下:

Spring MVC中的核心组件包括:

1、DispatcherServlet:Spring MVC的核心组件,负责接收客户端请求并将请求分派给相应的处理程序。

2、HandlerMapping:负责将请求映射到相应的处理程序。

3、Controller:处理请求并生成模型和视图信息。

4、ViewResolver:将逻辑视图名称解析为实际视图对象。

5、View:负责渲染模型数据并生成响应。

6、Model:用于存储和传递数据。

7、ModelAndView:包含模型和视图信息。

总的来说,Spring MVC是一种基于MVC模式的Web框架,它的作用是实现业务逻辑、用户交互和请求处理的分离,提高Web应用程序的可维护性和可扩展性。

它的执行原理是通过前置控制器、请求映射、业务逻辑处理、视图解析和渲染等组件的协作,将用户请求处理成最终的响应结果。

5.Spring 中的事务是什么,如何进行事务管理?常用的事务管理方式有哪些?

Spring中的事务是指对数据库操作的一系列操作,可以确保一组操作要么全部成功要么全部失败,保持数据的一致性。

Spring提供了声明式和编程式两种事务管理方式。

在Spring中进行事务管理,需要使用事务管理器,并将其配置为Spring中的Bean。

Spring提供了多个事务管理器,如JDBC事务管理器、Hibernate事务管理器、JTA事务管理器等。

在进行事务管理时,可以使用注解或XML进行配置。

1、对于声明式事务,需要使用Spring AOP来实现。可以通过@Transactional注解或XML配置来定义事务。

1.1、在基于注解的方式中,只需要在需要添加事务的方法上添加@Transactional注解即可。

1.2、在基于XML的方式中,需要使用tx:advice元素和tx:attributes元素分别定义事务通知和事务属性。

2、对于编程式事务,需要在代码中显式调用事务管理器的API来控制事务。可以使用Spring提供的TransactionTemplate类来简化编程式事务的处理。

总的来说,Spring的事务管理功能可以帮助我们完成复杂的数据库操作,并确保数据的一致性。

通过声明式事务和编程式事务的方式,我们可以根据实际需求选择最合适的方式来进行事务管理。

常用的事务管理方式有以下几种:

1、JDBC事务:Spring中最基本的事务管理方式,它直接使用JDBC连接来管理事务。使用JdbcTemplate进行数据库操作,并在事务管理器中启用事务。

2、Hibernate事务:使用Hibernate框架的事务管理方式,它使用Hibernate的事务管理器来管理事务。使用Session进行数据库操作,并在事务管理器中启用事务。

3、JTA事务:使用Java事务API的事务管理方式,它可以管理多个资源的事务。使用JTA事务管理器来管理事务,并使用JNDI查找DataSource和其他资源。

4、MyBatis事务:使用MyBatis框架的事务管理方式,它使用SqlSession进行数据库操作,并在事务管理器中启用事务。

5、MongoDB事务:MongoDB 4.0及以上版本支持事务,Spring提供了MongoTransactionManager来管理MongoDB事务。

总的来说,不同的事务管理方式适用于不同的场景和需求。我们需要根据实际情况来选择最适合的事务管理方式。

6.Spring 中的事务传播行为有哪些?

Spring中的事务传播行为是指在多个事务方法相互调用的情况下,不同方法之间事务如何进行传播和交互的规则。

Spring框架提供了七种不同的事务传播行为,分别是:

1、PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新的事务。这是默认的传播行为。

2、PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果不存在事务,则以非事务的方式继续执行。

3、PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果不存在事务,则抛出异常。

4、PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起该事务。

5、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起该事务。

6、PROPAGATION_NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。

7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果不存在事务,则创建一个新的事务。

这些传播行为可以通过TransactionDefinition接口中的常量来指定。

7.Spring 中的过滤器和拦截器有什么区别?

Java过滤器和拦截器在以下六个方面存在区别:

  1. 实现原理:拦截器是基于Java的反射机制,而过滤器是基于函数回调。

  2. 依赖关系:拦截器不依赖与servlet容器,而过滤器则依赖于servlet容器。

  3. 功能范围:拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

  4. 访问权限:拦截器可以访问action上下文、值栈里的对象,而过滤器不能。

  5. 生命周期:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

  6. IOC容器的访问:拦截器可以获取IOC容器中的各个bean,而过滤器则不能。

总结来说,过滤器和拦截器在实现原理、依赖关系、功能范围、访问权限、生命周期以及IOC容器的访问等方面存在差异。

Spring 中的过滤器和拦截器都可以对请求进行处理,但它们有一些不同点:

1、运行位置不同:过滤器是在请求到达 Servlet 容器之前进行处理的,而拦截器是在请求到达 Spring MVC 控制器之前或之后进行处理的。

2、依赖不同:过滤器是依赖于 Servlet 容器的,而拦截器是依赖于 Spring MVC 框架的。

3、作用时间不同:过滤器在请求进入 Servlet 容器前执行,而拦截器在请求进入 Spring 容器后执行。

4、功能不同:过滤器主要用于对请求进行过滤和处理,比如编码转换、请求处理时间统计等;拦截器主要用于对请求进行增强处理,比如权限验证、日志记录等。

总的来说,过滤器是在 Servlet 容器层面上对请求进行处理的,而拦截器是在 Spring MVC 框架层面上对请求进行处理的,过滤器更加底层,可以对请求进行一些底层的处理,而拦截器更加高级,可以对请求进行一些业务逻辑层面的处理。在实际开发中,可以根据具体的需求选择使用过滤器或者拦截器。

8.Spring 中的声明式事务和编程式事务有什么区别?

声明式事务和编程式事务是Spring中两种实现事务管理的方式,

它们之间的区别主要有以下几点:

1.编程式事务需要在代码中显式调用事务管理器的API来控制事务,而声明式事务是通过配置实现的,无需在代码中添加事务管理代码。

2.声明式事务使用AOP技术,在方法调用前后自动添加事务控制代码,而编程式事务需要手动编写事务控制代码。

3.声明式事务将业务逻辑和事务管理分离,使得代码更加清晰和易于理解,而编程式事务将业务逻辑和事务管理混在一起,代码可读性和可维护性较差。

4.声明式事务只适用于对单个数据库的事务管理,对于跨多个数据源或资源的事务管理,需要使用编程式事务或JTA事务。

总的来说,声明式事务相对于编程式事务具有更高的可读性、可维护性和代码清晰度,因此更加常用。

但是对于一些复杂的事务场景,编程式事务可能更加灵活,可以满足更多的需求。需要根据实际情况选择最适合的事务管理方式。

9.Spring 中如何使用缓存?

在 Spring 中,可以通过使用缓存来提高应用程序的性能和响应速度。

Spring 提供了对缓存的支持,可以使用注解来简化缓存的使用。

常见的缓存注解包括 @Cacheable、@CachePut、@CacheEvict 等。

使用这些注解可以方便地将方法的返回值缓存起来,下次调用该方法时可以直接从缓存中获取结果,避免重复计算。

10常用的缓存框架有哪些?

常用的缓存框架包括:

2.1、Ehcache:一个基于 Java 的开源缓存框架,具有高速、高效、易用等特点。

2.2、Memcached:一个高性能的分布式内存缓存系统,常用于缓存 Web 应用的数据。

2.3、Redis:一个高速的 Key-Value 存储系统,支持多种数据结构和高级功能,如事务、发布/订阅、Lua 脚本等。

2.4、Caffeine:一个基于 Java 的高速缓存库,具有高速、高效、伸缩性等特点。

2.5、Guava Cache:Google 提供的一个基于 Java 的本地缓存框架,具有高速、高效、内存管理等特点。

在使用缓存框架的过程中,需要关注缓存的一致性和缓存的更新策略,确保缓存数据的有效性和正确性。

在使用缓存框架时需要根据具体的需求选择合适的框架,考虑因素包括缓存的大小、分布式支持、性能、易用性等。

相关推荐
豌豆花下猫4 分钟前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai
YMWM_6 分钟前
第一章 Go语言简介
开发语言·后端·golang
y250810 分钟前
《Object类》
java·开发语言
曙曙学编程11 分钟前
初级数据结构——树
android·java·数据结构
BestandW1shEs17 分钟前
彻底理解消息队列的作用及如何选择
java·kafka·rabbitmq·rocketmq
爱吃烤鸡翅的酸菜鱼19 分钟前
Java算法OJ(8)随机选择算法
java·数据结构·算法·排序算法
码蜂窝编程官方23 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
Viktor_Ye39 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm41 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
一二小选手1 小时前
【Maven】IDEA创建Maven项目 Maven配置
java·maven