【面试篇】SpringIoC、AOP、MVC面试实战

news2024/11/24 5:07:57

version:1.0

文章目录

  • Spring
    • Spring基础 / IoC
      • 🙎‍♂️面试官:举例Spring的模块?
      • 🙎‍♂️面试官:Spring、SpringMVC、Spring Boot关系?
      • 🙎‍♂️面试官:说说对SpringIoC的了解?
      • 🙎‍♂️面试官:什么是Spring Bean?
      • 🙎‍♂️面试官:Bean的作用域?
      • 🙎‍♂️面试官:Bean的生命周期?
      • 🙎‍♂️面试官:单例Bean的线程安全问题了解吗?
      • 🙎‍♂️面试官:@Component 和 @Bean 注解的区别是什么?
      • 🙎‍♂️面试官:项目中是怎么实现依赖注入的?
      • 🙎‍♂️面试官:@Autowired 和 @Resource 的区别是什么?
    • Spring AOP
      • 🙎‍♂️面试官:说说自己对于AOP的了解?
      • 🙎‍♂️面试官:Spring AOP 和 AspectJ AOP 有什么区别?
      • 🙎‍♂️面试官:AspectJ 定义的通知类型有哪些?
    • Spring MVC
      • 🙎‍♂️面试官:说说自己对于Spring MVC的了解?
      • 🙎‍♂️面试官:Spring MVC 的核心组件?
      • 🙎‍♂️面试官:Spring MVC 的工作流程?

在这里插入图片描述

Spring

Spring基础 / IoC

🙎‍♂️面试官:举例Spring的模块?

🙋‍♂答:

Spring是一套为了简化企业级开发的开源框架,主要思想是Spring IoC 和Spring AOP。

spring-core:Spring框架基本的核心组件,包含很多关键类。

spring-beans:提供对bean的创建、解析等功能的支持。

spring-aspects :该模块为 AspectJ 的集成提供支持。

spring-aop :提供对面向切面的编程的支持。

spring-webmvc : 提供对 Spring MVC 的实现。

🙎‍♂️面试官:Spring、SpringMVC、Spring Boot关系?

🙋‍♂答:

Spring MVC是Spring中的一个重要模块,可以帮助我们快速构建MVC架构的Web应用。

Spring Boot可以简化可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。
但是在需要构建MVC架构的程序时,还是需要使用Spring MVC作为MVC框架。

🙎‍♂️面试官:说说对SpringIoC的了解?

🙋‍♂答:

IoC是控制反转。我们直接使用注解,就可以将对象装配到IoC容器中,那么很多问题都交给了IoC容器来处理,不需要我们去关心对象的创建问题、依赖问题。这样就很大程度上简化了程序的开发。

🙎‍♂️面试官:什么是Spring Bean?

🙋‍♂答:

Spring Bean就是IoC容器所要管理的对象。通过注解的方式,我们可以告诉IoC容器管理什么对象。

Spring装配对象的四个注解:

  • @Component(组件):装配普通组件到IOC中。

  • @Repository(仓库):装配持久化层到IOC中。

  • @Service(业务):装配业务逻辑层到IOC中。

  • @Controller(控制):装配控制层/表示层组件到IOC中。

🙎‍♂️面试官:Bean的作用域?

🙋‍♂答:

Bean的作用域定义了Bean的生命周期和可见性。我们可以使用@Scope注解管理Bean的作用域。Bean有四个常用的作用域:

  • singleton【默认值】:是对单例设计模式的应用,随着IoC容器的创建而创建,随着容器的销毁而销毁。在这过程中,只会创建一个Bean对象。
  • prototype:每次请求创建一个对象,每次通过容器获取Bean时,都会返回一个新的对象。在使用Prototype作用域时,Spring不会对Bean的生命周期进行管理,需要手动处理Bean的销毁。
  • request:在一个HTTP请求中,Spring容器创建一个Bean对象;请求关闭,Bean也会被销毁。
  • session:在同一个HTTP会话中,即使存在多次请求,Spring容器也只会创建一个Bean对象;关闭浏览器,Bean实例被销毁。
    因为cookie丢失,由于session是由cookie来维护的,所以会话信息也会丢失。

🙎‍♂️面试官:Bean的生命周期?

