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 都有自己的组件库,但是并不兼容&#…...
vue + echarts 快速入门
vue echarts 快速入门 本案例即有nodejs和vue的基础,又在vue的基础上整合了echarts Nodejs基础 1、Node简介 1.1、为什么学习Nodejs(了解) 轻量级、高性能、可伸缩web服务器前后端JavaScript同构开发简洁高效的前端工程化 1.2、Nodejs能做什么(了解) Node 打破了…...
服务器几核几G几M是什么意思?如何选择?
服务器几核几G几M是什么意思?我们建站、搭建网络平台都要用到云服务器,不管在腾讯云、阿里云还是别的云服务平台选购,都会接触到服务器配置。云服务器就是把物理服务器(俗称“母鸡”),用虚拟机技术虚拟出多…...
K8S服务发布
一 、服务发布方式对比 二者主要区别在于: 1、部署复杂性:传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等,过程相对复 杂且容易出错。相比之下,Kubernetes服务发布方式 通过使用容器编排和自动化部署工…...
Allen Institute for Artificial Intelligence (Ai2) 发布开源多模态语言模型 Molmo
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Html CSS 布局,位置处理 居中 对齐
Html CSS 布局,位置处理 1、居中布局 1、div 让内部div居中对齐 html <div class"container"><div class"item">I am centered!</div> </div>style .container {border: 2px solid rgb(75, 70, 74);border-radius:…...
Spring MVC系统学习(二)——Spring MVC的核心类和注解
Spring MVC(Model-View-Controller)是Spring框架的一个模块,用于构建基于Web的应用程序。它使用模型、视图和控制器分离的设计模式,使得Web开发更加模块化和灵活。在学习Spring MVC时,有几个核心类和注解是非常关键的&…...
conda虚拟环境安装包、依赖同一管理
在 Python 的虚拟环境中,每个环境都是独立的,这意味着即使两个环境需要相同的库,它们也会分别安装各自的副本。这样做是为了避免不同项目之间相互影响,确保每个项目都有一个干净且隔离的环境。 方法一:使用 Conda 的共…...
Unity网络开发记录(四):在unity中进一步封装客户端类
在上一篇文章中,简单的封装了一下服务端中相关的socket对象,为了可以更方便的使用。所以在本篇中,进一步封装一下在unity中的相关客户端类 封装客户端类,首先采用单例模式,然后采用两个队列来存储我们相关的收发信息 p…...
Linux内核中的UART驱动-详解Linux内核UART驱动:结构与功能分析
一、UART概述 UART(Universal Asynchronous Receiver/Transmitter),即通用异步收发器,是一种串行通信接口,用于在计算机和外部设备之间传输数据。它特别适用于短距离、低速、串行和全双工的数据传输。在Linux内核中&a…...
威胁检测与防范:如何及时、准确对抗安全风险
随着技术的飞速发展,网络空间中的威胁日益多样化、隐蔽化,给个人、企业乃至国家的信息安全带来诸多挑战。面对严峻的网络威胁,传统的防火墙、入侵检测系统(IDS)等防御手段虽能在一定程度上抵御外部攻击,但依…...
免费空间网站怎么做的/网络营销策划内容
1、效果图: 2、在项目utils目录下创建index.js 然后创建如下拷贝方法 export function copyText(copytext) {const text document.createElement(input); // 创建节点text.setAttribute(readonly, readonly);text.value copytext; // 赋值document.body.appendCh…...
四川高速公路建设集团网站/电商网站订烟
springspringMVCMybatis整合_XML配置示例 1.概述 springspringMVCMybatis整合 XML配置方式 1.1 测试环境说明 名称版本备注操作系统windows 10 专业版 1809_X64 JDKjdk1.8.0_121 WIN_X64 数据库mysql5.7 WIN_X64 web服务器Tomcat8.5 WIN_X64 2.入门示例 2.1示例流程简述 第…...
如何编辑做网站/西安优化seo托管
我必须创建字体为Times New Roman、字体大小为16的内容。如何使用python脚本创建? 我的示例脚本import xlwt workbook xlwt.Workbook(encoding ascii) worksheet workbook.add_sheet(My Worksheet) font xlwt.Font() # Create the Font font.name Times New Ro…...
php网站做多久/游戏推广合作
ANSA、META的二次开发均基于Python开发。本文基于ANSA的帮助文档《Introduction to Python》进行一定的扩展,希望能帮助大家快速掌握这门语言。首先来介绍下这门语言里的主要数据类型,包括:整型、浮点型、复数、布尔类型、字符串、列表、元祖…...
可以玩h5的网站/品牌营销策划怎么写
题库来源:安全生产模拟考试一点通公众号小程序 2021年低压电工考试及低压电工免费试题,包含低压电工考试答案和解析及低压电工免费试题练习。由安全生产模拟考试一点通公众号结合国家低压电工考试最新大纲及低压电工考试真题汇总,有助于低压…...
网站安装教程/怎么优化自己网站的关键词
原贴地址:http://bbs.51js.com/viewthread.php?tid65118 1、一行代码 “偷取所有图片” 试一下下面这行代码能取出所有图片,哈很好玩吧? javascript:adocument.body.getElementsByTagName("img");var b"";for(i0;i<…...