首页 > 编程语言 >java面试题(Spring、Spring MVC)

java面试题(Spring、Spring MVC)

时间:2024-09-06 10:23:17浏览次数:15  
标签:面试题 Spring AOP Bean 代理 bean MVC spring

点赞关注+收藏,万分感谢!!

Spring

1、为什么要使用 spring?

spring 提供 ioc 技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。

spring 提供了事务支持,使得事务操作变的更加方便。

spring 提供了面向切片编程,这样可以更方便的处理某一类的问题。

更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。

2、解释一下什么是 aop?

OOP 面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。

AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,

这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证.日志.事务处理。

AOP 实现的关键在于代理模式,AOP 代理主要分为静态代理和动态代理。

静态代理的代表为 AspectJ;动态代理则以 Spring AOP 为代表。

(1)AspectJ 是静态代理的增强,所谓静态代理,就是 AOP 框架会在编译阶段生成AOP 代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到 Java 字节码中,运行的时候就是增强之后的 AOP 对象。

(2)Spring AOP 使用的动态代理,所谓的动态代理就是说 AOP 框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个 AOP 对象,

这个AOP 对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理:

(1) JDK 动态代理只提供接口代理,不支持类代理,核心 InvocationHandler接口和 Proxy 类,InvocationHandler 通过 invoke()方法反射来调用目标类中的代码,

动态地将横切逻辑和业务编织在一起,Proxy 利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。

(2) 如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP 会选择使用 CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,

可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现 AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。

(3) 静态代理与动态代理区别在于生成 AOP 代理对象的时机不同,相对来说 AspectJ 的静态代理方式具有更好的性能,但是 AspectJ 需要特定的编译器进行处理,而 Spring AOP 则无需特定的编译器处理。

InvocationHandler invoke(Object proxy,Method method,Object[]args):proxy 是最终生成的代理实例; method 是被代理目标实例的某个具体方法;args 是被代理目标实例某个方法的具体入参, 在方法反射调用时使用。

3、解释一下什么是 ioc?

(1)IOC 就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到 Spring 容器中,

并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。

DI 依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖 IoC 容器来动态注入对象需要的外部资源。

(2)最直观的表达就是,IOC 让对象的创建不用去 new 了,可以由 spring自动生产,使用 java 的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。

(3)Spring 的 IOC 有三种注入方式 :构造器注入, setter 方法注入, 根据注解注入。

IOC 让相互协作的组件保持松散的耦合,而 AOP 编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。

4、 spring 有哪些主要模块?

spring core:框架的最基础部分,提供 ioc 和依赖注入特性。

spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。

spring dao:Data Access Object 提供了JDBC的抽象层。

spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。

spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。

spring Web mvc:spring 中的 mvc 封装包提供了 Web 应用的 Model-View-Controller(MVC)的实现。

5、spring 常用的注入方式有哪些?

setter 属性注入

构造方法注入

注解方式注入

6、spring 中的 bean 是线程安全的吗?

spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。

实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,

最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。

有状态就是有数据存储功能。

无状态就是不会保存数据。

7、spring 支持几种 bean 的作用域?

spring 支持 5 种作用域,如下:

singleton:spring ioc 容器中只存在一个 bean 实例,bean 以单例模式存在,是系统默认值;

prototype:每次从容器调用 bean 时都会创建一个新的示例,既每次 getBean()相当于执行 new Bean()操作;

Web 环境下的作用域:

request:每次 http 请求都会创建一个 bean;

session:同一个 http session 共享一个 bean 实例;

global-session:用于 portlet 容器,因为每个 portlet 有单独的 session,globalsession 提供一个全局性的 http session。

注意:使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。

8、spring 自动装配 bean 有哪些方式?

no:默认值,表示没有自动装配,应使用显式 bean 引用进行装配。

byName:它根据 bean 的名称注入对象依赖项。

byType:它根据类型注入对象依赖项。

构造函数:通过构造函数来注入依赖项,需要设置大量的参数。

autodetect:容器首先通过构造函数使用 autowire 装配,如果不能,则通过 byType 自动装配。

9、spring 事务实现方式有哪些?

(1)编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。

(2)基于 TransactionProxyFactoryBean的声明式事务管理。

(3)基于 @Transactional 的声明式事务管理。

(4)基于Aspectj AOP配置事务。

10、说一下 spring 的事务隔离?

spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:

ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;

ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);

ISOLATIONREADCOMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;

ISOLATIONREPEATABLEREAD:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;

ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

「脏读」 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。

「不可重复读」 :是指在一个事务内,多次读同一数据。

「幻读」 :指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。

发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

11、spring 循环依赖?

①构造器的循环依赖:这种依赖spring是处理不了的,直接抛出BeanCurrentlylnCreationException异常。

