深入理解spring面经
1 了解SpringMVC的处理流程吗?
- 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet通过处理器映射器HandlerMapping找到对应的处理器。
- DispatcherServlet将请求提交给对应的处理器Controller。
- Controller处理完请求后返回ModelAndView。
- DispatcherServlet将ModelAndView传给视图解析器ViewResolver进行解析。
- 最终DispatcherServlet会响应用户请求,显示对应的视图。
1.1 1. jvm的本地方法栈是每一个线程私有的吗?
是的,每一个线程都有自己私有的Java虚拟机栈(Java Stack)和本地方法栈(Native Method Stack)。当线程被创建时,其栈也会随之创建。Java Stack主要用于存储Java方法的帧(Frame),而Native Method Stack用于支持Native方法的执行。
-
SpringMVC和Tomcat的关系是什么?
-
Tomcat: Tomcat是一个Web容器,或者说是一个Servlet容器,用于提供一个环境,在这个环境中,Java的Web应用程序(主要是Servlets、JSPs、Filters等)可以运行和服务HTTP请求。
-
SpringMVC: SpringMVC是Spring框架的一个模块,它实现了MVC(模型-视图-控制器)设计模式,用于构建Web应用程序。具体来说,它是一个用于Web应用的前端控制器(Front Controller)框架,可以处理HTTP请求,并基于开发者的配置决定哪一个Controller(处理器)处理哪一个请求。
关系:
- 当一个HTTP请求到达Tomcat时,Tomcat会根据配置决定哪一个Servlet来处理这个请求。如果这个Web应用是基于SpringMVC的,则这个请求通常会被发送到
DispatcherServlet
(SpringMVC的核心Servlet)。 DispatcherServlet
负责处理请求,并根据开发者在Spring配置中的定义,决定将这个请求分发到哪一个Controller方法来处理。- 所以简单来说,Tomcat为SpringMVC提供了运行环境,而SpringMVC在这个环境中管理和处理Web请求。
-
1.2 tomcat中使用的线程模型和这里的springMVC有什么关系?
-
Tomcat线程模型: Tomcat使用一个线程池来处理到达的HTTP请求。每当一个新的请求到达时,Tomcat从线程池中取一个线程来处理这个请求。这意味着并发的请求会被并发的线程处理。
-
关系: 当Tomcat中的线程处理一个到SpringMVC的请求时,这个线程进入SpringMVC的DispatcherServlet,然后再进一步被路由到相应的Controller。这意味着SpringMVC的Controller方法通常在Tomcat的请求处理线程中运行。因此,SpringMVC的执行模型和性能在很大程度上受到Tomcat线程模型的影响。
2 Java版本 1.7 1.8有哪些主要区别?
- Lambda表达式: Java 8引入了Lambda表达式,为Java增加了一种全新的编程方式。
- Stream API: Java 8添加了全新的Stream API来支持数据处理。
接口中的默认方法与静态方法: 在Java 8中,接口可以有方法实现,通过使用default关键字。 - 新的日期和时间API: Java 8引入了全新设计的日期时间API。
Optional 类: Java 8引入了Optional类,它是一个容器对象,可以保存null值。 - Nashorn JavaScript引擎: 在Java 8中,JVM获得了一个新的Nashorn JavaScript引擎,使得在JVM上运行JavaScript成为可能。
新的Collector: Java 8在Collectors类中引入了很多新的方法来支持高级聚合操作。 - Java 7的特性:如Switch-String、try-with-resources、diamond操作符、新的File API等,这些在Java 8中仍然存在,但上述列出的是Java 8相对于Java 7的新特性。
3 SpringAOP的原理了解吗?
Spring AOP (Aspect-Oriented Programming) 使用代理模式,主要使用两种方式实现:
-
JDK动态代理: 当目标类实现了某个接口时,Spring AOP使用JDK的动态代理来创建代理。这涉及到java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
-
CGLIB代理: 当目标类没有实现接口时,Spring AOP使用CGLIB库来创建基于类的代理。
在两种情况下,创建的代理都会拦截对目标对象方法的调用,允许我们在调用方法之前、之后或在产生异常时注入自定义逻辑,如日志、事务管理、安全检查等。
4 SpringAOP主要想解决什么问题?
Spring AOP旨在提供面向切面的编程能力,以解决以下问题:
-
横切关注点: 在多个模块或功能中都存在的常见功能(如日志、事务管理、安全检查等)被称为横切关注点。这些横切关注点常常与业务逻辑混杂在一起,导致代码重复和难以维护。
-
模块化: AOP允许我们将这些横切关注点模块化,并独立于业务逻辑。这样,我们可以集中管理这些关注点,并在需要时轻松修改或添加功能。
-
代码清晰、可维护: 通过将业务逻辑与横切关注点分离,我们可以使业务代码更加清晰、简洁和可维护。
总之,Spring AOP的目标是提供一种机制,使开发者可以将常见的、重复的功能(如日志、安全、事务等)与业务逻辑分开,从而提高代码的可维护性、可读性和重用性。
5 Spring bean和application的生命周期?
5.1 Spring Bean的生命周期:
- Bean定义从XML配置文件中读取,并实例化。
Spring对bean的属性进行依赖注入。 - 如果Bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法。
- 如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,传入BeanFactory。
- 如果Bean实现了ApplicationContextAware接口,setApplicationContext()方法会被调用,传入当前的ApplicationContext。
- 如果Bean实现了BeanPostProcessor接口,postProcessBeforeInitialization()方法会被调用。
- 如果Bean实现了InitializingBean接口,afterPropertiesSet()方法会被调用。
- 如果Bean在配置文件中使用init-method声明了初始化方法,该方法会被调用。
- 如果Bean实现了BeanPostProcessor接口,postProcessAfterInitialization()方法会被调用。
- Bean现在已经准备好,可以被应用程序使用了。
- 当容器关闭时,如果Bean实现了DisposableBean接口,destroy()方法会被调用。
- 如果Bean在配置文件中使用destroy-method声明了销毁方法,该方法会被调用。
5.2 Spring Application的生命周期:
- ApplicationContext被初始化/刷新。
- Bean实例化、配置和各种初始化方法的调用。
- ApplicationContext发布ContextRefreshedEvent事件。
- 当应用程序运行时,可以使用ApplicationContext和其中的Beans。
- 当ApplicationContext被关闭时,Beans可能会被销毁。
- ApplicationContext发布ContextClosedEvent事件。
6 MyBatis是一个流行的Java ORM框架,它使用了多种设计模式,其中包括:
- 工厂模式 (Factory Pattern): 使用SqlSessionFactory来创建SqlSession。
- 建造者模式 (Builder Pattern): 如XMLConfigBuilder和XMLMapperBuilder,用于构建和解析配置文件。
- 模板模式 (Template Pattern): MyBatis内部处理数据库操作的某些方法中使用此模式,它定义了操作的步骤,但推迟了一些步骤的具体实现。
- 代理模式 (Proxy Pattern): MyBatis使用JDK动态代理为Mapper接口创建代理对象,使得开发者可以直接通过接口调用数据库操作,而无需写实现。
- 单例模式 (Singleton Pattern): 如Configuration,在整个MyBatis会话中每一个bean通常只有一个实例。
- 组合模式 (Composite Pattern): 在配置文件中,可以有多个组合在一起。
7 volatile实现什么能力,怎么实现的?
8 Spring Boot的自动配置是基于以下几个核心概念:
-
@EnableAutoConfiguration: 这是Spring Boot自动配置的核心注解。当你在主类上添加@SpringBootApplication注解时,它其实包括了@EnableAutoConfiguration。该注解告诉Spring Boot根据添加的jar依赖自动配置项目。
-
spring.factories文件: 在Spring Boot的自动配置处理中,spring.factories文件扮演了核心角色。Spring Boot在启动时会扫描项目的classpath,找到所有包含spring.factories文件的jar包,然后读取该文件中的内容,找到并加载所有的自动配置类。
-
条件注解: 如@ConditionalOnClass, @ConditionalOnBean, @ConditionalOnMissingBean, @ConditionalOnProperty等。这些注解确保只有当特定条件满足时,某些配置或bean才会被创建。例如,如果classpath下有某个特定的类,或者Spring上下文中有/没有某个bean,或者一个配置属性有特定的值等。
整体流程简要如下:
- Spring Boot在启动时扫描classpath,找到包含spring.factories文件的jar包。
- 从spring.factories文件中获取到所有的自动配置类。
- 根据条件注解,决定哪些自动配置类会被加载或哪些bean会被创建。
- 如果需要,还可以通过application.properties或application.yml文件来调整默认配置。
相关文章:
深入理解spring面经
1 了解SpringMVC的处理流程吗? 用户发送请求至前端控制器DispatcherServlet。DispatcherServlet通过处理器映射器HandlerMapping找到对应的处理器。DispatcherServlet将请求提交给对应的处理器Controller。Controller处理完请求后返回ModelAndView。DispatcherServ…...