🙋‍♂答:

  1. 实例化:Spring容器根据Bean的定义来进行实例化。可以通过构造函数实例化或通过工厂方法创建实例。
  2. 属性赋值:Spring会通过依赖注入的方法为Bean注入初始值。
  3. 初始化:调用Bean的初始化回调方法。可以使用@PostConstruct注解标注自定义的初始化方法。
  4. 使用:Bean已经被实例化,可以使用。
  5. 销毁:可以使用@PreDestroy注解标注自定义的销毁方法。

🙎‍♂️面试官:单例Bean的线程安全问题了解吗?

🙋‍♂答:

大部分的Bean都是没有实例变量的,比如Dao、Service。但是如果在Bean中定义成员变量,在多线程操作Bean时就可能出现线程安全问题。可以用以下解决方案:

  1. 避免定义成员变量。
  2. 使用ThreadLocal,ThreadLoacl是线程隔离的,每个线程都有自己的副本,可以防止多线程操作共享变量带来的问题。

项目中的HostHolder用到了ThreadLocal。

🙎‍♂️面试官:@Component 和 @Bean 注解的区别是什么?

🙋‍♂答:

  • 作用的位置不同。@Component注解作用于类,@Bean注解作用于方法。

  • 装配对象到IoC容器的方式不同

    • @Component通过组件扫描来自动检测和装配到Spring容器中。
    • @Bean注解标识的方法Spring只会调用一次,用来产生一个Bean对象。随后Spring将会将这个Bean对象放在自己的IOC容器中。
  • 在使用第三方类库中的类要装配到Spring容器时只能使用@Bean注解。

    • 比如项目中用来操作Redis数据库的RedisTemplate就是使用@Bean注解注入的。

🙎‍♂️面试官:项目中是怎么实现依赖注入的?

🙋‍♂答:

使用Spring的注解@Autowire实现依赖注入,比如我们的项目中,Controller层依赖于Service层,Service层依赖于Dao层。那么我们就可以使用@Autowire实现依赖注入,将对应的Bean对象注入到我们的属性中,之后直接使用这个属性即可。这样我们就可以实现层与层之间的解耦,减少对象之间的依赖关系。

🙎‍♂️面试官:@Autowired 和 @Resource 的区别是什么?

🙋‍♂答:

  • 两者的依赖注入方式不同。
    • @Autowired默认注入方式为byType,根据类型进行匹配。但是如果一个接口存在多个实现类,就会使用byName进行匹配,名称通常就是类名首字母小写。建议在使用时通过@Qualifier来显式指定要匹配的类名,而不适用变量名。
    • @Resource默认注入方式为 byName。如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType。 可以通过 name 属性来显式指定名称。

Spring AOP

🙎‍♂️面试官:说说自己对于AOP的了解?

🙋‍♂答:

Spring AOP 可以对某一个方法进行横向的拓展,能够将与业务无关的代码逻辑封装起来,有利于未来的可拓展性和可维护性。比如日志管理,统一异常处理都运用了AOP的思想。

举例:
项目中的统一记录日志,先将所有的Service下的方法都作为切入点。使用@Before注解,在进入切入点之前进行通知,也就是对方法进行了横向的扩展。这样就在每个service类中的方法调用前,都记录了日志。

🙎‍♂️面试官:Spring AOP 和 AspectJ AOP 有什么区别?

🙋‍♂答:

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

AspectJ是生态最完整的AOP框架,并且功能相比Spring AOP 很强大。

🙎‍♂️面试官:AspectJ 定义的通知类型有哪些?

🙋‍♂答:

Before(前置通知):目标对象的方法调用之前触发

After (后置通知):目标对象的方法调用之后触发

AfterReturning(返回通知):目标对象的方法调用完成,在返回结果值之后触发

AfterThrowing(异常通知) :目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。

Around (环绕通知):编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法

Spring MVC

🙎‍♂️面试官:说说自己对于Spring MVC的了解?

🙋‍♂答:

使用Spring MVC 与Spring框架集成,可以进行更加简单的Web层开发。其核心思想是通过将业务逻辑、数据进行分离来组织代码。

Spring MVC 下我们一般把后端项目分为 Service 层(处理业务)、Dao 层(数据库操作)、Entity 层(实体类)、Controller 层(控制层,返回数据给前台页面)。