②单例模式下的setter循环依赖:通过“三级缓存”处理循环依赖,能处理。

③非单例循环依赖:无法处理。原型(Prototype)的场景是不支持循环依赖的,通常会走到AbstractBeanFactory类中下面的判断,抛出异常。

singletonObjects (一级缓存)它是我们最熟悉的朋友,俗称“单例池”“容器”,缓存创建完成单例Bean的地方。

earlySingletonObjects(二级缓存)映射Bean的早期引用,也就是说在这个Map里的Bean不是完整的,甚至还不能称之为“Bean”,只是一个Instance.

singletonFactories(三级缓存) 映射创建Bean的原始工厂

spring通过三层缓存的方式提前暴露已经实例化但没有进行属性设置的对象来解决循环依赖。

Spring首先从singletonObjects(一级缓存)中尝试获取,如果获取不到并且对象在创建中,则尝试从earlySingletonObjects(二级缓存)中获取,

如果还是获取不到并且允许从singletonFactories通过getObject获取,则通过singletonFactory.getObject()(三级缓存)获取。如果获取到对象则放入二级缓存中。

12、Spring Bean的生命周期?

① Spring对Bean实例化;

② Spring将值和Bean的引用注入到Bean对应的属性中;

③ 如果Bean实现了BeanNameAware接口,Spring将调用setBeanName()方法传递Bean的ID到BeanFactory中;

④ 如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactroy()方法,将BeanFactory容器实例传入,便于Bean够获取配置他们的BeanFactory的引用;

⑤ 如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将Bean所在应用上下文的引用传进来,便于bean获取它所在的Spring容器;

⑥ 如果Bean实现了BeanPostProcessor接口,Spring将调用postProcessBeforeInitialization()方法,该方法在Bean初始化之前调用。

如果Bean在Spring配置文件中配置了init-method属性,该方法将会自动调用。

⑦ 如果Bean实现了InitializingBean接口,Spring将调用它的afterPropertiesSet()方法,当Bean的所用属性被设置完成之后调用该方法;

⑧ 如果Bean实现了BeanPostProcessor接口,Spring将调用它的postProcessAfterInitialization()方法,在Bean初始化完成之后调用;

⑨ 此时Bean准备就绪;

⑩ 如果Bean实现了DisposableBean接口,spring将调用它的destory()方法。如果Bean在Spring配置文件中配置了destory-method属性,该方法将会自动调用。

13、BeanFactory 和 ApplicationContext 有什么区别?

BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,都可以当做 Spring 的容器。其中 ApplicationContext 是 BeanFactory 的子接口。

(1)BeanFactory:是 Spring 里面最底层的接口,包含了各种 Bean 的定义,读取 bean 配置文档,管理 bean 的加载.实例化,控制 bean 的生命周期,维护 bean 之间的依赖关系。

ApplicationContext 接口作为 BeanFactory 的派生。

(2)BeanFactroy 采用的是延迟加载形式来注入 Bean 的,即只有在使用到某个 Bean 时(调用 getBean()),才对该 Bean 进行加载实例化。这样,我们就不能发现一些存在的 Spring 的配置问题。

如果 Bean 的某一个属性没有注入,BeanFacotry 加载后,直至第一次使用调用 getBean 方法才会抛出异常。

ApplicationContext,它是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现 Spring 中存在的配置错误,这样有利于检查所依赖属性是否注入。

ApplicationContext 启动后预载入所有的单实例Bean,通过预载入单实例 bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。

相对于基本的 BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置 Bean 较多时,程序启动较慢。

(3)BeanFactory 通常以编程的方式被创建,ApplicationContext 还能以声明的方式创建,如使用 ContextLoader。

(4)BeanFactory 和 ApplicationContext 都支持。BeanPostProcessor.BeanFactoryPostProcessor 的使用,但两者之间的区别是:BeanFactory 需要手动注册,而 ApplicationContext 则是自动注册。

Spring MVC

1、spring mvc是什么?

SpringMVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架,通过把 Model,View,Controller 分离,将 web 层进行职责解耦,

把复杂的 web 应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

2、说一下 spring mvc 运行流程?

(1)用户发送请求至前端控制器 DispatcherServlet;

(2) DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取 Handler;

(3)处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet;

(4)DispatcherServlet 调用 HandlerAdapter 处理器适配器;

(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);

(6)Handler 执行完成返回 ModelAndView;

(7)HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给DispatcherServlet;

(8)DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;

(9)ViewResolver 解析后返回具体 View;

(10)DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)

(11)DispatcherServlet 响应用户。

3、spring mvc 有哪些组件?

(1)前端控制器 DispatcherServlet(不需要程序员开发)

作用:接收请求.响应结果,相当于转发器,有了 DispatcherServlet 就减少了其它组件之间的耦合度。

(2)处理器映射器 HandlerMapping(不需要程序员开发)

