Spring框架中的常见面试题
目录
什么是MVC?什么是Spring MVC?(高频)
请说说Spring MVC的具体执行流程?(高频)
Lombok中日志的级别有哪些?
日志的使用流程?
介绍一下你对RESTful的理解?
说说你对Spring MVC的理解?
谈谈你对spring AOP的理解?
spring AOP的底层原理是怎样的?
Spring中常见的设计模式有哪些?
Spring声明式事务在哪些场景会失效?
@Component和@Configuration注解的异同点?
GET和POST请求的异同点?
全局异常处理器是什么,异常处理顺序是怎样的?
如何使用session进行会话,session有哪些优缺点?
什么是循环依赖?如何解决循环依赖问题?(高频)
如何进行SQL语句优化?
如何理解请求-响应(request-response)模式?
MyBatis 中的缓存机制是怎样的?
过滤器和拦截器有哪些区别?(高频)
什么是spring AOP,和OOP有什么区别,AOP有什么作用?(高频)
什么是MVC?什么是Spring MVC?(高频)
MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。目的是通过这样的设计使程序结构更加简洁、直观,降低问题的复杂度。其中MVC各个组成部分为:
-
视图(View) - UI设计人员进行图形界面设计,负责实现与用户交互,例如html、css、js等都属于这一层的技术
-
控制器(Controller)- 负责获取请求,处理请求,响应结果,在java中充当控制器对象的一般是servlet。
-
模型(Model) - 实现业务逻辑,数据逻辑实现。(@Service-描述业务层对象,@Repository-描述数据层对象)
请说说Spring MVC的具体执行流程?(高频)
-
客户端发送请求至前端控制器DispatcherServlet;
-
DispatcherServlet收到请求后,调用处理器映射器HandlerMapping;
-
HandlerMapping根据请求URL找到具体的Controller;
-
通过处理器适配器HandlerAdapter适配具体执行该Controller的方式;
-
Controller处理请求,并返回ModelAndView;
-
DispatcherServlet通过ViewReslover(视图解析器)确定负责显示数据的具体View;
-
DispatcherServlet对View进行渲染视图(即将Model填充至视图组件中),并将完整的视图响应到客户端。
Lombok中日志的级别有哪些?
TRACE < DEBUG < INFO < WARN < ERROR
一旦在工程中设置了某个日志级别,则会记录该级别和比该级别严重的日志级别信息;
日志级别设置原则:开发过程中设置为DEBUG,项目上线后设置为INFO;
-
TRACE: 追踪级别, 显示特别详细的日志信息,非常消耗资源,一般不使用;
-
DEBUG: 调试级别,显示比较详细的日志信息,经常用于排查项目中的一些不符合预期的功能,一般在开发过程中设置该级别;
-
INFO: 运行级别,显示工程运行时的一些参数信息,一般项目上线后设置该级别[默认的日志级别];
-
WARN: 警告级别,显示工程运行时的警告信息,需要关注;
-
ERROR: 错误级别,显示工程运行时的错误信息,需要立刻解决;
日志的使用流程?
-
第1步: 添加依赖,刷新Maven[可以通过勾选];
然后再调整pom.xml中Lombok的相关配置
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency>
-
第2步: 配置文件中配置日志级别信息;
# 全局设置为 info logging.level.root=info # 工程目录设置:开发过程设置为debug,上线后设置为 info logging.level.工程目录=debug
-
第3步: 控制器中使用
-
在类上添加 @Slf4j 注解;
-
在方法中使用日志;
-
介绍一下你对RESTful的理解?
RESTful特征的API是一套指导规范,最大限度的降低前后端工程师之间的沟通成本;
-
要求URL地址的域名中尽量体现api字样,并且路径PATH中添加版本控制,资源用名词复数表示;
-
对请求方法做了规范,GET-查询,POST-新增,PUT-更新,DELETE-删除;
-
对HTTP状态码做了规范,200-成功,301-重定向,400-未找到资源;
说说你对Spring MVC的理解?
Spring MVC是基于Spring框架的一种轻量级的Web开发框架,它提供了一系列的组件和工具,用于简化开发Web应用程序的开发过程。Spring MVC采用经典的MVC设计模式,将应用程序分为三个核心部分,分别为模型、视图和控制器。模型负责处理业务逻辑和数据的封装,视图负责展示数据给用户,控制器负责处理用户请求、协调模型和视图。这样可以将应用程序分为多个层次来促进良好的代码结构。其核心功能包括:
强大的请求处理机制:Spring MVC提供了灵活的请求处理机制,可以使用注解或XML配置来映射URL和方法,1.2.视图解析和渲染:Spring MVC支持多种视图技术,如JSP、Thymeleaf、Freemarker等3.强大的表单处理:Spring MVC提供了强大的表单处理支持,包括表单验证、数据绑定和类型转换。它可以自动将请求参数映射到方法的参数上,并提供数据校验和转换功能,大大简化了表单处理的过程。
4.集成测试支持:Spring MVC提供了丰富的集成测试支持,可以通过模拟HTTP请求和断言结果来测试控制器的行为。这使得开发人员可以方便地编写自动化测试来验证系统的功能和逻辑。
谈谈你对spring AOP的理解?
Spring AOP(Aspect-Oriented programming)是Spring框架中的一个核心模块,用于实现面向切面编程的技术。面向切面编程是一种编程范式,通过将横跨多个组件和关注点的功能进行封装和解耦,提高代码的可重用性、可维护性和可测试性。
在Spring AOP中,可以通过声明式的方式将一些横切关注点(cross-cutting concern)应用到模块化的代码中,而不需要修改原始代码。这些关注点可以在应用程序的不同层次中,比如日志记录、事务管理、安全性等。
Spring AOP使用切面(aspect)来定义横切关注点以及它们在目标对象中的应用方式。切面由切点(pointcut)和通知(advice)组成。切点定义了在目标对象中哪些方法会被应用横切关注点,通知定义了在切点被触发时要执行的逻辑。
通知可以分为以下几种类型:
前置通知:在目标方法执行之前执行。
后置通知:在目标方法执行之后(无论是否出现异常)执行。
返回通知:在目标方法正常返回之后执行。
异常通知:在目标方法抛出异常之后执行。环绕通知(Around advice):在目标方法执行前和执行后都可以执行自定义逻辑.Spring AOP可以通过配置文件 (XML)或注解的方式进行配置和管理,使得开发者可以将关注点与业务逻辑分离提高代码的可维护性和可测试性。
总而言之,Spring AOP是一种实现面向切面编程的技术,通过将横切关注点应用到模块化的代码中,提供了更高层次的代码重用和解耦。
spring AOP的底层原理是怎样的?
Spring AOP的底层原理主要是基于动态代理实现的。分别是基于JDK动态代理和基于CGLib动态代理。基于]DK动态代理:当目标对象实现了至少一个接口时,Spring将可使用JDK动态代理。JDK动态代理通过反射机制,在运行时创建一个实现目标接口的代理类,将方法调用转发给代理对象,并给调用前后添加增强逻辑。基于CGLib动态代理:当目标对象没有实现任何接口时,Spring将可使用CGLib动态代理。CGLib动态代理通过维承的方式,创建一个目标类的子类,并重写其中的方法,将方法调用转发给子类,并给调用前后添加增强逻辑。
Spring中常见的设计模式有哪些?
Spring框架中使用了多种设计模式,以下是其中几个常见的设计模式示例:
单例模式(Singleton):Spring中的bean默认使用单例模式,即在容器中只会存在一个实例。这样可以保证资源的复用,提高性能和效率。
工厂模式(Factory) :Spring使用工厂模式来创建和管理bean对象。通过配置文件或注解,Spring可以根据需要动态创建不同类型的bean。
代理模式(Proxy):在Spring AOP中,Spring使用代理模式来对目标对象进行增强。通过代理,可以在目标对象的方法调用前后添加额外的逻辑。
观察者模式(0bserver):Spring的事件驱动模型使用了观察者模式。通过观察者模式,可以实现事件的发布“和订阅,实现不同组件之间的解耦。
适配器模式(Adapter):Spring中的适配器模式用于适配不同的接口或类。例如,Spring的MVC框架中,适配器模式用于将HTTP请求适配到对应的Controler方法。
模板方法模式(Template):Spring中的]dbcTemplate和HibernateTemplate等模板类使用了模板模式。这些模板类提供了固定的算法骨架,具体的实现由子类或回调方法完成。
实际上Spring框架中还存在其他设计模式的应用,这些设计模式有助于提高代码的可维护性、可扩展性和性能。
1.建造模式:BeanDefinitionBuilder(通过此对象构建BeanDefinition对象
2.简单工厂模式:BeanFactory。(用于构建Bean对象的工厂)
3.工厂方法模式:ProxyFactoryBean。(通过Bean对象中的方法构建ProxyFactory)4.单例模式: 单例Bean对象。(作用域为singleton的bean对象)
5.代理模式:Aop Proxy。(JDK代理,CGLIB代理)
策略模式:AOP代理策略,SimpleInstantiationStrategy。6.
7.适配器模式: HandlerAdapter,AdvisorAdapter。
8.模版方法模式:]dbcTemplate。(对]DBC的操作进行了封装,提供了一些访问数据库的模板方法)9.责任链模式:HandlerInterceptor。(SpringMVC中的拦截器,控制对Controller对象方法的方法)10.观察者模式: ApplicationListener(监听服务的启动,销毁,..)
Spring声明式事务在哪些场景会失效?
Spring声明式事务可能失效的场景包括:
1.方法没有被代理:Spring的声明式事务是基于AOP实现的,如果目标方法没有被代理,则事务管理无法生效,。
这可能是因为目标方法不是在Spring容器中被调用,而是在同类的非代理方法中被调用。
异常没有被Spring识别为回滚异常:默认情况下,Spring只对RuntimeException及其子类进行事务回滚。如果被管理的方法抛出的异常不是RuntimeException及其子类,并且没有显示地配置为回滚异常,事务将不会回便
事务方法自调用:如果一个事务方法内部对同一个类中的另一个事务方法进行调用,事务可能会失效。这是因为Spring的AOP是基于代理的,默认情况下,代理对象调用自身的方法是不会触发AOP增强的,所以内部调用的事务方法不会启用事务管理。
使用try-catch捕获异常,但没有重新抛出异常:如果在事务方法中使用try-catch捕获了异常,并且没有重新抛出异常,事务将不会回滚。因为Spring依赖于异常的抛出来触发事务回滚。
@Transactional注解放在了private或protected方法上:默认情况下,Spring只对public方法应用事务管理。如果将@Transactional注解放在了private或protected方法上,事务将无法生效
事务方法被其他非事务方法直接调用:只有在通过AOP代理调用事务方法时,事务才会起作用。如果一个事务6.
方法被其他非事务方法直接调用,那么事务将不会被应用。
未正确配置事务管理器:在Spring配置文件中没有正确配置事务管理器,或者配置了错误的事务管理器,会导7致事务失效。
@Component和@Configuration注解的异同点?
@Component注解通常用于描述一般bean对象,比如具备一定通用性的对象。@Configuration 注解通常用于描述Spring工程中的配置类,是一个增强版的@Component注解,在配置类中定义一些由@Bean注解描述的方法,然后通过这些方法对一些自己定义或第三方的Bean进行对象的创建和初始化。当我们使用这@Configuration注解描述个配置类时,Spring框架底层会为这个@Confiquration注解描述的配置类创建一个CGLIB代理对象,然后由代理对象调用@Bean注解描述的方法,同时底层会检测方法返回的Bean是否已创建,假如已创建则不再创建。使用@Component汪解描还类时,系统底层并不会为此类创建代理对象,只是创建当前类的对象,然后调用@Bean注解描述的方法,创建和初始化Bean,方法每调用一次就会创建一个新的对象。
GET和POST请求的异同点?
GET和POST是HTTP请求方法,用于客户端向服务器发送请求。它们之间的主要区别如下:
参数传递方式:GET请求将参数包含在URL的查询字符串中,例如:http://example.com/search?
keyword=value。而POST请求将参数放在请求的消息体中,不会直接暴露在URL中。
2安全性:GET请求的参数会被保存在浏览器的历史记录、服务器的日志中,甚至可以被书签保存。因此,GET请求在传输敏感信息时不安全。POST请求不会把参数保存在这些地方,相对更安全
参数长度限制:GET请求对参数长度有限制,不同浏览器和服务器有不同的限制。而POST请求则没有特定的长度限制,但实际上仍然存在服务器端的限制。
幂等性:GET请求是幂等的,即多次执行相同的GET请求,服务器的状态和响应结果不会改变。而POST请求是4非幂等的,多次执行相同的POST请求,可能导致服务器状态改变,或者多次创建相同的资源。
缓存机制:GET请求可以被浏览器缓存,下次再请求相同的URL时可以直接读取缓存。而POST请求默认情况下S不会被缓存。
用途:GET请求主要用于获取资源,不应该有副作用。而POST请求主要用于提交数据,可能有副作用,如创6建、更新或删除资源。
总之,需要根据县体的业务需求和安全要求选择使用GET或POST请求方法。一般来说,GET请求适合使用在获取数据的场景,而POST请求适合使用在提交数据的场景。
全局异常处理器是什么,异常处理顺序是怎样的?
GlobalExceptionHandle全局异常处理器,是 Spring Mvc 提供的一种异常处理机制,统一处理由 控制器抛出的异常使用全局异常处理器的原因是 Spring mvc 默认的异常处理机制对用户端非常不友好,所以才会使用全局异常处理器手动处理由控制器抛出的异常
当控制器抛出异常后,异常处理的步骤:
第1步:抛出异常后,首先检查是否定义了全局异常处理器;.
第2步:如果未定义,则使用默认的异常处理机制;
第3步:如果已定义,则会在全局异常处理器中定位处理该异常的处理方法,第4步:如果未找到对应的异常处理方法,则找该异常父类异常的处理方法,
第5步:如果也未找到父类异常的处理方法,则找能处理所有异常的 Throwable 处理方法;第6步:如果也未找到 Throwable 方法,则使用默认的异常处理机制[不友好]
如何使用session进行会话,session有哪些优缺点?
session将会话标识保存到服务器端的数据库中,生成唯一的用户标识session key,并将session key存入浏览器的Cookie中,来实现客户端和服务端的会话;
优点:session key是加密字符串,很难被伪造,所以相对来说比较安全,是之前企业中常用的会话保持技术,缺点:浪费存储资源服务端需要存储大量的用户标识,需要经常删除过期的用户标识,消耗计算机资源
设置唯一会话标识:session.setAttribute(key, value);
获取唯一会话标识:session.getAttribute(key);
删除唯一会话标识:session.removeAttribute(key);
什么是循环依赖?如何解决循环依赖问题?(高频)
循环依赖又叫循环引用,有两个Bean在装配的时候,Bean A依赖于Bean B,然后A既然依赖于B那就去先装配B,但是装配B的时候又发现B依赖于A,然后又返回去装配A,就这样陷入了无限等待装配。像这样两个或多个 Bean 之间相互依赖形成闭环的情况称为循环依赖,会导致这两个或多个Bean永远无法创建,因为每个 Bean 都在等待另一个 Bean 完成初始化。
-
Spring容器初始化ClassA通过构造器初始化对象后提前暴露到Spring容器中的singletonFactorys(三级缓存中)。
-
ClassA调用setClassB方法,Spring首先尝试从容器中获取ClassB,此时ClassB不存在Spring 容器中。
-
Spring容器初始化ClassB,ClasssB首先将自己暴露在三级缓存中,然后从Spring容器一级、二级、三级缓存中一次中获取ClassA 。
-
获取到ClassA后将自己实例化放入单例池中,实例 ClassA通过Spring容器获取到ClassB,完成了自己对象初始化操作。
-
这样ClassA和ClassB都完成了对象初始化操作,从而解决了循环依赖问题。
具体源码中如何实现可以参考spring框架中循环依赖问题的解决方式:三级缓存核心源码分析-CSDN博客
如何进行SQL语句优化?
MySQL语句提高性能的方式_mysql语句有哪些优化方式-CSDN博客
如何理解请求-响应(request-response)模式?
从spring MVC角度理解HTTP协议及Request-Response模式-CSDN博客
MyBatis 中的缓存机制是怎样的?
MyBatis 中的缓存机制是指在执行 SOL语句时将结果缓存到内存中,下次执行相同 SOL 语句时可以直接从缓存中获取结果,提高查询效率。MyBatis 中的缓存机制分为一级缓存和二级缓存,其中一级缓存是默认开启的,生命周期为 SalSession 级别,二级缓存需要手动开启,生命周期为 Mapper 级别。在 MyBatis 中,可以使用 cache 标签来配置缓存,也可以使用@CacheNamespace 注解来开启二级缓存。同时,开发者还可以通过自定义缓存来扩展MyBatis 的缓存机制。
过滤器和拦截器有哪些区别?(高频)
过滤器和拦截器在 web 应用程序中都起到了处理请求和响应的作用,但它们之间存在一些不同
归属不同:拦截器是一个 Spring Mvc 的组件,归 Spring管理,配置在 Spring 文件中,因此能使用 Spring 的任何资源、对象,过滤器不能直接使用Spring的资源、对象等;
执行顺序:过滤器在前,拦截器在后
对于需要更深度地处理请求或使用Spring资源的场景,使用拦截器可能更为合适。而如果仅需要进行一些基本的请求/响应处理,过滤器可能是一个更简单的选择。
作用深度:拦截器能够深入到方法前后等,在使用上具有更大的弹性;
什么是spring AOP,和OOP有什么区别,AOP有什么作用?(高频)
AOP(Aspect Orient programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程(00P)的一种补充和完善。实际项目中我们通常将面向对象理解为一个静态过程(例如一个系统有多少个模块,一个模块有哪些对象,对象有哪些属性),面向切面理解为一个动态过程(例如,在对象运行时动态织入一些扩展功能或控制对象执行)。AOP 与 OOP 字面意思相近,但其实两者完全是面向不同领域的设计思想。实际项目中我们通常将面向对象理解为一个静态过程(例如一个系统有多少个模块,一个模块有哪些对象,对象有哪些属性),面向切面的运行期代理方式,理解为一个动态过程,可以在对象运行时动态织入一些扩展功能或控制对象执行。AOP是切面对象设计思想,Spring中通过代理对象调用切面对象的方法为目标对象做功能增强,这个时候就需要我们定义一个切面对象,在切面对象中定义通知方法,为目标业务进行功能拓展。