MVC : Model(模型层)-View(视图层)- Controller(控制层) ,指的是一种设计模式。

🙎‍♂️面试官:Spring MVC 的核心组件?

🙋‍♂答:

DispatcherServlet核心的中央处理器,负责接收请求、分发,并给予客户端响应。

HandlerMapping处理器映射器,根据 uri 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。

HandlerAdapter处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler;

Handler(Controller)请求处理器,处理实际请求的处理器。

ViewResolver视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端。

🙎‍♂️面试官:Spring MVC 的工作流程?

🙋‍♂答:
在这里插入图片描述

  1. 该请求到达DispatcherServlet,它是Spring MVC框架的核心控制器。
  2. DispatcherServlet通过调用HandlerMapping 解析器来根据url来确定请求交给哪个处理器处理。找到处理器后,将请求和相应的上下文信息封装为HandlerExecutionChain 对象。
    • HandlerExecutionChain:请求处理器的执行链对象。Controller + Interceptor
  3. DispatcherServlet调用 HandlerAdapter ,会根据 HandlerExecutionChain ,适配执行对应的 Hanlder;
  4. Controller (处理器)完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet。
    • 这个对象中包含数据模型以及对应的视图信息。数据模型表示控制器向视图传递的数据,视图信息表示用于呈现响应的视图的名称或路径。
  5. ViewResolver(视图解析器)会根据逻辑上的View(逻辑视图) 查找到实际的View(物理视图)。
  6. DispatcherServlet会把返回的Model传给View进行视图渲染。
  7. 最后把View返回给浏览器。

如果需要,Spring 还会应用拦截器和过滤器来处理请求。拦截器可以在请求到达处理器之前或之后执行一些操作,过滤器可以在请求到达 DispatcherServlet 之前或之后执行一些操作。

比如:使用SpringSecurity Filter,过滤器可以在请求到达DispatcherServlet之前执行一些操作。可以进行一个权限的校验。

完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈谈你对JavaSE中compare、compareTo的使用与比较

1. 前言 在java当中,若是要进行比较,大家可能第一时间想到, 或是 !,这种数学上的比较符>、接下来,我就分别介绍并演示这两种实现方法。 需要的朋友可以参考下,这将又会是干货满满的一期,全程…

【复习笔记】FreeRTOS(一)

FreeRTOS在校期间自学过一段时间,然而出来工作却用不上。 最近在搞东西需要用到RTOS,特意把笔记整理一下,算是复习了。笔记整理主要来源于正点原子的开发文档、视频教程。 文章目录 一、FreeRTOS简介二、FreeTROS移植三、测试例程四、实验效果…

docker搭建简单elk日志系统7(日志查看)

docker搭建简单elk日志系统1 docker搭建简单elk日志系统2 docker搭建简单elk日志系统3 docker搭建简单elk日志系统4 docker搭建简单elk日志系统5 docker搭建简单elk日志系统6 如有疑问可以去上面文档找相关内容 1.登录kibana 2. 以logs-test-dev为例 匹配到logs-test-dev数…

加拿大鹅Q4营收增长超30%,后续如何拿下更多“信任票”?

羽绒服行业正处在一个大混战的时代。有的品牌依托强势单品出海逆袭;有的品牌通过狂追当下Z世代的喜好,推翻经典设计;也有品牌“放下架子”在工厂忙起了特惠直播。在赛道愈发拥挤的背景下,羽绒服行业正在经历“地位”洗牌。 目前&…

如何高效地在网上找开源项目

开源项目是发展技能、分享想法和成为开发社区一员的好方法。开源意味着软件功能背后的源代码与所有想要阅读它的人公开共享。这意味着你可以准确地看到一个系统是如何工作的——一旦你愿意冒险,就为它做出贡献。除了向所有人开放贡献外,这种开放代码库通…

jsp实训培训软件系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp实训培训软件系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用…

机器数、真值、原码、反码、补码

机器数 机器数是数字在计算机中的二进制表示形式。机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制。 机器数可以是带符号的,也可以是不带符号的。带符号的机器数用来表示正数、负数和零,而不带符号的机器数只能…

【C++】哈希应用:bitset和布隆过滤器