2023年,App运行小游戏,可以玩出什么创意?
疫情过后,一地鸡毛。游戏行业的日子也不好过。来看看移动游戏收入:2022年,移动游戏收入达到920亿美元,同比下降6.4%。这告诉我们,2022年对移动游戏市场来说是一个小挫折。 但不管是下挫还是上升,移动游戏市…...
景嘉微电子2021笔试题
笔试时间:2020.10.11。 岗位:嵌入式软件开发工程师。 题型:60分钟,45道题,时间紧任务重。 选择题25道,判断题12道,填空题5道,编程题3道。 长沙景嘉微电子,在长沙找嵌入式工作,景嘉微的薪资是top级别的。并且公司有很多开发平台,都可以去应聘试试。 选择题 1、求…...
selenium官网文档阅读总结(day 4)
1.selenium的工作原理 selenium的工作原理涉及以下主要组件和步骤: (1)WebDriver:这是selenium的核心组件,它是一个用于控制浏览器的API。WebDriver提供了许多方法,用于在浏览器中模拟用户操作。不同的浏览器需要相应…...

15.4 【Linux】可唤醒停机期间的工作任务
15.4.1 什么是 anacron anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。 其实 anacron 也是…...
[FPGA开发]解决正点原子Xilinx下载器无法下载、灯不亮的问题
问题描述 使用正点原子的Xilinx下载器下载时,电脑无法识别下载器,Vivado无法识别开发版。 问题解决 1.检查XIlinx下载器的灯是否亮起。 亮灯说明解决方法红灯亮起下载器可以连接到PC检查开发版是否供电正常蓝灯亮起下载器可以连接到PC,下…...

