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

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之前执行一些操作。可以进行一个权限的校验。

完。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能值不值得学习?人工智能就业方向及前景

人工智能值不值得学习? 一、人工智能值得学吗? 很多同学想要知道人工智能值得学吗?小编认为是值得的,具体原因有以下两点: 1、人工智能专业前景好,但人才紧缺 根据人工智能行业的专家预计,到2020年&am…

探索【Stable-Diffusion WEBUI】的图片超分辨插件:StableSR

文章目录 (零)前言(一)图片放大(二)图片超分辨率放大脚本插件(StableSR)(2.1)下载组件(2.2)使用(2.3)实例对比…

网上学影视后期靠谱吗 影视后期剪辑需要学什么

影视后期如果有人手把手当面教的话,当然是最好的。但很多人都没有这么好的条件,实际上,网上也有很多教程可以学习利用。不过,小伙伴们可能会有疑问,网上学影视后期靠谱吗,影视后期剪辑需要学什么&#xff1…

Java API 基础

Java API 基础 一、相关知识学习 Java程序员在开发Java程序时,只需要安装有JDK,就可以在程序中使用import关键字导入Java API 中指定的包并在自己的程序中使用这些包中定义的各种类和接口。 1、 Java API 包 Java API 包 说明 java.accessibility 接…

【服务器】支付宝SDK接口调试

​ 文章目录 1.测试环境2.本地配置3. 内网穿透3.1 下载安装cpolar内网穿透3.2 创建隧道 4. 测试公网访问5. 配置固定二级子域名5.1 保留一个二级子域名5.2 配置二级子域名 6. 使用固定二级子域名进行访问 转发自cpolar内网穿透的文章:Java支付宝沙箱环境支付&#…

物联网通信协议-MQTT及使用python实现

MQTT概念及其原理 简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量 级"通讯协议,该协议构建于TCP/IP协议上,由IBM在…

御剑WEB指纹识别系统教程,图文教程(超详细)

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 御剑WEB指纹识别 一、基本使用二、内置字典三、自定义字典四、扫描原理 御剑WEB指纹识别系…

基于DDSRF正负序分离方法的不平衡电网PQ控制策略_平衡电流控制

0.前言 对于并网逆变器而言,电网会存在不平衡的情况。在这种情况下,不平衡的电网电压可以分解成为正序、负序和零序分量。并网逆变器通常期望能够实现单位功率因数并网,向电网注入对称的正弦电流,所以此时的微电网逆变器控制策略显…

rollup打包react组件

这次主要简单实现用rollup打包react组件,组件的话简单写了一个弹窗组件,效果如下: 点击打开弹框,点击关闭按钮关闭弹框 首先创建react项目,这边还是用mfex-project脚手架创建 mfex-project create react-demo 然后编…

财务共享领先实践,看看他们是怎么做的

随着信息技术的快速发展,由于创新商业模式的出现,金融结构、操作策略和流程正在发生变化。大数据、云计算、人工智能、机器人流程自动化(RPA)等新兴技术正在应用于金融及财务领域,以优化财务管理流程并提高运营效率。财…

信号完整性分析基础知识之传输线和反射(七):带负载传输线、感性不连续引起的反射

带负载传输线 如果在传输线上有一个小的容性负载,信号会出现失真,上升时间也会降低。每个分立电容都会降低信号在其附近看到的阻抗。如果传输线上分布有多个容性负载(例如一个总线上每隔1.2inch有一个2pF的连接器残桩,或者一个内…

学习【菜鸟教程】【C++ 类 对象】【C++ 类的静态成员】

链接 1. 教程 可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时…

windows环境下安装RabbitMQ(超详细),

windows环境下安装RabbitMQ(超详细) 注:安装路径,用户名均为英文 一、RabbitMq简介 1.1消息队列中间件简介 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题…

Python中模块的使用3

在运行Python程序时,总会用到Python的标准库模块。一些标准库模块被内嵌到Python解释器中,通过调用这些模块提供的函数,可以实现特殊的功能。sys模块就是Python的一个标准库模块,该模块被被内嵌到Python解释器中。 1 sys模块的导…

SpringCloud 性能优化

文章目录 Springcloud的性能问题应用服务组件调优Servlet 容器 优化Feign 配置优化 Gateway组件调优Zuul配置 优化hystrix配置 优化ribbon 优化 Springcloud的性能问题 Springcloud 原始的配置,性能是很低的,大家可以使用Jmeter测试一下,QPS…

深度学习编译器

1.为什么需要深度学习编译器 深度学习编译器主要为解决不同框架下训练的模型部署到指定的某些设备上时所遇到的一系列复杂的问题,即将各种深度学习训练框架的模型部署到各种硬件所面临的问题; 首先深度学习领域,从训练框架看,当前…

考研C语言第四章

4.1 关系表达式与逻辑表达式 ps&#xff1a; 算术运算符&#xff1a;加减乘除等 关系运算符&#xff1a;比大小的 逻辑与逻辑或 非&#xff01;的运算级别&#xff08;应该&#xff09;最高 4.2 if-else #include <stdio.h> //上课这个写while的原因是方便一次一次…

springWEB搭建

概述 SpringWEB就是spring框架里得一个模块* SpringWeb的前身是SpringMVC springMVC介绍 在之前的后端三大架构: Controller: 控制层, 包含了servlet, 对数据的接收, 处理, 响应 Model: 数据模型, dao, model VIew: 视图, jsp, 用于将数据添加到html中进行响应 工作流程: 主要…

Java:mybatis-plus-generator-ui 基于Mybatis-Plus的代码自助生成器

引用官方文档上的简介&#xff1a; 提供交互式的Web UI用于生成兼容mybatis-plus框架的相关功能代码&#xff0c;包括Entity,Mapper,Mapper.xml,Service,Controller等 &#xff0c;可以自定义模板以及各类输出参数&#xff0c;也可通过SQL查询语句直接生成代码。 文档 githu…

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

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