一、位图概念 一道面试题: 给定40亿个无序不重复的无符号整数。给一个无符号整数,如何快速判断一个数是否在这40亿个数中 遍历,时间复杂度 O ( N ) O(N) O(N)排序: O ( N l o g N ) O(NlogN) O(NlogN),利用二分查找: l o g N …

都说测试行业饱和了,为什么我们公司新招的的测试开了15K?

其实每年都有人说测试行业饱和了,但依旧有很多人找到了薪资不错的工作。来说说我的看法吧,我认为不用担心测试会饱和的问题,我们人口基数大,任何一个行业都有竞争,这是非常正常的情况。而且在有技术能力的人面前永远没…

VoxWeekly|The Sandbox 生态周报|2023.05.15

欢迎来到 The Sandbox 生态周报《VoxWeekly》!每周一发布,与你快速重温前一周整个生态系统中发生的大小事。 如果你们喜欢这些内容,记得 订阅我们的 Medium 并与家人及好友分享。关注我们的 Twitter 并加入 Discord ,以获得我们全…

安卓基础巩固(四):设计原则、安卓主流技术框架MVC/MVP/MVVM、设计模式

文章目录 架构设计为什么要进行技术框架的设计 六大设计原则一、单一职责原则二、开闭原则三、依赖倒置原则四、接口分离原则五、迪米特法则(又称最小知道原则)六、里氏替换原则案例诠释 安卓主流开发技术框架MVC模式MVP模式MVVMMVP模式详解 架构设计 为…

Java Springboot下redis用pipelining管道模式写入性能调优实例讲解

Springboot下redis写入pipelining管道模式性能调优实例 一、真实场景 生产真实项目过程中,需要将数据库的数据同步写入redis,此过程中遇到写入redis的瓶颈。每次启动项目都要将数据库数据重载到redis,这个过程耗费了大量的时间。 二、解决…

图片转字符图片工具类

├── cn.xsshome.imagetool //包名├── convert │ └── ImageToChar //图片转字符图片、文本方法 ├── slideverifycode │ └── SlideVerifyCodeGenerateUtil //滑块验证码工具类代…

多项式回归预测

目录 1、多项式回归 2、R-Squared 1、多项式回归 如果在实际中数据点显然不适合线性回归(穿过数据点之间的直线),那么多项式回归可能是理想的选择 像线性回归一样,多项式回归使用变量 x 和 y 之间的关系来找到绘制数据点线的最佳…

空气中的声压级、声功率级、声强级的区别

空气中的声压级、声功率级、的区别 在学习声学理论时,经常听到,声压级、声强级、声功率级的名称,经常也听到它们的单位为dB.但是它们是怎样的区别呢?下面介绍这几个名词 一、定义和计算 1.声压级 声压级以 L p {L_p} Lp​表示&am…

《Netty》从零开始学netty源码(六十一)之解码器

目录 解码器LineBasedFrameDecoderDelimiterBasedFrameDecoderFixedLengthFrameDecoderLengthFieldBasedFrameDecoder 解码器 在上一篇中介绍了Netty的解码器抽象类ByteToMessageDecoder,Netty也定义了一些常用的解码器,这些解码器都实现了ByteToMessag…

第一波IT去美国化的公司不是华为

第一波去美国化的不是华为,是BAT京东等 互联网类公司发起的工程叫:去IOE IBM小型机,ORACLE数据库,EMC存储 几年前已经完成了技术去美化 趣讲大白话:安全是底线 【趣讲信息科技174期】 **************************** 第…

hash在后端的应用

目录 散列表hash 函数种类: 布隆过滤器场景:构成原理应用分析选择 hash 函数问题:只用2GB内存在20亿个整数中找到出现次数最多的数完整代码: 分布式一致性 hashhash迁移hash 偏移虚拟节点 散列表 hash 函数 计算速度快 强随机分布…

Windows下搭建Tomcat HTTP服务,发布外网远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 转载自cpolar内网穿透的文章:外网访问本地Tomcat服务器【cpolar…

常见卫星图源下载教程

文章目录 一、引言二、在线地图源是简介三、常见地信软件如何浏览与下载图源?(1)QGIS(2)arcgis pro(3)arcgis 四、各个图源的具体下载方法(1)Google Earth1)qgis下载Google Earth2&a…