DP(区间DP)
石子合并 设有 N 堆石子排成一排,其编号为 1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆…...

MySQL5.7保姆级安装教程
环境 Linux版本Mysql版本(待安装)CentOS 75.7 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ 目前MySQL官网下载的MySQL源安装后yum下载的MySQL是8.0版本,为了非必要的麻烦,直接提供MySQL5.7的…...
Linux:getopts解析命令行选项和参数
一.背景 当自己编写多个shell脚本进行嵌套调用时,会涉及到传参数问题,此时可以通过getopts设置参数输入与变量赋值. 二.用法 当使用 getopts 命令来解析命令行选项和参数时,你需要在脚本中创建一个循环,循环中使用 getopts 命令来获取每个选项及其参数…...

c语言——三子棋
基本框架 三个文件: 其中.cpp文件用于游戏具体函数设计,.h文件为游戏的函数声明,test.cpp文件用于测试游戏运行。 需要用到的头文件: #include <stdio.h> #include <stdlib.h>//rand&srand #include <time.h>//时间相…...
Android 广播阻塞、延迟问题分析方法
一、问题 最近遇到一个问题,发送广播(普通广播)给另一个应用,但是广播需要要等约1min后才收到。 二、分析原因 原因是系统有个广播接收器在接收到广播后处理了接近50s,所以阻塞了后面的广播处理。如果大家也出现了广…...
HTML JS 解析器出sql 中 的所有表名称,支持多条SQL
<!DOCTYPE html> <html> <head><title>SQL表名提取器</title><script src"https://code.jquery.com/jquery-3.6.0.min.js"></script><script>function extractTableNames() {// 获取输入的SQL语句var sql document…...

【雕爷学编程】Arduino动手做(05)---热敏电阻模块之的基本参数、模块特色、电原理与使用说明
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...
MS31860T 国产 8通道串行接口低边驱动器 可PIN TO PIN替代DRV8860 高性价比
MS31860T 国产 8通道串行接口低边驱动器 可PIN TO PIN替代DRV8860 高性价比 产品简述 MS31860T 是一款 8 通道低边驱动器,包含 SPI 串口通信、 PWM斩波器配置、过流保护、短路保护、欠压锁定和过热关断功能,芯片可以读取每个通道的状态。MS31860T 可以…...
百度 amis 当成 UI 库用
百度 amis 当成 UI 库用 1.获取到这些 amis 对外提供的方法 var amisLib amisRequire(amis);// 获取到这些 amis 对外提供的方法。 2.js中使用百度amis中 confirm amisLib.confirm(amisLib 是否确认).then((confirmed) > {if (confirmed) {// 用户确认后执行的操作consol…...

质检工具(FindBugs、CheckStyle、Junit、Jmeter、Apifox)
1、Findbugs IDEA软件中可以装该插件,2018版本以前主要搜索FindBugs-IDEA 、2018版本以后主要搜索 SpotBugs。 1.1、FindBugs-IDEA安装及使用流程: 1.2、SpotBugs安装及使用流程: 2、Checkstyle IDEA软件中可以装该插件,所有版本的插件一致:CheckStyle 2.1、安装流程…...
MS31803TE 国产 四通道低边驱动器 PIN对PIN替代DRV8803
MS31803TE 国产 四通道低边驱动器 PIN对PIN替代DRV8803 产品简述 MS31803TE 是一个具有过流保护功能的 4 通道低边驱动器。MS31803TE 内置钳位二极管,用来钳制由电感负载续流产生的电压。MS31803TE 可以驱动单极步进电机、直流电机、继电器、螺线管或者其它负载。…...

wordpress数据表中标签和分类如何区分?
wordpress中标签和分类是什么关系怎么区分?最后有一个群的网友告诉了我文章ID和标签ID的关系是放在了wp_term_relationships表中,然后我百度了下这个表的结构和相关介绍,发现果然如此,先把文章保存起来: wp_term_rela…...

css3 实现文字横幅无缝滚动
css3 实现文字横幅无缝滚动 使用 css3 关键帧 keyframes 和 animation 属性实现文字横幅无缝滚动。 <template><div class"skiHallBanner"><div class"skiHallBanner-text"><span>{{ text }}</span></div></div>…...

unity 修改默认脚本
using System.Collections; using System.Collections.Generic; using UnityEngine; //***************************************** //创建人: xxxx //功能说明: //***************************************** #ROOTNAMESPACEBEGIN# public class #SCRI…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...

【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...