作用:根据请求的 URL 来查找 Handler

(3)处理器适配器 HandlerAdapter

注意:在编写 Handler 的时候要按照 HandlerAdapter 要求的规则去编写,这样适配器 HandlerAdapter 才可以正确的去执行 Handler。

(4)处理器 Handler(需要程序员开发)

(5)视图解析器 ViewResolver(不需要程序员开发)

作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)

(6)视图 View(需要程序员开发 jsp)View 是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)

4、@RequestMapping 的作用是什么?

将 http 请求映射到相应的类/方法上。

5、@Autowired 的作用是什么?

@Autowired 它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,通过@Autowired 的使用来消除 set/get 方法。

标签:面试题,Spring,AOP,Bean,代理,bean,MVC,spring
From: https://blog.csdn.net/2301_76737782/article/details/141952461

相关文章

  • JavaWeb - Spring Boot - 请求参数
    @RequestMapping从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。SpringMVC接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。@RequestMapping标识一个类:设置映射请求的请求路径的初始信......
  • SpringMVC-05-Json
    1、什么是JSON?JSON:JavaScriptObjectNotation(JS对象描述法)。JSON是一种存储和交换数据的语法。JSON是通过JS对象描述法书写的文本,用字面文本的形式来表示一个JS对象2、为什么要使用JSON?JSON是一种轻量级的数据交换格式,伴随着JavaScript语言的火爆,目前使用特别广泛。......
  • Spring、SpringMVC、SpringBoot都是什么,有什么区别
    Spring、SpringMVC、SpringBoot都是什么,有什么区别Spring:是一个轻量级的基于IOC和AOP的容器框架,是用来简化开发流程的一套框架。IOC:InversionofController控制反转。不好理解的概念:应用不负责依赖对象的创建,而是把它们创建的控制器交给外部容器,这种控制权的转移就是控......
  • freeRTOS面试题目 面经 单片机面经汇总MCU RTOS常见面试经验汇总 freeRTOS消息队列 信
    常见rtos部分Linux题目汇总FreeRtos面经30题前后台程序与实时操作系统的区别是什么?实时系统的基本特性有哪些?什么是不可剥夺型内核?它的特点是什么?可剥夺型内核的定义及适用场景是什么?什么是可重入型函数?它有什么特点?使用可剥夺型内核时,为什么不应直接使用不可重入型函数......
  • springboot美容院管理系统
      运行环境环境说明:开发语言:java框架:springboot,vueJDK版本:JDK1.8数据库:mysql5.7+(推荐5.7,8.0也可以)数据库工具:Navicat11+开发软件:idea/eclipse(推荐idea)Maven包:Maven3.3.9+系统实现管理员功能实现美容部位管理实现管理员权限的美容部位管理功能,其运行......
  • 基于springboot的“衣依”服装销售平台的设计与实现
      运行环境环境说明:开发语言:java框架:springboot,vueJDK版本:JDK1.8数据库:mysql5.7+(推荐5.7,8.0也可以)数据库工具:Navicat11+开发软件:idea/eclipse(推荐idea)Maven包:Maven3.3.9+系统详细实现管理员模块的实现商品信息管理“衣依”服装销售平台的系统管理员......
  • Java毕业设计基于SpringBoot的超市在线销售系统(源码+文档+调试+讲解)
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍该超市在线销售系统采用B/S架构、并采用java语言以及springboot框架进行开发。该系统主要设计并完成了管理过程中的用户注册登录、个人信息修改、用户、普通管理员、商品信息、留言......
  • A160-springboot协同过滤鲜花商城推荐系统
    (======查看博主个人介绍,源码不易,有偿获取,联系方式-个人简介========)介绍基于Springboot+vue+协同过滤+前后端分离+鲜花商城推荐系统(用户,多商户,管理员)【运行环境】IdeaJDK1.8MavenMySQLNginxVscode【技术栈】SpringBoot,SSM,MYSQL,Vue,Layui,JQUERY,HTML,CSS,J......
  • springboot+vue+mybatis计算机毕业设计房屋租赁管理系统+PPT+论文+讲解+售后
    随着社会的不断进步与发展,人们经济水平也不断的提高,于是对各行各业需求也越来越高。特别是从2019年新型冠状病毒爆发以来,利用计算机网络来处理各行业事务这一概念更深入人心,由于工作繁忙以及疫情的原因,房屋租赁也是比较难实施的。如果开发一款房屋租赁管理系统,可以让用户在最......
  • Java毕业设计基于SpringBoot的毕业设计管理系统(源码+文档+调试+讲解)
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍本论文主要完成不同用户的权限划分,不同用户具有不同权限的操作功能,在学生模块,主要有学生进行注册和登录,学生可以查看开题报告、中期检查、论文提交、论文指导、毕业答辩等,还能......