Java面试经验总结之SSM框架+springboot
一、spring
1.Spring 是什么?
答:spring 是一个轻量级的容器框架, ioc 和 aop 是他的核心。spring 将传统的代码以来形式,变为从容器中获取,提高了开发效率,非常的方便。spring 衍生出了很多生态,比如,spring-jdbc,springboot 等等。
2.解释一下 Spring 的 ioc 控制反转?
答:控制反转通过将对象的创建和依赖关系的管理交给Spring IoC容器,极大地提高了代码的模块化和可维护性。IoC的主要实现方式是依赖注入,其中通过构造函数注入、Setter方法注入和字段注入等形式来注入,这样 Spring容器能够自动管理对象的依赖关系,使得应用程序代码更加简洁。
3.bean 的作用范围和生命周期?
答 :bean 的作用范围主要用 singleton,prototype,request,session,globalsession,application。常用的就是 singleton,singleton 是单例的,当 bean 是无状态的时候,singleton 是最好的使用方式,如果说 bean 里面涉及共享数据,singleton 就不够安全了,这个时候需要使用 prototype。bean 的生命周期从实例化创建 bean 开始,然后进行属性设置。再之后,调用 bean 的一些初始化方法,如果有则执行,这样处理完之后,bean 就可以被使用了。最终当 bean 要被销毁的时候,就会调用 destroy 方法进行 bean 的后置处理,以上。
4.Spring循环依赖问题是什么?
答:Spring循环依赖问题是指在Spring容器中,两个或多个Bean之间存在直接的或间接的依赖关系,导致在创建和初始化这些Bean时形成了一个闭环,使得无法正确地创建和初始化这些Bean。主要有两种形式,一种是构造器循环依赖,一种是 setter 方式的循环依赖。构造器循环依赖主要是 Bean A的构造器需要Bean B作为参数,而Bean B的构造器又需要Bean A作为参数。由于构造器是在Bean实例化时调用的,所以Spring容器无法先创建其中一个Bean,因为这样会导致另一个Bean无法实例化,从而形成死循环。setter 循环依赖发生在Bean的setter注入方法中。与构造器循环依赖不同,setter注入是在Bean实例化之后进行的。如果循环依赖关系复杂或配置不当,也可能导致Spring容器无法正确初始化Bean。Spring容器采用了三级缓存机制来处理setter注入的循环依赖。
5. 三级缓存是如何解决循环依赖的
其中一级缓存用于存储完全初始化好的单例 Bean,二级缓存用于存储早期暴露的 Bean 实例,部分初始化的 Bean。三级缓存用于存储 Bean 工厂,主要用于创建 Bean 的代理对象。假设现在有两个对象 A 依赖 B,B 依赖 A。那么在A创建过程中发现需要属性 B,查找发现 B 还没有在一级缓存中,于是先将 A 放到三级缓存中,此时的 A 不完整,没有属性,但是可以引用。接下来就去实例化B。B 开始创建,此时发现需要A,于是B先查一级缓存寻找A,如果没有,再查二级缓存,如果还没有,再查三级缓存,找到了A,然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A。B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中的状态)。然后回来接着创建A,此时B已经创建结束,可以直接从一级缓存里面拿到B,这样 A 就完成了创建,并将A放到一级缓存。
6.spring的常用注解
比较常用的就是Component,将类放到容器管理,autowired,resource,来装配 bean。还有就是 configuration 和 bean 进行配合,装载 bean 进入容器。以及一些扩展的注解比如 aop 的 aspect 切面,事务相关的 transsactional。
二、Spring MVC
1.SpringMVC的原理及执行流程?
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,它大量使用了Spring框架中提供的设计模式。Spring MVC框架的核心组件包括:
- DispatcherServlet:前端控制器,负责接收请求并根据映射关系调用相应的控制器。
- HandlerMapping:负责根据请求的URL到HandlerMapping中找到映射的处理器(Controller)。
- HandlerAdapter:负责根据处理器,生成处理器适配器,通过适配器调用实际的处理器。
- Controller:处理器,执行相应的业务逻辑操作,并返回ModelAndView对象。
- ModelAndView:包含了视图逻辑名和模型数据的对象,是连接控制器和视图的桥梁。
- ViewResolver:负责解析视图名到具体视图实现类的映射,根据视图名称找到对应的视图实现类。
- View:视图,负责渲染数据并展示给用户。
2.什么是 Spring MVC 的 REST 支持?
答:pring MVC的REST支持是指Spring MVC框架提供的一系列特性和工具,用于简化构建RESTful Web服务的过程。REST(Representational State Transfer)是一种架构风格,用于设计网络应用程序,特别是Web应用程序。它基于HTTP协议,使用标准的HTTP方法(如GET、POST、PUT、DELETE)来操作资源。
3.如何在 Spring MVC 中处理 JSON 数据?
答:使用@requestbody 注解反序列化前端传来的json数据。
4.什么是 @RestController 注解?
答:@RestController注解是@ResponsBody和@Controller注解的结合体;
三、MyBatis
1.什么是mybatis框架?
答:mybatis 是一个持久层框架,帮助我们操作数据库,相比于传统的 jdbc ,使用 myabtis 非常的方便,以前繁琐的配置细节,都被内部进行了封装。处理起来非常的方便。使用 mybatis 只要定义一个接口,同时定一个 xml 文件,在 xml 中写实际的 sql 就可以实现对数据库的查询,提供了动态 sql,属性映射,缓存支持,插件等特性。
2.MyBatis的Xml映射文件中,都有哪些常见标签?
答:好的,面试官,常见的有 mapper,select,resultmap,if,sql 等等标签,像 mapper 标签是 xml 中的根部,有了它才能够和接口进行映射。select,insert 这些定义了这个 sql 行为到底是查询还是插入。当我们把查询出的数据要映射到实体的时候,可以封装一个 map,这样我们不用每个字段都写 as,只需要用 resultmap,就可以自动帮我们进行属性映射。当想要判断一些条件来决定是否拼接 sql 的时候,可以使用 if。最后就是公共的 sql,比如 select 后面的一堆属性,可以放在 sql 标签内
3.如何避免 sql 注入?
好的,面试官。sql 注入是一个非常难搞的问题。如果不加以防范就会对我们的系统造成危险。mybatis 避免 sql 注入的方式,有几层。首先就是 myabtis 采取了预编译的 sql 语句,预编译的 sql 语句是参数化查询,不是直接拼接,这种就会导致攻击者的输入并不会当作 sql 执行,这是一种防御机制。另一种就是我们在开发的过程中,要保证在拼接的时候,使用#占位符。#不会直接拼接,可以安全的传递,然而如果使用$就会导致直接拼接,这样会造成 sql 注入问题,不过有些需求确实是动态的 sql 处理,要动态传入表名,动态传入字段等等。这种情况也就只能使用$进行了。以上。
4.mybatis中的一级缓存和二级缓存的区别
MyBatis 的二级缓存是一个跨会话(Session)级别的缓存机制,用于减少数据库访问次数,提高应用程序性能。它与一级缓存的主要区别在于其作用范围和持久性。
| 一级缓存 | 二级缓存 | |
| 作用范围 | 一级缓存是会话级别的缓存,作用范围仅限于同一个SqlSession。 | 二级缓存是跨会话级别的缓存,作用范围是整个SqlSessionFactory。不同的SqlSession实例可以共享二级缓存。 |
| 生命周期 | 一级缓存的生命周期与SqlSession一致。当SqlSession关闭时,一级缓存也会被清空。 | 二级缓存的生命周期与SqlSessionFactory一致,通常在应用程序运行期间一直存在。 |
| 开启方式 | 一级缓存默认是开启的,无需额外配置。 | 二级缓存需要在 MyBatis 配置文件中显式开启,并且可以配置不同的缓存提供者(如 Ehcache、Hazelcast 等)。 |
四、SpringBoot
1.什么是SpringBoot
答:Spring Boot 是由 Pivotal 团队提供的一个基于 Spring 框架的项目,它旨在简化 Spring 应用的开发和部署。Spring Boot 通过提供一系列的约定和开箱即用的功能,使得开发者可以更快地构建独立的、生产级的 Spring 应用程序,而无需进行繁琐的配置。
2.SpringBoot如何固定版本
spring-boot-starter-parent
使用spring-boot-starter-parent是最常见的方法之一。它不仅提供了一组默认的依赖版本,还包括了一些有用的插件配置。你可以在pom.xml中指定 Spring Boot 的版本:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.5</version> <!-- 这里指定了Spring Boot的版本 --><relativePath/> <!-- lookup parent from repository -->
</parent>
这样,所有 Spring Boot 相关的依赖都会使用这个版本中定义的版本号。
使用dependencyManagement
如果你不想使用spring-boot-starter-parent作为父 POM,或者你的项目已经有了其他的父 POM,你可以使用dependencyManagement来管理依赖版本。这样可以手动指定各个依赖的版本:
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.5</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
然后在你的dependencies部分添加具体的依赖时,不需要再指定版本号:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 其他依赖 -->
</dependencies>
3.SpringBoot自动配置原理
答:Spring Boot 的自动配置,能够根据项目中的依赖和配置自动地为你配置 Spring 应用程序,而无需手动编写大量的配置代码。这个特性极大地简化了 Spring 应用程序的开发过程。
4.SpringBoot配置文件注入
使用@Value注解注入配置
@Value注解可以直接将配置文件中的值注入到 Spring Bean 的字段中。
app.name=MyApp
app.version=1.0.0
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class AppConfig {@Value("${app.name}")private String appName;@Value("${app.version}")private String appVersion;// Getters and setterspublic String getAppName() {return appName;}public String getAppVersion() {return appVersion;}
}
使用@ConfigurationProperties注解注入配置
@ConfigurationProperties注解可以将配置文件中的属性映射到一个 Java Bean 中。通常与@EnableConfigurationProperties注解配合使用。
app:name: MyAppversion: 1.0.0
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {private String name;private String version;// Getters and setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public String getVersion() {return version;}public void setVersion(String version) {this.version = version;}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
使用Environment接口获取配置
Spring 的Environment接口可以用来访问配置文件中的属性。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;@Component
public class AppConfig {@Autowiredprivate Environment env;public String getAppName() {return env.getProperty("app.name");}public String getAppVersion() {return env.getProperty("app.version");}
}
使用@PropertySource注解加载外部配置文件
如果需要加载外部的配置文件,可以使用@PropertySource注解。
external.property=value
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.beans.factory.annotation.Value;@Configuration
@PropertySource("classpath:external.properties")
public class ExternalConfig {@Value("${external.property}")private String externalProperty;// Getterpublic String getExternalProperty() {return externalProperty;}
}
5.SpringBoot日志关系
答:Spring Boot 中的日志系统是基于 SLF4J(Simple Logging Facade for Java)和 Logback 的组合。SLF4J 提供了一个简单的日志记录 API,而 Logback 是一个强大的日志实现。
相关文章:
Java面试经验总结之SSM框架+springboot
一、spring 1.Spring 是什么? 答:spring 是一个轻量级的容器框架, ioc 和 aop 是他的核心。spring 将传统的代码以来形式,变为从容器中获取,提高了开发效率,非常的方便。spring 衍生出了很多生态&#x…...
Unity 热更新(HybridCLR+Addressable)-设置打包路径和加载路径、打开Hosting服务、打包
四、设置打包和加载路径 五、打开Hosting服务 六、打包 打包完成后路径在Assets同级目录下的ServerData 但是目前没有资源文件对比 修改上面设置后再次打包 里面多了哈希和JSON文件,这俩个就是用于资源对比...
享元(轻量级)模式
简介 享元模式(Flyweight Pattern)又叫作轻量级模式,是对象池的一种实现。类似线程池,线程池可以避免不停地创建和销毁多个对象,消耗性能。享元模式提供了减少对象数量从而改善应用所需的对象结构的方式。其宗旨是共享…...
基于php的幸运舞蹈课程工作室管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...
NLP任务的详细原理与步骤的详细讲解
1. 文本分类 原理: 特征提取:文本分类首先将文本转化为数值特征,常用方法包括词袋模型、TF-IDF、Word Embeddings(如Word2Vec、GloVe)和BERT等预训练模型。模型训练:模型(如SVM、神经网络&…...
Kotlin 处理字符串和正则表达式(二十一)
导读大纲 1.1 处理字符串和正则表达式1.1.1 分割字符串1.1.2 正则表达式和三引号字符串1.1.3 多行三引号字符串IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示 1.1 处理字符串和正则表达式 Kotlin 字符串与 Java 字符串完全相同 可以将 Kotlin 代码中创建…...
一站式大语言模型API调用:快速上手教程
智匠MindCraft是一个强大的AI工具及开发平台,支持多种大语言模型和多模态AI模型。本文将详细介绍如何通过API调用智匠MindCraft中的大语言模型,帮助开发者快速上手。 注册与登录 访问智匠MindCraft官网,注册并登录账号。 进入开发者平台&…...
【TabBar嵌套Navigation案例-新特性页面-代码位置 Objective-C语言】
一、接下来,我们来说这个新特性页面 1.首先,看一下我们的示例程序,这里改一下,加一个叹号, command + R, 好,首先啊,这里边有一个新特性页面,当我这个程序是第一次安装、第一次运行、还有呢、就是当这个应用程序更新的时候,我应该去加载这个新特性页面, 然后呢,这…...
程序员如何提升并保持核心竞争力?——深入钻研、广泛学习与软技能的培养
一、引言 随着人工智能的不断发展,尤其是AIGC系列大语言模型的涌现,AI辅助编程工具正在日益普及,这对程序员的工作方式产生了深刻的影响。面对这一变革,程序员应如何应对?是专注于某个领域深耕细作,还是…...
Linux之Docker虚拟化部署
上传docker安装包 解压安装包 将解压后的docker文件夹移动到/usr/local/文件夹下 docker 启动命令/usr/local/docker/dockerd 但是启动报错,意思是没有docker用户组 创建docker用户组,执行完会生成套接字文件 将套接字文件加入该用户组管理 第二个错误原…...
重构部队信息安全:部队涉密载体建设新策略
一、完善保密体系架构 1. 加强保密规章制度:制定或刷新关于机密信息管理的相关规定,明确机密信息的生成、复制、传输、使用、储存及销毁等核心环节的操作准则与责任分配,确保整个流程的标准化运作。 2. 明确个人保密义务:通过保密…...
使用Node.js的readline模块逐行读取并解析大文件
在Node.js环境中处理大文件是一个常见的需求,尤其是在处理日志文件、数据库导出、或任何形式的大规模文本数据时。由于Node.js是基于事件循环和非阻塞I/O的,它非常适合处理这类任务。然而,直接将整个文件内容加载到内存中可能会导致内存溢出&…...
浅谈软件安全开发的重要性及安全开发实践
在当今数字化时代,软件已成为企业运营的核心驱动力。然而,随着网络环境的日益复杂和黑客技术的不断演进,软件安全问题日益凸显,成为企业不可忽视的重大挑战。本文将从法律法规要求、企业核心数据资产保护、企业信誉等角度…...
在 NodeJs 里面如何获取 APK 的名称和 icon
最近想用 electron 写一个 adb 的可视化客户端,在展示安装的应用时遇到了如何获取 APK 的名称和 icon 的问题。下面就是一些解决问题的思路。 前提:在这里默认大家已经下载好 apk, 下面 localApkPath 就是你下载好的 apk 的路径。 小提示,示…...
基于VirtualBox和Ubuntu的虚拟环境搭建
VirtualBox简介 VirtualBox 是一款开源虚拟机软件。 是由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。简单易用,可虚拟的系统包括Windows&…...
【PHP源码】匿名来信系统H5版本V1.0免费开源
你的匿名来信H5一封你的来信源码/表白祝福短信程序/往来信/传话短信源码支持邮件发信与手机短信发信“你的匿名来信”是最近某音上爆火的一个活动话题,可以通过H5网站,编辑自己想要对某人说的话或者祝福,网站会把您想说的发给您预留的号码&am…...
Prompt技巧总结和示例分享
"Prompt"(提示)在人工智能中通常指的是输入给模型的文本,用于引导模型生成预期的输出。在使用人工智能助手时,有效的提示技巧可以帮助你获得更准确和有用的回答。 以下是一些单轮对话提示时的技巧: 明确具体…...
大厂校招:海能达嵌入式面试题及参考答案
SPI 协议的一些基础知识 SPI(Serial Peripheral Interface)即串行外设接口,是一种高速的、全双工、同步的通信总线。 SPI 主要由四根信号线组成: 时钟线(SCLK):由主设备产生,用于同步数据传输。时钟的频率决定了数据传输的速度。主设备输出 / 从设备输入线(MOSI):主…...
wrk(1) command
文章目录 1.简介2.特点3.格式4.选项5.示例参考文献 1.简介 wrk 是一个现代的 HTTP 压力测试工具,利用现代多线程技术和高效的网络 I/O 处理,能够生成大量的并发请求,用以测试 HTTP 服务器的性能。 它是作为一种更现代的压力测试工具而设计的…...
【小程序 - 大智慧】Expareser 组件渲染框架
目录 问题思考课程目标Web Component类型说明定义组件属性添加 Shadow DOMTemplate and SlotExparser 框架原理自定义组件内置组件 下周计划 问题思考 首先,给大家抛出去几个问题: 前端框架 Vue React 都有自己的组件库,但是并不兼容&#…...
初次使用Taotoken平台从注册到完成API调用的全程指引
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次使用Taotoken平台从注册到完成API调用的全程指引 对于初次接触大模型API的开发者而言,从注册平台到成功发出第一个…...
文心一言深度解析:国产多模态大模型的破局之路
文心一言深度解析:国产多模态大模型的破局之路 引言 在ChatGPT引爆全球AI热潮的背景下,国产大模型如何突围?百度推出的文心一言(ERNIE Bot)作为中国AI产业的一面旗帜,凭借其在多模态理解与生成、中文场景深…...
实测Taotoken平台API调用稳定性与延迟体感观察记录
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 实测Taotoken平台API调用稳定性与延迟体感观察记录 在将大模型能力集成到生产应用时,服务的稳定性和响应延迟是开发者关…...
uHabits习惯追踪应用完整指南:从入门到精通的5个实用技巧
uHabits习惯追踪应用完整指南:从入门到精通的5个实用技巧 【免费下载链接】uhabits Loop Habit Tracker, a mobile app for creating and maintaining long-term positive habits 项目地址: https://gitcode.com/gh_mirrors/uh/uhabits uHabits习惯追踪应用是…...
构建毫秒级实时传输系统:基于flv.js的低延迟架构优化方案
构建毫秒级实时传输系统:基于flv.js的低延迟架构优化方案 【免费下载链接】flv.js HTML5 FLV Player 项目地址: https://gitcode.com/gh_mirrors/fl/flv.js flv.js作为HTML5 FLV播放器的核心技术方案,通过Media Source Extensions实现浏览器端FLV…...
前端实战:用HTML/CSS/JS打造交互式生日蛋糕网页应用
1. 项目概述:一个用代码烘焙的生日惊喜最近给朋友准备生日礼物,不想再走寻常路,琢磨着送点特别的。作为一个整天和代码打交道的人,我决定用最熟悉的工具——HTML、CSS和JavaScript——亲手“烘焙”一个数字生日蛋糕。这个项目“Re…...
当AI学会“看”画质:用Python和PyTorch动手实现一个无参考图像质量评估模型
用Python和PyTorch构建无参考图像质量评估模型:从理论到实践 在数字图像爆炸式增长的时代,图像质量评估(IQA)技术正成为计算机视觉领域不可或缺的一环。无论是社交媒体平台的内容审核、医疗影像的自动分析,还是监控系统的实时画面处理&#x…...
免费公式识别神器:img2latex-mathpix本地部署完全指南
免费公式识别神器:img2latex-mathpix本地部署完全指南 【免费下载链接】img2latex-mathpix Mathpix has changed their billing policy and no longer has free monthly API requests. This repo is now archived and will not receive any updates for the foresee…...
STM32CubeMX外部中断实战:从按键消抖到LED状态切换
1. STM32CubeMX外部中断基础配置 第一次用STM32CubeMX配置外部中断时,我盯着那一堆选项有点懵。后来发现其实只要抓住几个关键点,整个过程就像搭积木一样简单。这里以最常见的按键控制LED为例,带你一步步实现这个功能。 首先打开CubeMX新建…...
AI原生图计算应用落地全景图(SITS 2026权威白皮书核心精要)
更多请点击: https://intelliparadigm.com 第一章:AI原生图计算应用:SITS 2026图神经网络工程化方案 SITS 2026 是面向大规模动态图场景的AI原生图计算框架,深度融合GNN训练、图拓扑实时更新与边缘-云协同推理能力。其核心设计摒…...
